2010-07-23 5 views
1

소스 데이터 :C#에서 내 분산 기능은 정확한 값을 반환하지 않습니다

static double[] felix = new double[] { 0.003027523, 0.002012256, -0.001369238, -0.001737660, -0.001647287, 
     0.000275154, 0.002017238, 0.001372621, 0.000274148, -0.000913576, 0.001920263, 0.001186456, -0.000364631, 
     0.000638337, 0.000182266, -0.001275626, -0.000821093, 0.001186998, -0.000455996, -0.000547445, -0.000182582, 
     -0.000547845, 0.001279006, 0.000456204, 0.000000000, -0.001550388, 0.001552795, 0.000729594, -0.000455664, 
     -0.002188184, 0.000639620, 0.000091316, 0.001552228, -0.001002826, 0.000182515, -0.000091241, -0.000821243, 
     -0.002009132, 0.000000000, 0.000823572, 0.001920088, -0.001368863, 0.000000000, 0.002101800, 0.001094291, 
     0.001639643, 0.002637323, 0.000000000, -0.000172336, -0.000462665, -0.000136141 }; 

분산 기능 :

public static double Variance(double[] x) 
    { 
     if (x.Length == 0) 
      return 0; 
     double sumX = 0; 
     double sumXsquared = 0; 
     double varianceX = 0; 
     int dataLength = x.Length; 


     for (int i = 0; i < dataLength; i++) 
     { 
      sumX += x[i]; 
      sumXsquared += x[i] * x[i]; 
     } 

     varianceX = (sumXsquared/dataLength) - ((sumX/dataLength) * (sumX/dataLength)); 
     return varianceX; 
    } 

Excel 및 일부 온라인 계산기 분산이 1.56562E-06 동안 말한다 내 기능은 나에게 1.53492394804015E-06을 준다. 나는 C#에 정확성 문제가 있는지 의심 스럽다. 전에 이런 종류의 문제가있는 사람이 있습니까?

답변

12

sample variance and population variance의 차이점과 부동 소수점 정밀도 또는 C#의 부동 소수점 구현의 정확성과 아무런 관련이 없습니다.

인구 분산을 계산 중입니다. Excel과 해당 웹 사이트에서 표본 분산을 계산 중입니다.

Var 및 VarP는 서로 다른 계산이므로 사용중인 항목에주의해야합니다. (안타깝게도 사람들은 종종 표준 편차에 대해서도 같은 의미로 사용합니다. 표준 편차도 마찬가지입니다.)

데이터의 샘플 분산은 1.56562E-06, 모집단 분산은 1.53492394804015E-06입니다. 잠시 뒤 일부 code posted on codeproject에서

:

분산 샘플에서

public static double Variance(this IEnumerable<double> source) 
{ 
    double avg = source.Average(); 
    double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2)); 
    return d/(source.Count() - 1); 
} 

분산 인구 여기

public static double VarianceP(this IEnumerable<double> source) 
{ 
    double avg = source.Average(); 
    double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2)); 
    return d/source.Count(); 
} 
+0

좋은 답변입니다! ! ! –

+0

잘 주셔서 감사합니다! – dkackman

1

에서 그 수치, 때로는 더 잘 행동하고, 다른 구현이다 :

 mean = Average(data); 
     double sum2 = 0.0, sumc = 0.0; 


     for (int i = 0; i < data.Count; i++) 
     { 
      double dev = data[i] - mean; 
      sum2 += dev * dev; 
      sumc += dev; 
     } 

     return (sum2 - sumc * sumc/data.Count)/data.Count;