自动比较两个系列 – 相似性测试

我有两个系列,series1和series2。 我的目标是自动/定量地找出Series2与Series1的不同之处,在bin到bin的基础上 (每个bin代表一个特定的特征)。 替代文字 单击此处可以看到此图像的原始大小。

Series1是预期的结果。 Series2是测试/传入系列。

我提供了直方图,其中Series2以深棕色表示。 您还可以在221和353之间的x轴上注意到有显着的变化。 即Series2小于Series1。 我正在使用C ++进行编码。

我认为,互相关会有所帮助,但会产生一个基于相似性而非不相似性的价值。 我看到人们谈论Kolmogorov-Smirnov测试。 这是我应该进行的测试吗?

更新1:我正在尝试执行模板匹配。 我已将模板图像分成8×8块以及我的传入测试图像。 我试图将模板图像中的一个块与测试图像中的相同块(基于空间像素位置)进行比较。 我计算每个块内的强度和。我获得了模板图像的series1,并且测试图像具有Seri​​es2。

这是用于计算来自预测数据的实际数据的偏差的算法的C实现。 该算法来自Osborne / McGraw-Hill copyright 1980的名为Practical BASIC Programs的书。

这是.h文件:

/* * divergence.h * * Created on: Jan 13, 2011 * Author: Erik Oosterwal */ #ifndef DIVERGENCE_H_ #define DIVERGENCE_H_ typedef struct { int DataSize; float TotalError; float AbsError; //< Total Absolute Error float SqError; //< Total Squared Error float MeanError; float MeanAbsError; float MeanSqError; float RMSError; //< Root Mean Square Error }DIVERGENCE_ERROR_TYPE; void Divergence__Error(int size, float expected[], float actual[], DIVERGENCE_ERROR_TYPE *error); // Prefer to use abs() from "stdlib.h" #ifndef ABS #define ABS(x) ((x)>0) ? (x) : (0-(x)) //< Not safe!!! - Do not increment parameter inside ABS()! #endif #endif /* DIVERGENCE_H_ */ 

... .c文件:

 /* * divergence.c * * Created on: Jan 13, 2011 * Author: Erik Oosterwal */ #include "math.h" #include "divergence.h" /** * @brief Compute divergence from expected values. * * @details Compute the raw errors, absolute errors, root mean square errors, * etc. for a series of values. * * @param size - integer value defines the number of values to compare. */ void Divergence__Error(int size, float expected[], float actual[], DIVERGENCE_ERROR_TYPE *error) { double total_err = 0.0; double abs_err = 0.0; double abs_sqr_err = 0.0; double temp = 0.0; int index = 0; for(index=0; indexDataSize = (int)size; error->TotalError = (float)total_err; error->AbsError = (float)abs_err; error->SqError = (float)abs_sqr_err; error->MeanError = (float)(total_err/temp); error->MeanAbsError = (float)(abs_err/temp); error->MeanSqError = (float)(abs_sqr_err/temp); error->RMSError = (float)(sqrt(abs_sqr_err/temp)); } 

...以及用于测试函数的示例main():

 /* * main.c * * Created on: Jan 13, 2011 * Author: Erik Oosterwal */ #include  #include "divergence.h" float vote[]={40.3, 22.5, 16.3, 10.5, 7.2, 3.2}; float poll[]={42.7, 21.4, 18.2, 6.0, 7.4, 4.3}; float actual[] ={74, 70, 58, 60, 65, 73, 70}; float predict[]={49, 62, 75, 82, 37, 58, 92}; int main(int argc, char *argv[]) { DIVERGENCE_ERROR_TYPE stats; Divergence__Error(6, poll, vote, &stats); printf("%i\n%f\n%f\n%f\n%f\n%f\n%f\n%f\n\n\n",stats.DataSize,stats.TotalError,stats.AbsError,stats.SqError,stats.MeanError,stats.MeanAbsError,stats.MeanSqError,stats.RMSError); Divergence__Error(7, predict, actual, &stats); printf("%i\n%f\n%f\n%f\n%f\n%f\n%f\n%f\n\n\n",stats.DataSize,stats.TotalError,stats.AbsError,stats.SqError,stats.MeanError,stats.MeanAbsError,stats.MeanSqError,stats.RMSError); return(0); } 

我不能保证这是最快的方法,并且该函数可以使用一些调整来使它对不同的数据类型更友好,但它可以工作,并且结果是根据书中提供的样本进行validation的。