机器学习基石作业1-17-PLA 的c++实现

来源:互联网 发布:nginx添加lua模块 编辑:程序博客网 时间:2024/05/19 17:07
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<vector>
#include<algorithm>
using namespace std;
double sign(double x) {
if (x > 0)
return 1;
else
return -1;
}
double Sum(double* a, double* b, int length) {
double sum = 0;
for (int i = 0; i < length; i++)
sum += a[i] * b[i];
return sum;
}
void add(double *v1, double *v2, int demension) {
int i;
for (i = 0; i < demension; i++)
v1[i] += v2[i];
}
void multiply(double *result, double *v, int demension, double num) {//向量的数乘
int i;
for (i = 0; i < demension; i++)
result[i] = num * v[i];
}
int PLA(vector < vector < double >> &data) {
vector<vector<double>>::iterator it1;//外部迭代
vector<double>::iterator it2;//内部迭代
int step = 0;
double W[5] = { 0 };
bool noFinished = true;
while (noFinished)
{
noFinished = false;
for (it1 = data.begin(); it1 != data.end(); it1++) //迭代每一个训练样本
{
double X[6];
int i = 0;
for (it2 = (*it1).begin(), i = 0; it2 != (*it1).end(); it2++, i++)
X[i] = (*it2);
double sum = Sum(W, X, 5);//计算wT*X
if (X[5] != sign(sum)) {//找到错误点
noFinished = true;//标记未完成
double temp[5];
multiply(temp, X, 5, 0.5*X[5]);
add(W, temp, 5);//更新权值
step++;//进行一次修正,修正次数+1
}
}
}
//cout << "step: " << step << endl;
return step;
}


void getData(vector<vector<double>> &data,string filename) {
ifstream file;
string line;
double txt[5];
double x0 = 1;
file.open(filename);
if (!file.is_open()) {
cout << "Cannot open the file !\n";
exit(EXIT_FAILURE);
}
while (getline(file, line)) {//读取数据到字符串中
stringstream ss(line);
ss >> txt[0] >> txt[1] >> txt[2] >> txt[3] >> txt[4];
vector<double> temp;
temp.push_back(x0);//将x0=1写入
for (int i = 0; i < 5; i++)
temp.push_back(txt[i]);
data.push_back(temp);
}
file.close();
}
int main()
{
string filename = "train.txt";
vector<vector<double>> data;//存储训练数据
getData(data, filename);
//PLA(data);
double sum = 0;
for (int i = 0; i < 2000; i++) {
random_shuffle(data.begin(), data.end());
sum += PLA(data);
}
cout << "average step: " << sum / 2000 << endl;
return 0;
}
阅读全文
0 0
原创粉丝点击