我計算Pearson correlation(平均用戶/項目評分)很多次,使用我當前的代碼的表現非常糟糕:性能陣列乘法皮爾遜
public double ComputeCorrelation(double[] x, double[] y, double[] meanX, double[] meanY)
{
if (x.Length != y.Length)
throw new ArgumentException("values must be the same length");
double sumNum = 0;
double sumDenom = 0;
double denomX = 0;
double denomY = 0;
for (int a = 0; a < x.Length; a++)
{
sumNum += (x[a] - meanX[a]) * (y[a] - meanY[a]);
denomX += Math.Pow(x[a] - meanX[a], 2);
denomY += Math.Pow(y[a] - meanY[a], 2);
}
var sqrtDenomX = Math.Sqrt(denomX);
var sqrtDenomY = Math.Sqrt(denomY);
if (sqrtDenomX == 0 || sqrtDenomY == 0) return 0;
sumDenom = Math.Sqrt(denomX) * Math.Sqrt(denomY);
var correlation = sumNum/sumDenom;
return correlation;
}
我使用與MathNet.Numerics
標準Pearson相關,但這是修改標準,而且不可能使用它。有沒有辦法加快速度?如何優化時間複雜性?
我覺得這是更好地問這個問題在這裏http://codereview.stackexchange.com/ – Sybren
我們可以通過看代碼做一些假設,但我們什麼不知道這些假設實際上改善了性能。你應該通過一個分析器來運行它,以真正查看導致緩慢的原因。 –