使用perl查找中位数,模式,标准偏差?

前端之家收集整理的这篇文章主要介绍了使用perl查找中位数,模式,标准偏差?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个数字的数组.计算数据集的中位数,模式和标准开发的最简单方法是什么?

解决方法

  1. #!/usr/bin/perl
  2. #
  3. # stdev - figure N,min,max,median,mode,mean,& std deviation
  4. #
  5. # pull out all the real numbers in the input
  6. # stream and run standard calculations on them.
  7. # they may be intermixed with other test,need
  8. # not be on the same or different lines,and
  9. # can be in scientific notion (avagadro=6.02e23).
  10. # they also admit a leading + or -.
  11. #
  12. # Tom Christiansen
  13. # tchrist@perl.com
  14.  
  15. use strict;
  16. use warnings;
  17.  
  18. use List::Util qw< min max >;
  19.  
  20. sub by_number {
  21. if ($a < $b){ -1 } elsif ($a > $b) { 1 } else { 0 }
  22. }
  23.  
  24.  
  25. #
  26. my $number_rx = qr{
  27.  
  28. # leading sign,positive or negative
  29. (?: [+-] ? )
  30.  
  31. # mantissa
  32. (?= [0123456789.] )
  33. (?:
  34. # "N" or "N." or "N.N"
  35. (?:
  36. (?: [0123456789] + )
  37. (?:
  38. (?: [.] )
  39. (?: [0123456789] * )
  40. ) ?
  41. |
  42. # ".N",no leading digits
  43. (?:
  44. (?: [.] )
  45. (?: [0123456789] + )
  46. )
  47. )
  48. )
  49.  
  50. # abscissa
  51. (?:
  52. (?: [Ee] )
  53. (?:
  54. (?: [+-] ? )
  55. (?: [0123456789] + )
  56. )
  57. |
  58. )
  59. }x;
  60.  
  61. my $n = 0;
  62. my $sum = 0;
  63. my @values = ();
  64.  
  65. my %seen = ();
  66.  
  67. while (<>) {
  68. while (/($number_rx)/g) {
  69. $n++;
  70. my $num = 0 + $1; # 0+ is so numbers in alternate form count as same
  71. $sum += $num;
  72. push @values,$num;
  73. $seen{$num}++;
  74. }
  75. }
  76.  
  77. die "no values" if $n == 0;
  78.  
  79. my $mean = $sum / $n;
  80.  
  81. my $sqsum = 0;
  82. for (@values) {
  83. $sqsum += ( $_ ** 2 );
  84. }
  85. $sqsum /= $n;
  86. $sqsum -= ( $mean ** 2 );
  87. my $stdev = sqrt($sqsum);
  88.  
  89. my $max_seen_count = max values %seen;
  90. my @modes = grep { $seen{$_} == $max_seen_count } keys %seen;
  91.  
  92. my $mode = @modes == 1
  93. ? $modes[0]
  94. : "(" . join(",",@modes) . ")";
  95. $mode .= ' @ ' . $max_seen_count;
  96.  
  97. my $median;
  98. my $mid = int @values/2;
  99. my @sorted_values = sort by_number @values;
  100. if (@values % 2) {
  101. $median = $sorted_values[ $mid ];
  102. } else {
  103. $median = ($sorted_values[$mid-1] + $sorted_values[$mid])/2;
  104. }
  105.  
  106. my $min = min @values;
  107. my $max = max @values;
  108.  
  109. printf "n is %d,min is %g,max is %g\n",$n,$min,$max;
  110. printf "mode is %s,median is %g,mean is %g,stdev is %g\n",$mode,$median,$mean,$stdev;

猜你在找的Perl相关文章