感知器模型(简单的感知器模型用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语言写的)的主要内容,如果未能解决你的问题,请参考以下文章