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

Насколько я могу видеть в окончательной формуле для '' numerator' и denominator' вы должны разделить by 'n' - количество точек - это' Высота * Ширина', а не только 'Высота' –

+0

Было бы очень полезно, если бы вы могли предоставить нам ссылку на формулу, которую вы используете. Однако я считаю, что результат должен быть равен 1, поскольку оба изображения одинаковы. Более того, поскольку знаменатель всегда положителен, должно быть что-то не так с числителем. – Mahdi

+0

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

ответ

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)); 

см

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

+0

Вы проверили мой код Fiddle для любых других проблем? – anonymous

+0

@ anonymous: Мне не удалось выполнить его: 'using System.Windows.Forms;' похоже, препятствует его запуску. –

+0

У Fiddle нет механизма для выполнения 'WinForms' и' unsafe' -кодов. – anonymous

Смежные вопросы