您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 感知机算法的C语言实现
感知机算法的C语言实现维数n=3时,分别取M=10,M=20,M=30(1)当M=10时,收敛时,迭代次数K=1,权矩阵矢量为W=[-0.478851,0.458190,-0.156789],阈值230766.0,正确分类个数为26个。正确分类率866667.0R。(2)当M=20时,收敛时,迭代次数K=20,权矩阵矢量为W=[-0.348414,0.448089,0.189322],阈值411991.0,正确分类个数为28个。正确分类率为933333.0R。(3)当M=30时,收敛时,迭代次数K=2,权矩阵矢量为W=[-0.305788,-0.159451,0.640561],阈值530926.0,正确分类个数为30个。正确分类率为000000.1R。维数n=5时,分别取M=10,M=20,M=30(1)当M=10时,收敛时,迭代次数K=2,权矢量矩阵为W=[-0.274457,0.368049,0.363532,-0.226269,0.356574],阈值510926.0,正确分类个数为26个。正确分类率为866667.0R。(2)当M=20时,收敛时,迭代次数K=2,权矩阵矢量为W=[-0.222079,-0.145569,-0.102233,-0.287663,0.645226],阈值618442.0,正确分类个数为27个。正确分类率为900000.0R。(3)当M=30时,收敛时,迭代次数K=2,权矢量矩阵为W=[-0.190624,-0.027136,0.251925,0.309026,0.347021],阈值796128.0。正确分类个数为30个。正确分类率为000000.1R。程序如下所示:#includestdio.h#includestdlib.h#includetime.h#includemath.h#definePI3.1415926#defineCOUNT30//样本训练次数#defineDIMEN5//输入样本维度/***************函数名:ran_f函数功能:产生0到1之间均匀分布的随机数接口参数:*pdouble型指针变量函数返回值adouble型****************/doubleran_f(double*p){doublea;srand((unsigned)time(NULL));*p=rand();a=*p/32767.0;return(a);}voidmain(){doublex[COUNT][DIMEN];//输入样本训练数据inty[COUNT];//训练输出intd[COUNT];//理想输出doubleW[COUNT];//权值矩阵doublethres;//阈值doubleeps=0.00001;//进行收敛判断的条件doubledeta=0.2;//学习因子doubler[1]={3.0};//随机数种子doublext[30][5];//测试数据intdt[30];//理想数据输出doublem1,m2,s,dp,ep;//dp为理想输出与实际输出的差,ep为均方误差intyt[30];//测试输出intcount=0;//测试正确的数目doubleRate;//正确分类率inti,j,k;for(i=0;iCOUNT;i++){for(j=0;jDIMEN;j++){m1=ran_f(r);//产生均匀分布的随机数m2=ran_f(r);x[i][j]=sqrt(-2*log(m1))*sin(2*PI*m2);//产生正态分布随机数}if(x[i][1]=0)d[i]=1;elsed[i]=0;}srand((unsigned)time(NULL));for(j=0;jDIMEN;j++)//对权值、阈值进行初始化,随机产生[-1,1]间的数W[j]=(2.0*rand()/RAND_MAX-1);thres=(2.0*rand()/RAND_MAX-1);k=0;//迭代次数while(1){ep=0;for(i=0;iCOUNT;i++){s=0;for(j=0;jDIMEN;j++)s+=W[j]*x[i][j];s=s-thres;if(s=0)y[i]=1;elsey[i]=0;dp=(double)(d[i]-y[i]);for(j=0;jDIMEN;j++)//更新权值、阈值{W[j]=W[j]+deta*dp*x[i][j];thres=thres-deta*dp;}dp=(dp*dp)/2.0;ep+=dp;}k++;if(ep=eps)//如果均方误差ep小于等于设定的收敛条件值,则认定均方差最小,达到系统收敛,则跳出循环。break;}printf(迭代次数=%d\n,k);printf(权值:\n);for(j=0;jDIMEN;j++)printf(%f\n,W[j]);printf(阈值:\n);printf(%f\n,thres);/*用30个新矢量验证系统*/for(i=0;i30;i++){for(j=0;jDIMEN;j++){m1=ran_f(r);//产生均匀分布随机数m2=ran_f(r);xt[i][j]=sqrt(-2*log(m1))*sin(2*PI*m2);//产生正态分布随机数}if(xt[i][1]=0)dt[i]=1;elsedt[i]=0;s=0;for(j=0;jDIMEN;j++)//计算测试输出s+=W[j]*x[i][j];s=s-thres;if(s=0)y[i]=1;elsey[i]=0;if(dt[i]==y[i])count++;}printf(正确分类个数=%d\n,count);Rate=(double)(count/30.0);printf(分类正确率:\n);printf(%f,Rate);}
本文标题:感知机算法的C语言实现
链接地址:https://www.777doc.com/doc-7843672 .html