C++ 自动比较两个系列-相异性测试

C++ 自动比较两个系列-相异性测试,c++,c,algorithm,statistics,C++,C,Algorithm,Statistics,我有两个系列,系列1和系列2。我的目标是自动/定量地找出序列2与序列1之间的差异有多大。 此图像可以通过以下方式看到其原始大小: 系列1是预期的结果。 系列2是测试/输入系列 我提供了一个直方图图,其中Series2用深棕色表示。您还可以注意到,在221和353之间的x轴上存在显著变化。ie系列2小于系列1。我用C++编写代码。 我认为,互相关会有所帮助,但会产生基于相似性而非差异性的值。我看到人们谈论科尔莫戈罗夫-斯米尔诺夫测试。这是我应该进行的测试吗 更新1: 我正在尝试执行模板匹配。我已将

我有两个系列,系列1和系列2。我的目标是自动/定量地找出序列2与序列1之间的差异有多大。 此图像可以通过以下方式看到其原始大小:

系列1是预期的结果。 系列2是测试/输入系列

我提供了一个直方图图,其中Series2用深棕色表示。您还可以注意到,在221和353之间的x轴上存在显著变化。ie系列2小于系列1。我用C++编写代码。 我认为,互相关会有所帮助,但会产生基于相似性而非差异性的值。我看到人们谈论科尔莫戈罗夫-斯米尔诺夫测试。这是我应该进行的测试吗

更新1:
我正在尝试执行模板匹配。我已将模板图像分割为8x8块以及传入的测试图像。我试图将模板图像中的一个块与测试图像中的相同块(基于空间像素位置)进行比较。我计算每个块内的强度和。我获得模板图像的序列1,测试图像的序列2。

这里是一个算法的C实现,用于计算实际数据与预测数据的偏差。该算法来自于《实用基础程序》一书,该书由奥斯本/麦格劳-希尔出版社出版,版权1980年

以下是.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_ */
/*
*散度
*
*创建日期:2011年1月13日
*作者:Erik Oosterwal
*/
#ifndef散度_
#定义散度_
类型定义结构
{
int-DataSize;
浮动总误差;
浮点绝对误差;//<总绝对误差
浮点SqError;//<总平方误差
浮动平均误差;
浮动平均误差;
浮动平均误差;
浮点RMSError;//<均方根误差
}散度误差类型;
无效散度误差(整数大小、浮点预期值[]、浮点实际值[]、散度误差类型*误差);
//更喜欢使用“stdlib.h”中的abs()
#ifndef ABS
#定义ABS(x)((x)>0)?(x) :(0-(x))/<不安全!!!-请勿在ABS()内增加参数!
#恩迪夫
#endif/*散度*/
…在.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; index<size; index++)
    {
        temp = (double)(actual[index])-(double)(expected[index]);
        total_err+=temp;
        abs_err+=ABS(temp);
        abs_sqr_err+=pow(ABS(temp),2);
    }

    temp = (double)size;
    error->DataSize = (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));
}
/*
*散度c
*
*创建日期:2011年1月13日
*作者:Erik Oosterwal
*/
#包括“math.h”
#包括“散度.h”
/**
*@计算与预期值的偏差。
*
*@details计算原始误差、绝对误差、均方根误差、,
*等一系列值。
*
*@param size-整数值定义要比较的值的数量。
*/
无效散度错误(整数大小、预期浮点数[]、实际浮点数[]、散度错误类型*错误)
{
双倍总误差=0.0;
双abs_err=0.0;
双abs_sqr_err=0.0;
双温=0.0;
int指数=0;
对于(index=0;indexDataSize=(int)size;
错误->总错误=(浮动)总错误;
错误->AbsError=(浮动)abs\u err;
错误->SqError=(浮动)abs\u sqr\u err;
错误->平均错误=(浮动)(总错误/温度);
错误->平均误差=(浮动)(绝对误差/温度);
错误->平均误差=(浮动)(绝对误差/温度);
错误->RMSError=(浮动)(sqrt(绝对误差/温度));
}
…和用于测试函数的示例main():

/*
 * main.c
 *
 *  Created on: Jan 13, 2011
 *      Author: Erik Oosterwal
 */

#include <stdio.h>
#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);
}
/*
*main.c
*
*创建日期:2011年1月13日
*作者:Erik Oosterwal
*/
#包括
#包括“散度.h”
浮动投票[]={40.3,22.5,16.3,10.5,7.2,3.2};
浮动投票[]={42.7,21.4,18.2,6.0,7.4,4.3};
浮动实际值[]={74,70,58,60,65,73,70};
浮动预测[]={49,62,75,82,37,58,92};
int main(int argc,char*argv[])
{
散度误差类型统计;
分歧错误(6、投票、投票和统计);
printf(“%i\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.MeanSqError,stats.RMSError);
散度误差(7,预测、实际和统计);
printf(“%i\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.MeanSqError,stats.RMSError);
返回(0);
}

<>我不能保证这是最快的方法,函数可以使用一些调整来使它对不同的数据类型更友好,但是它是有效的,并且结果是根据书中提供的样本来验证的。< / P>在C和C++中,一些问题的解决方案是相同的。这不是其中的一个问题,那么,这是什么?或者C++?这个问题是不精确的。最简单的度量是样本之间的平均差异。没有任何上下文,你就不能说它对你来说是好的。同意Rafal;有一百万种不同的测量相似性的方法,每个都有利弊。“拉法尔和奥利,我已经更新了我的文章。这不是一个问题。n关于编程(尚未)。我看到您已经在统计分析页面上询问过了。我建议您在那里等待您的答案,然后如果您有关于如何实现算法的问题,请回到这里。同时,我将结束这个问题,因为它没有(尚未)与编程相关。如果您感兴趣,我在网上找到了一本.pdf格式的上述书籍:Difference程序列表从书籍第147页(文件第160页)开始。还有一些其他统计程序可能更适合您的需要;如果您需要任何帮助将其转换为C,我很乐意提供帮助。