感知机的定义:
感知机学习算法的原始形式算法描述:
以例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;
- }
程序运行结果,如下图所示:
这样结果就求出来了,图的话就不画了,有兴趣的可以用opencv把图像绘制出来。只是简单实现,如果有不对的地方,很乐意一起交流,共同进步。
网址:http://blog.csdn.net/IDMer/article/details/49365301