1.感知机是二分类的线性分类模型,输出为实例的类别,取+1和-1二值。
2.感知机属于判别模型。
判别模型:判别方法由学习决策函数f(x)或者是条件概率分布P(Y|X)作为预测的模型。
生成模型:生成方法由数据联合概率分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型。
3.感知机的学习策略:首先假设数据是线性可分的,那么需要一个分离超平面把正负实例完全确定分开。为了找到这么一个平面,需要确定的是感知机参数w,b。又如何求得这两个参数值呢?便引入了(经验)损失函数,损失函数的选取则是根据误分类的点到超平面的距离来确定的,使损失函数取得极小化的参数w,b即为所求超平面的参数。
4.算法
(1)选取初值w0,b0
(2)在训练集中选取数据(xi,yi)
(3)如果yi*(w·xi+b)≤0
w←w+ηyixi
b←b+ηyi
(4)转至(2),直至训练集中没有误分类点。
5.代码
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 5 6 const int num = 10; 7 int count = 0; 8 bool flag = true; 9 10 struct DataSet 11 { 12 double x1; 13 double x2; 14 int y; 15 }data[num]; 16 17 double eta = 1.0;//学习率 18 double w[2] = {0.0, 0.0}, b = 0.0;//定义参数 19 20 //从文件中读取数据 21 void readData() 22 { 23 ifstream file; 24 file.open("data.dat"); 25 int i = 0; 26 while(!file.eof()) 27 { 28 file >> data[i].x1 >> data[i].x2 >> data[i].y; 29 i++; 30 count++; 31 } 32 file.close(); 33 } 34 35 int main() 36 { 37 int i; 38 int n = 0;//迭代次数 39 readData();//读入数据 40 41 //输出数据集 42 cout << "数据集为:" << endl; 43 for(i = 0; i < count; i++) 44 { 45 cout << data[i].x1 << " " << data[i].x2 << " " << data[i].y << endl; 46 } 47 48 while(flag) 49 { 50 for(i = 0; i < count; i++) 51 { 52 flag = false; 53 if( data[i].y * (w[0] * data[i].x1 + w[1] * data[i].x2 + b) <= 0) 54 { 55 flag = true; 56 w[0] = w[0] + eta * data[i].y * data[i].x1; 57 w[1] = w[1] + eta * data[i].y * data[i].x2; 58 b = b + eta * data[i].y; 59 n++; 60 break; 61 } 62 } 63 } 64 65 cout << endl << "结果:" << endl; 66 cout << "w = " << w[0] << ", " << w[1] << " " << "b=" << b << endl; 67 cout << "迭代次数:" << n << endl; 68 69 return 0; 70 }
data.dat是《统计学习方法》上例题数据。
6.感知机学习算法由于采用不同的初值或者选择不同的误分类点,解可以不同。(毕竟随机梯度下降算法只有局部最优解,不能求全局最优解)
7.感知机对偶形式的基本想法是,将w和b表示为实例xi和标记yi的线性组合形式,通过求解其系数而求得w和b。
取αi=ni*η,当η=1时,表示第i个实例点由于误分而进行更新的次数。(学习过SVM就会发现,这些点可能是支持向量)
w←w+ηyixi
b←b+ηyi
取初值w=b=0,最后学习到的w,b可以表示为:
将(1)(2)带入原始形式的感知机模型:
那么,学习目标就不再是w,而是ni,满足判别式之后,更新ni←ni+1。
我们再回到《统计学习方法》的更新方式:
αi←αi+η
b←b+ηyi
由于αi=ni*η,更新ni←ni+1,即αi←(ni+1)*η=αi+η。
那么,这两种方式便得到了统一。
8.对偶形式给原始形式带来了什么样的好处呢?
由于实例是已知的,可以很快求出Gram矩阵,在判断的时候,可以直接调用Gram矩阵的值,来减少计算量!