统计学习方法感知机的实现

    xiaoxiao2021-03-25  116

    统计学习方法中的一个例子,题目可从http://blog.csdn.net/idmer/article/details/49365301中看到。链接中的博主实现的是书中随机梯度下降法的例子,以下是实现书中感知机算法对偶形式例子的算法C++实现:

    #include <iostream> #include <fstream> #include <windows.h> using namespace std; bool flag=true; const int num = 10;//数据集大小(估计) int count=0; //实际大小 struct Dataset { double x1; double x2; int y; }data[num];//x1,x2是两个维度 void readData(){ ifstream file; file.open("aaaa.dat"); int i=0; while(!file.eof()) { file>>data[i].x1>>data[i].x2>>data[i].y; i++; count++; } file.close(); } int main() { int n=0;//diedaicishu double gram[3][3];//二维数组用来存储gram矩阵 double a[3]={0.0,0.0,0.0},b=0.0;//初始化迭代变量 readData(); cout << "数据集为:" << endl; for(int i=0;i<count;i++) { cout<<data[i].x1<<" "<<data[i].x2<<" "<<data[i].y<<endl; } for(int i=0;i<count;i++) { for (int j=0;j<count;j++) { gram[i][j]=data[i].x1*data[j].x1+data[i].x2*data[j].x2; } } while(flag) { for (int i=0;i<count;i++) { double sum=0; flag = false; for (int j=0;j<count;j++) { sum+=a[j]*data[j].y*gram[j][i]; } if(data[i].y*(sum+b)<=0) { flag=true; a[i]=a[i]+1; b=b+data[i].y; n++; break; } } } cout<<"迭代了:"<<n<<endl; double w[2]={0.0,0.0};//按题目要求应该有两个权重 w[0]+=a[0]*data[0].x1*data[0].y+a[1]*data[1].x1*data[2].y+a[2]*data[2].x1*data[2].y;//由a计算权值w w[1]+=a[0]*data[0].x2*data[0].y+a[1]*data[1].x2*data[2].y+a[2]*data[2].x2*data[2].y; cout<<"w "<<w[0]<<" "<<w[1]<<endl; cout<<"b "<<b<<endl; system("pause"); }

    文中储存特征和标签的文件名叫“aaaa.dat”不叫“data.dat”是不想与结构体变量名重名。

    结果展示:

    转载请注明原文地址: https://ju.6miu.com/read-3430.html

    最新回复(0)