感知机的定义:
感知机学习算法的原始形式算法描述:
以例2.1为例,编程实现该算法:
C++编程实现,程序代码,在资源里,有兴趣可以下载,代码如下:
#include<iostream>
#include<fstream>
using namespace std;
const int num = 10;//数据集大小(估计)
int count = 0;//数据集大小(实际)
bool flag = true;//是否误分类
struct DataSet
{
double x1;
double x2;
int y;
}data[num];
double eta = 1.0;//学习率
double w[2] = {0.0, 0.0}, b = 0.0;//定义参数
//从文件中读取数据
void readData()
{
ifstream file;
file.open("data.dat");
int i = 0;
while(!file.eof())
{
file >> data[i].x1 >> data[i].x2 >> data[i].y;
i++;
count++;
}
file.close();
}
int main()
{
int i;
int n = 0;//迭代次数
readData();//读入数据
//输出数据集
cout << "数据集为:" << endl;
for(i = 0; i < count; i++)
{
cout << data[i].x1 << " " << data[i].x2 << " " << data[i].y << endl;
}
while(flag)
{
for(i = 0; i < count; i++)
{
flag = false;
if( data[i].y * (w[0] * data[i].x1 + w[1] * data[i].x2 + b) <= 0)
{
flag = true;
w[0] = w[0] + eta * data[i].y * data[i].x1;
w[1] = w[1] + eta * data[i].y * data[i].x2;
b = b + eta * data[i].y;
n++;
break;
}
}
}
cout << endl << "结果:" << endl;
cout << "w = " << w[0] << ", " << w[1] << " " << "b=" << b << endl;
cout << "迭代次数:" << n << endl;
return 0;
}
数据集:data.dat, 内容如下图所示:
程序运行结果,如下图所示:
这样结果就求出来了,图的话就不画了,有兴趣的可以用opencv把图像绘制出来。只是简单实现,如果有不对的地方,很乐意一起交流,共同进步。