2016-08-17 3 views
0

두 이미지 사이의 피어슨 상관 계수를 찾으려면 다음 C# 코드를 작성했습니다. 완전한 소스 코드는 here in the DotNetFiddle입니다.피어슨 상관 계수

상관 소스 코드 :

public sealed class PearsonCorrelation 
{ 
    public static double GetSimilarityScore(double[,] p, double[,] q) 
    { 
     int Width = p.GetLength(0); 
     int Height = p.GetLength(1); 

     if (Width != q.GetLength(0) || Height != q.GetLength(1)) 
     { 
      throw new ArgumentException("Input vectors must be of the same dimension."); 
     } 

     double pSum = 0, qSum = 0, pSumSq = 0, qSumSq = 0, productSum = 0; 
     double pValue, qValue; 

     for (int y = 0; y < Height; y++) 
     { 
      for (int x = 0; x < Width; x++) 
      { 
       pValue = p[y, x]; 
       qValue = q[y, x]; 

       pSum += pValue; 
       qSum += qValue; 
       pSumSq += pValue * pValue; 
       qSumSq += qValue * qValue; 
       productSum += pValue * qValue; 
      } 
     } 

     double numerator = productSum - ((pSum * qSum)/(double)Height); 
     double denominator = Math.Sqrt((pSumSq - (pSum * pSum)/(double)Height) * (qSumSq - (qSum * qSum)/(double)Height)); 

     return (denominator == 0) ? 0 : numerator/denominator; 
    } 
} 

결과 :

enter image description here

같은 그림이 개 그림 상자에로드됩니다.

해당 상관 계수의 값은 -1입니다.

올바른 결과입니까?

아니요, 수정하려면 어떻게해야합니까?

+1

를 참조 놓아야합니다 'n'- 포인트 수 - '높이'가 아닌 '높이 * 너비' –

+0

사용하는 수식에 대한 참조를 제공 할 수 있다면 매우 유용 할 것입니다. 그러나 두 이미지가 동일하므로 결과가 1이어야한다고 생각합니다. 게다가, 분모는 항상 양의 값이므로, 분자에 문제가있을 것입니다. – Mahdi

+0

@Mahdi, https://github.com/cureos/aforge/blob/master/Sources/Math/Metrics/PearsonCorrelation.cs – anonymous

답변

1

동일한 시퀀스의 상관 관계는 당신이 루틴의 맨 끝 부분에 문제가있는 것 같다 1

해야합니다; 대신

double numerator = productSum - ((pSum * qSum)/(double)Height); 
double denominator = Math.Sqrt((pSumSq - (pSum * pSum)/(double)Height) * (qSumSq - (qSum * qSum)/(double)Height)); 

당신은

double n = ((double) Width) * Height; 

double numerator = productSum - ((pSum * qSum)/n); 
double denominator = 
    Math.Sqrt((pSumSq - (pSum * pSum)/n) * (qSumSq - (qSum * qSum)/n)); 

당신이 분할해야 denominator` 내가`은`numerator`의 최종 공식에서 볼 수 마찬가지로 지금까지

https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient

+0

다른 문제에 대한 피들 코드를 검사 했습니까? – anonymous

+0

@anonymous : 실행하지 못했습니다 : using System.Windows.Forms;는 실행되지 않습니다. –

+0

Fiddle에는'WinForms' 및'unsafe' 코드를 실행할 수있는 메커니즘이 없습니다. – anonymous