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

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

结果展示:

猜你喜欢

转载自blog.csdn.net/u012140304/article/details/60874042