2010-10-21 35 views
2

我有兩個系列,series1和series2。我的目標是自動/定量地發現系列2與系列1的區別在於每個箱到箱,(每個箱代表一個特定功能)。 alt text可以通過clicking here.自動比較兩個系列 - 相似性測試

查看原始尺寸此圖片是系列1的預期結果。 Series2是測試/傳入系列。

我提供了一個柱狀圖,其中Series2以深棕色表示。您還可以在221和353之間的x軸中注意到存在顯着的變化。即Series2小於Series1。我使用C++編碼。

我認爲,互相關會有所幫助,但會產生基於相似性而非差異性的價值。我看到人們談論Kolmogorov-Smirnov測試。這是我應該執行的測試嗎?

UPDATE 1: 我正在嘗試執行模板匹配。我將我的模板圖像分成8x8塊以及我的傳入測試圖像。我試圖將模板圖像中的一個塊與測試圖像中的相同塊(基於空間像素位置)進行比較。我計算每個塊內的強度總和。我爲模板圖像獲取了series1,併爲測試圖像獲得了Series2。

+0

在C和C++中,某些問題的解決方案是相同的。這不是那些問題之一,那是哪一個? C還是C++? – 2010-10-21 10:49:24

+0

@PigBen,我會用C – Raj 2010-10-21 10:51:10

+2

這個問題是不準確的。最簡單的不相似度量是樣本之間的平均差異。沒有任何語境,人們不能說你的情況是否好。 – 2010-10-21 11:00:53

回答

1

下面是一個算法的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_ */ 

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

我不能保證這是最快的方法,並且該函數可以使用一些調整來使其對不同數據類型更友好,但它的工作原理和結果已根據本書提供的示例進行了驗證。

+0

@非常感謝。將根據我的經驗更新 – Raj 2011-01-14 10:02:30

+0

如果您有興趣,我在網上找到一份上述書籍的副本.pdf表格:ftp://ftp.worldofspectrum.org/pub/sinclair/books/PracticalBasicPrograms.pdf Divergence計劃上市開始在第147頁(文件第160頁)。還有一些其他統計程序可以更好地滿足您的需求;如果您需要任何幫助將它們轉換爲C,我很樂意提供幫助。 – oosterwal 2011-01-14 13:46:10