根據(jù)《統(tǒng)計學習方法》用C++實現(xiàn)的感知器模型软族。
#include <iostream>
using namespace std;
const int N = 3;/*樣本數(shù)量*/
const int M = 2;/*輸入數(shù)據(jù)的維數(shù)*/
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的內(nèi)積矩陣*/
double a[N]{};/*對偶式中的a參數(shù)*/
/*生成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的輸入立砸,調(diào)整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并打印結(jié)果*/
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");
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者