感知器模型(简单的感知器模型用C语言写的)

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了感知器模型(简单的感知器模型用C语言写的)相关的知识,希望对你有一定的参考价值。

明人不说暗话,这就是一次作业,用c语言写感知器模型(嫖嫖改改来的),是一种比较简单的机器学习模型,主要是解决线性二分类问题,代码注释应该挺详细了吧,不懂再问吧

#include<bits/stdc++.h>
using namespace std;
#define nTrain 183//训练样本数量
#define nInput 6//训练样本维度
#define eta 1//学习速率
#define nTest 120//测试样本数量
#define maxItre 100//学习率,最大训练次数自己调调好了,这里我乱设置的 

typedef struct slp {
	double input[nInput+1];
	int output;
} slp_testData;

slp_testData trainData[nTrain];
slp_testData testData[nTest];

void readtraindata(int n){//读取训练文件 
		FILE *fp;
	if((fp=fopen("C:/Users/ASUS/OneDrive/桌面/trainData.txt","r"))==NULL)//文件路径 
	{
		printf("File open error!\\n");
		exit(0);
	}
	for(int i=0;i<nTrain;i++)
	{
		for(int j=0;j<nInput;j++)
		{
			fscanf(fp,"%lf",&trainData[i].input[j]);
		}
		    fscanf(fp,"%d",&trainData[i].output);
	}
	
	if(fclose(fp)){
		printf("Can not close the file!\\n");
		exit(0);
	} 
}



void readtestdata(int n){//读取测试文件 
		FILE *fp;
	if((fp=fopen("C:/Users/ASUS/OneDrive/桌面/testData.txt","r"))==NULL)
	{
		printf("File open error!\\n");
		exit(0);
	}
	for(int i=0;i<nTest;i++)
	{

		for(int j=0;j<nInput;j++)
		{
			fscanf(fp,"%lf",&testData[i].input[j]);

		}
		    fscanf(fp,"%d",&testData[i].output);
	}
	
	if(fclose(fp)){
		printf("Can not close the file!\\n");
		exit(0);
	} 
}


double com_output( double *input, double *weight)//计算内积 
{
	double sum=0.0;
	for(int i=0;i < nInput+1;i++)
	{
		sum = sum + (input[i] * weight[i]);
	}
	//sum=sum - weight[nInput]*1.0;
	return sum;
}


//分类函数
int classOutPerceptron(double output)//符号函数,用于分类判断标签是否预测正确 
{
	if (output > 0)
		return 1 ;
	else
		return -1;
}
int main(void)
{
	readtestdata(nTest);
	readtraindata(nTrain);//读取数据 
	
	for(int i=0;i<nTrain;i++)//最后一维当成b初始值为1,线性函数y=a1x1+a2x2+...+b,x为数据维度(标签也算一维)再加一维b,a则为所要求的权重 
	{
		int t = nInput;
		trainData[i].input[t]=1;
	}
	for(int i=0;i<nTest;i++)
	{
		int t = nInput;
		testData[i].input[t]=1;
	}
	
	int i,j,k,tempResu;

	double weights[nInput+1];//赋值权重
	for(int i=0;i<nInput+1;i++)
	{
		weights[i]=0.0; 
	}
	
	double m = -56;//随便定义一个负数用于记录测试集准确率最大值 
	for(k=0;k<maxItre;k++)
	{
	    int sum = 0;//
	    int tesum = 0;
        for(i=0;i<nTrain;i++)
        {
            tempResu = classOutPerceptron(com_output(trainData[i].input,weights));
            if (tempResu == trainData[i].output)
            {
                sum++;
                continue;
            }

            else//如果不能拟合这个点就更新权重使其接近拟合值
                for (j=0;j<=nInput;j++)
                {
                    weights[j] = weights[j] + eta*trainData[i].output*trainData[i].input[j];
                }
        }
        
        for(i=0;i<nTest;i++)//计算每次训练后测试集的正确率 
        {
            tempResu = classOutPerceptron(com_output(testData[i].input,weights));//计算内积转换成1或-1 
            if (tempResu == testData[i].output)//标签预测成功则加起来 
            {
                tesum++;
            }
        }
        printf("第%d次训练结果为:\\n",k); 
        double acc = sum*1.0/nTrain;
        printf("acc:%lf\\n",acc);
        double teacc = tesum*1.0/nTest;
        printf("teacc:%lf\\n",teacc);
        m = max(m,teacc);
        printf("maxteacc:%lf\\n",m);
        if (sum == nTrain)
            break;
	}

	for (i=0;i<nTrain;i++)
        {
            printf("train[%d] .. %d\\n",i,classOutPerceptron(com_output(trainData[i].input,weights)));
        }

	for (i=0;i<nTest;i++)
        {
            printf("test[%d] .. %d\\n",i,classOutPerceptron(com_output(testData[i].input,weights)));
        }
        
    printf("iteration:%d\\n",k);
    
    for (i=0;i<=nInput;i++)//输出权值 
	{
	printf("weight[%d]..%.15lf\\n",i,weights[i]);
	}
        
	return 0;
}

以上是关于感知器模型(简单的感知器模型用C语言写的)的主要内容,如果未能解决你的问题,请参考以下文章

感知器(Perception)

ML——感知器

数学建模学习(30):神经网络算法模型之感知器,详细讲解+完整代码,包教包会!

多层感知器 (MLP) Keras 张量流模型

python实现感知机线性分类模型

在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()