统计学习方法中的一个例子,题目可从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”是不想与结构体变量名重名。
结果展示: