根据《统计学习方法》用C++实现的感知器模型。
#include <iostream>
using namespace std;
const int N = 3;/*样本数量*/
const int M = 2;/*输入数据的维数*/
double W[M]{};
double b = 0;
struct slp {
double X[M];
double Y;
};
slp trainData[N] = {
{ { 3,3 },1 },
{ { 4,3 },1 },
{ { 1,1 },-1 }
};
double Gram[N][N]{};/*对偶形式 X的内积矩阵*/
double a[N]{};/*对偶式中的a参数*/
/*生成Gram*/
void getG() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
Gram[i][j] += trainData[i].X[k] * trainData[j].X[k];
}
//cout << Gram[i][j] << endl;
}
}
}
/*对于编号i的输入,调整a,b*/
void update(int i) {
a[i] += 1;
b += trainData[i].Y;
}
/*检查条件*/
int check() {
for (int i = 0; i < N; i++) {
int ans = 0;
for (int k = 0; k < N; k++) {
ans += a[k] * trainData[k].Y*Gram[k][i];
}
ans += b;
if (ans*trainData[i].Y <= 0) {
update(i);
return -1;
}
}
return 1;
}
/*计算W并打印结果*/
void myprint() {
for (int j = 0; j < M; j++) {
for (int i = 0; i < N; i++) {
W[j] += a[i] * trainData[i].X[j] * trainData[i].Y;
}
cout << W[j]<<endl;
}
cout << b;
}
int main(){
getG();
while(check()<0);
myprint();
system("pause");
}