感知机算法的C语言实现
维数n=3时,分别取M=10,M=20,M=30
当M=10时,收敛时,迭代次数K=1,权矩阵矢量为W=[-0.478851,0.458190,-0.156789],阈值,正确分类个数为26个。正确分类率。
当M=20 时,收敛时,迭代次数K=20,权矩阵矢量为W=[-0.348414,0.448089,0.189322],阈值,正确分类个数为28个。正确分类率为。
(3) 当M=30时,收敛时,迭代次数K=2,权矩阵矢量为W=[-0.305788,-0.159451,0.640561],
阈值,正确分类个数为30个。正确分类率为。
维数n=5时,分别取M=10,M=20,M=30
当M=10时,收敛时,迭代次数K=2,权矢量矩阵为W=[-0.274457,0.368049,0.363532,-0.226269,0.356574],阈值,正确分类个数为26个。正确分类率为。
当M=20时,收敛时,迭代次数K=2,权矩阵矢量为W=[-0.222079,-0.145569,-0.102233,-0.287663,0.645226],阈值,正确分类个数为27个。正确分类率为。
当M=30时,收敛时,迭代次数K=2,权矢量矩阵为W=[-0.190624,-0.027136,0.251925,0.309026,0.347021],阈值。正确分类个数为30个。正确分类率为。
程序如下所示:
#include
#include
#include
#include
#define PI 3.1415926
#define COUNT 30 //样本训练次数
#define DIMEN 5 // 输入样本维度
/***************
函数名:ran_f
函数功能:产生0到1之间均匀分布的随机数
接口参数:
*p double型指针变量
函数返回值 a double型
****************/
double ran_f(double*p)
{
double a;
srand((unsigned) time(NULL));
*p = rand();
a = *p / 32767.0;
return(a);
}
void main()
{
double x[COUNT][DIMEN]; // 输入样本训练数据
int y[COUNT]; // 训练输出
int d[COUNT]; // 理想输出
double W[COUNT]; // 权值矩阵
double thres; // 阈值
double eps = 0.00001; // 进行收敛判断的条件
double deta = 0.2; // 学习因子
double r[1] = {3.0}; // 随机数种子
double xt[30][5]; //测试数据
int dt[30]; //理想数据输出
double m1, m2, s, dp, ep; // dp为理想输出与实际输出的差,ep为均方误差
int yt[30]; //测试输出
int count = 0; //测试正确的数目
double Rate; //正确分类率
int i, j, k;
for(i = 0; i < COUNT; i++)
{
for(j = 0; j < DIMEN; 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;
else
d[i] = 0;
}
srand((unsigned)time(NULL));
for(j = 0; j < DIMEN; j++) //对权值、阈值进行初始化,随机产生[-1,1]间的数
W[j] = (2.0 * rand() / RAND_MAX - 1) ;
thres = (2.0 * rand() / RAND_MAX - 1) ;
k