【问题标题】:automatically compare two series -Dissimilarity test自动比较两个系列 - 差异测试
【发布时间】:2010-10-21 10:39:14
【问题描述】:

我有两个系列,series1 和 series2。我的目标是自动/定量地找出 Series2 与 Series1 有多少不同,在 bin 到 bin 的基础上,(每个 bin 代表一个特定的特征)。 clicking here.可以看到这张图片的原始尺寸

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

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

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

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

【问题讨论】:

  • 有些问题的解法在C和C++中是一样的。这不是这些问题之一,那么它是什么? C 还是 C++?
  • 这个问题不准确。最简单的差异度量是样本之间的平均差异。没有任何上下文,就不能说它是否适合您的情况。
  • 同意拉法尔;衡量相似度的方法有上百万种,各有利弊。
  • @Rafal & Oli,我更新了我的帖子。
  • 这还不是关于编程的问题。我看到你已经在统计分析页面上问过了。我建议你在那里等待你的答案,然后如果你有关于如何实现算法的问题,请回到这里。与此同时,我会结束这个问题,因为它(还)与编程无关。

标签: c++ c algorithm statistics


【解决方案1】:

这是一个算法的 C 实现,用于计算实际数据与预测数据的差异。该算法来自 Osborne/McGraw-Hill 版权所有 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; 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));
}

...以及用于测试函数的示例 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);
}

我不能保证这是最快的方法,并且该函数可以进行一些调整以使其对不同的数据类型更友好,但它确实有效,并且结果已根据书中提供的示例进行了验证。

【讨论】:

  • 如果您有兴趣,我在网上找到了上述书籍的 .pdf 格式副本:ftp.worldofspectrum.org/pub/sinclair/books/… Divergence 程序列表从书籍第 147 页(文件第 160 页)开始。还有一些其他统计程序可能更适合您的需求;如果您需要任何帮助将它们转换为 C,我很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2018-01-12
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多