автоматически сравнивать две серии -различие тест - PullRequest
2 голосов
/ 21 октября 2010

У меня есть две серии, серия1 и серия2. Моя цель состоит в том, чтобы найти , насколько Series2 отличается от Series1, на основе корзины для корзины, (каждая корзина представляет определенную функцию) автоматически / количественно. alt text Это изображение можно увидеть в оригинальном размере, нажав здесь.

Series1 - ожидаемый результат. Series2 - тестовая / входящая серия.

Я предоставляю график гистограммы, где Series2 представлен темно-коричневым цветом. Вы также можете заметить, что на оси х между 221 и 353 есть существенные различия. т.е. Series2 меньше чем Series1. Я пишу с использованием C ++.

Я думаю, что взаимная корреляция поможет, но дает значение, основанное на сходстве, а не на разнице. Я вижу, что люди говорят о тесте Колмогорова-Смирнова. Это тест, который я должен выполнить?

ОБНОВЛЕНИЕ 1: Я пытаюсь выполнить сопоставление шаблона. Я разделил свое шаблонное изображение на блоки 8х8, а также входящее тестовое изображение. Я пытаюсь сравнить один блок в шаблонном изображении с тем же блоком (на основе пространственных положений пикселей) в тестовом изображении. Я вычисляю сумму интенсивности в каждом блоке. Я получаю series1 для изображения шаблона и получаю Series2 для тестового изображения.

1 Ответ

1 голос
/ 14 января 2011

Вот реализация C алгоритма для вычисления расхождения фактических данных с прогнозируемыми данными.Алгоритм взят из книги, озаглавленной Практические основные программы от Осборна / МакГроу-Хилла, 1980 г.файл .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);
}

Я не могу гарантировать, что это самый быстрый метод иФункция может использовать некоторые настройки, чтобы сделать ее более дружественной к различным типам данных, но она работает, и результаты сверяются с примерами, приведенными в книге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...