C - Perceptron学校项目 - 单一数据集,错误未收敛

时间:2015-09-30 00:31:13

标签: c algorithm csv perceptron

大家好, 我目前正在坚持这样描述的学校项目:

你的程序应该在in.csv文件中读取,并调整感知器的权重,以便在给定训练的输入时,它提供相应的输出。

实际上,在训练ANN时,错误可能永远不会变为零;我们的目标是希望能够足够聪明地识别大多数情况。对于此项目,启动时的错误为5%或0.05。例如,这意味着人工神经网络正确识别了95/100的输入,05/100被错误地分类。看看你是否可以修改ANN训练过程的参数,使其优于5%,但是你的程序不应该在500,000次迭代后继续尝试修改权重。

样品运行:C:\ percy in.csv 100 5 10

其中可执行文件是percy.exe,输入文件是in.csv,学习率是100/1000 = 0.100,错误是5/100,最大迭代是数千,所以10对应10,000。< / p>

根据以下示例格式化输入文件。行中的前16个字符表示传感器输入,最后一个字符始终为0或1,表示输入对应的类。

0000000001000000,0

0000000001000001,1

0000000001000010,1

0000000001000011,1

0000000001000100,1

这几个数字是正在使用的数据集的一部分,其余的数据集是类似的整数

所以输出应该是这样的:

iterationError = 0.023437500,errCnt = 3,repNum = 72

重量[00]:+ 0.00661wt%[01]:+0.00431wt%[02]:+ 0.00011wt%[03]:+0.00814

wt [04]:+ 0.00198wt%[05]:+0.00470wt%[06]:+ 0.00356wt%[07]:+0.00435

wt [08]:+ 0.00761wt%[09]:+0.52254wt%[10]:+ 0.00120wt%[11]: - 0.01169

wt [12]: - 0.00937 wt [13]: - 0.00281 wt [14]: - 0.00157 wt [15]: - 0.00217

STOP *****(将wt [10]设置为0.5232)

但是,当我通过读取.csv数据集运行我的代码(下面)时,程序会一直运行,直到它达到10k次迭代并且错误没有改变,而且我并不完全是确定我的循环或计算可能出错。另外我应该注意,我当前的代码还没有代表正确的输出。

非常感谢任何帮助,谢谢

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define LEARNING_RATE    0.1
#define MAX_ITERATION    10000

float randomFloat()
{
    return (float)rand() / (float)RAND_MAX;
}

int calculateOutput(float weights[], int x)
{
    float sum = x * weights[0] + weights[1];

    return (sum >= 0) ? 1 : -1;
}

int main(int argc, char *argv[])
{
    srand(time(NULL));

    float weights[2], localError, globalError, MAX_ERROR = 0.05;
    float x[208];
    int outputs[208], patternCount, i, p, iteration, output;

    FILE *fp;
    if ((fp = fopen("in.csv", "r")) == NULL) {
        printf("Cannot open file.\n");
        exit(1);
    }

    i = 0;

    while (fscanf(fp, "%f,%d", &x[i], &outputs[i]) != EOF) {
        i++;
    }

    patternCount = i;

    weights[0] = randomFloat();
    weights[1] = randomFloat();

    iteration = 0;
    do {
        printf(" Iteration: %d  ***********************************\n", iteration);
        iteration++;
        globalError = 0;
        for (p = 0; p < patternCount; p++) {
            output = calculateOutput(weights, x[p]);

            localError = outputs[p] - output;
            weights[0] += LEARNING_RATE * localError * x[p];
            weights[1] += LEARNING_RATE * localError;

            globalError += (localError*localError);

            printf("%.1f \n", weights[0]);
        }
        globalError = globalError/((float)patternCount);
        printf("    iterationError = %.5f\n", globalError);
    } while ((globalError > MAX_ERROR) && (i < MAX_ITERATION));

    return 0;
}

0 个答案:

没有答案