C++感知机分类Iris数据集

目前为止尝试了两种办法,因为是个四维数据要分三类:

想看好结果直接移步第二种方法(Queens 2017 meng的同学如果搜索到这篇文章请不要copy代码谢谢)

有更好办法欢迎评论,觉得我太垃圾直接右上角点X

第一种方法:设置三个权向量w1,w2,w3,第一类(1,0,0),第二类(0,1,0)第三类(0,0,1),1表示大于零0表示小于零,训练每个数据集的时候计算y1y2y3然后看正负。输入自己不会写是贴的别人代码。。很惭愧了,训练大概20000词的时候能得到最佳结果,50%的准确率,可见这个方法不好。训练10次以内w1稳定,准确率100%,20000次左右w3稳定,w2在40000次还不稳定。

代码:

#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<string>
#include<sstream>
#include<stdlib.h>
#include<time.h>
#include<string.h>
using namespace std;


struct Tuple {
string attr1;
string attr2;
string attr3;
string attr4;
string attr5;
};


struct Tuple1 {
float attr1;
float attr2;
float attr3;
float attr4;
string attr5;
};
double weight1[4] = { 0, 0, 0, 0 };
double weight2[4] = { 0, 0, 0, 0 };
double weight3[4] = { 0, 0, 0, 0 };
double bias = 0;
double bias2 = 0;
double bias3 = 0;
int count = 0;
double y = 0;
double y2 = 0;
double y3 = 0;
int error;
int t;
int rep;
int main() {
char fname[255] = "C:\\Users\\Administrator\\Desktop\\train.txt";
ifstream infile;
infile.open(fname, ios::in);
if (!infile) {
cout << "Can not read the training file" << endl;
while (1)
;
return 0;
}
vector<Tuple> tuples;
vector<Tuple1> tuples1;
Tuple tuple;
Tuple1 tuple1;
int remainder = 0;
//Reading data from train.txt
while (!infile.eof()) {


count++;
remainder = count % 5;


switch (remainder) {
case 0:
getline(infile, tuple.attr5, '\n');
tuples.push_back(tuple);
break;
case 1:
getline(infile, tuple.attr1, ',');
break;
case 2:
getline(infile, tuple.attr2, ',');
break;
case 3:
getline(infile, tuple.attr3, ',');
break;
case 4:
getline(infile, tuple.attr4, ',');
break;
}
}


for (vector<Tuple>::size_type i = 0; i != tuples.size(); i++) {


tuple1.attr1 = stof(tuples[i].attr1);
tuple1.attr2 = stof(tuples[i].attr2);
tuple1.attr3 = stof(tuples[i].attr3);
tuple1.attr4 = stof(tuples[i].attr4);
tuple1.attr5 = tuples[i].attr5;
tuples1.push_back(tuple1);
}


//Output the data in train.txt
/*for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) {
cout << tuples1[i].attr1 <<"," <<tuples1[i].attr2<<","  << tuples1[i].attr3 << "," << tuples1[i].attr4 << "," << tuples1[i].attr5 << endl;
}
*/
for (t = 1; t < 40000; t++) {
error = 0;
for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) {
//y = 0;
//y2 = 0;
//y3 = 0;
y = weight1[0] * tuples1[i].attr1 + weight1[1] * tuples1[i].attr2
+ weight1[2] * tuples1[i].attr3
+ weight1[3] * tuples1[i].attr4 + bias;
y2 = weight2[0] * tuples1[i].attr1 + weight2[1] * tuples1[i].attr2
+ weight2[2] * tuples1[i].attr3
+ weight2[3] * tuples1[i].attr4 + bias2;
y3 = weight3[0] * tuples1[i].attr1 + weight3[1] * tuples1[i].attr2
+ weight3[2] * tuples1[i].attr3
+ weight3[3] * tuples1[i].attr4 + bias3;
if (tuples1[i].attr5 == "Iris-setosa") { //判断是不是第一种花
if (y > 0) {
} //判断第一个权值是否合适
else {
weight1[0] = weight1[0] + 0.1 * (tuples1[i].attr1);
weight1[1] = weight1[1] + 0.1 * (tuples1[i].attr2);
weight1[2] = weight1[2] + 0.1 * (tuples1[i].attr3);
weight1[3] = weight1[3] + 0.1 * (tuples1[i].attr4);
bias = bias + 0.1;
}
if (y2 > 0) { //判断第二个权值是否合适
weight2[0] = weight2[0] - 0.2 * (tuples1[i].attr1);
weight2[1] = weight2[1] - 0.2* (tuples1[i].attr2);
weight2[2] = weight2[2] - 0.2* (tuples1[i].attr3);
weight2[3] = weight2[3] - 0.2 * (tuples1[i].attr4);
bias2 = bias2 - 0.2;
} else {
};
if (y3 > 0) { //判断第三个权值是否合适
weight3[0] = weight3[0] - 0.2* (tuples1[i].attr1);
weight3[1] = weight3[1] - 0.2* (tuples1[i].attr2);
weight3[2] = weight3[2] - 0.2* (tuples1[i].attr3);
weight3[3] = weight3[3] - 0.2* (tuples1[i].attr4);
bias3 = bias3 - 0.2;
} else {
};
cout << i << "flower" << endl;
cout << "weight1 is [" << weight1[0] << "," << weight1[1] << ","
<< weight1[2] << "," << weight1[3] << "]" << endl;
cout << "weight2 is [" << weight2[0] << "," << weight2[1] << ","
<< weight2[2] << "," << weight2[3] << "]" << endl;
cout << "weight3 is [" << weight3[0] << "," << weight3[1] << ","
<< weight3[2] << "," << weight3[3] << "]" << endl;
cout << y << "," << y2 << "," << y3 << endl;
cout << "bias:" << bias << "," << bias2 << "," << bias3 << endl;
} else if (tuples1[i].attr5 == "Iris-versicolor") { //判断是不是第二种花
if (y > 0) { //判断第一个权值是否合适
weight1[0] = weight1[0] - 0.1 * (tuples1[i].attr1);
weight1[1] = weight1[1] - 0.1 * (tuples1[i].attr2);
weight1[2] = weight1[2] - 0.1 * (tuples1[i].attr3);
weight1[3] = weight1[3] - 0.1 * (tuples1[i].attr4);
bias = bias - 0.1;
} else {
}
if (y2 > 0) {
} //判断第二个权值是否合适
else {
weight2[0] = weight2[0] + 0.2 * (tuples1[i].attr1);
weight2[1] = weight2[1] + 0.2* (tuples1[i].attr2);
weight2[2] = weight2[2] + 0.2 * (tuples1[i].attr3);
weight2[3] = weight2[3] + 0.2* (tuples1[i].attr4);
bias2 = bias2 + 0.2;
}
if (y3 > 0) { //判断第三个权值是否合适
weight3[0] = weight3[0] - 0.2 * (tuples1[i].attr1);
weight3[1] = weight3[1] - 0.2 * (tuples1[i].attr2);
weight3[2] = weight3[2] - 0.2 * (tuples1[i].attr3);
weight3[3] = weight3[3] - 0.2 * (tuples1[i].attr4);
bias3 = bias3 - 0.2;
} else {
}
cout << i << "flower" << endl;
cout << "weight1 is [" << weight1[0] << "," << weight1[1] << ","
<< weight1[2] << "," << weight1[3] << "]" << endl;
cout << "weight2 is [" << weight2[0] << "," << weight2[1] << ","
<< weight2[2] << "," << weight2[3] << "]" << endl;
cout << "weight3 is [" << weight3[0] << "," << weight3[1] << ","
<< weight3[2] << "," << weight3[3] << "]" << endl;
cout << y << "," << y2 << "," << y3 << endl;
cout << "bias:" << bias << "," << bias2 << "," << bias3 << endl;
} else { //否则就是第三种花
if (y > 0) { //判断第一个权值是否合适
weight1[0] = weight1[0] - 0.1 * (tuples1[i].attr1);
weight1[1] = weight1[1] - 0.1 * (tuples1[i].attr2);
weight1[2] = weight1[2] - 0.1 * (tuples1[i].attr3);
weight1[3] = weight1[3] - 0.1 * (tuples1[i].attr4);
bias = bias - 0.1;
} else {
}
if (y2 > 0) { //判断第二个权值是否合适
weight2[0] = weight2[0] - 0.2 * (tuples1[i].attr1);
weight2[1] = weight2[1] - 0.2 * (tuples1[i].attr2);
weight2[2] = weight2[2] - 0.2 * (tuples1[i].attr3);
weight2[3] = weight2[3] -0.2 * (tuples1[i].attr4);
bias2 = bias2 - 0.2;
} else {
}
if (y3 > 0) {
} //判断第三个权值是否合适
else {
weight3[0] = weight3[0] + 0.2* (tuples1[i].attr1);
weight3[1] = weight3[1] + 0.2 * (tuples1[i].attr2);
weight3[2] = weight3[2] + 0.2 * (tuples1[i].attr3);
weight3[3] = weight3[3] + 0.2 * (tuples1[i].attr4);
bias3 = bias3 + 0.2;


}
cout << i << "flower" << endl;
cout << "weight1 is [" << weight1[0] << "," << weight1[1] << ","
<< weight1[2] << "," << weight1[3] << "]" << endl;
cout << "weight2 is [" << weight2[0] << "," << weight2[1] << ","
<< weight2[2] << "," << weight2[3] << "]" << endl;
cout << "weight3 is [" << weight3[0] << "," << weight3[1] << ","
<< weight3[2] << "," << weight3[3] << "]" << endl;
cout << y << "," << y2 << "," << y3 << endl;
cout << "bias:" << bias << "," << bias2 << "," << bias3 << endl;
}


}
//cout<<"weight1 is ["<<weight1[0]<<","<<weight1[1]<<","<<weight1[2]<<","<<weight1[3]<<"]"<<endl;
//cout<<"weight2 is ["<<weight2[0]<<","<<weight2[1]<<","<<weight2[2]<<","<<weight2[3]<<"]"<<endl;
//cout<<"weight3 is ["<<weight3[0]<<","<<weight3[1]<<","<<weight3[2]<<","<<weight3[3]<<"]"<<endl;
//cout<<"this is the "<<t<<" time training"<<endl;
for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) { //计算MSE决定何时停止训练
//error=0;
y = weight1[0] * tuples1[i].attr1 + weight1[1] * tuples1[i].attr2
+ weight1[2] * tuples1[i].attr3
+ weight1[3] * tuples1[i].attr4 + bias;
y2 = weight2[0] * tuples1[i].attr1 + weight2[1] * tuples1[i].attr2
+ weight2[2] * tuples1[i].attr3
+ weight2[3] * tuples1[i].attr4 + bias2;
y3 = weight3[0] * tuples1[i].attr1 + weight3[1] * tuples1[i].attr2
+ weight3[2] * tuples1[i].attr3
+ weight3[3] * tuples1[i].attr4 + bias3;
if (tuples1[i].attr5 == "Iris-setosa") {
if (y > 0) {
} else {
error = error + (-y);
}
if (y2 > 0) {
error = error + y2;


}
}
if (tuples1[i].attr5 == "Iris-versicolor") {


if (y2 > 0) {
} else {
error = error + (-y2);
}


} else {
if (y2 > 0) {
error = error + y2;


}
if (y3 > 0) {
} else {
error = error + (-y3);
}
}


}


cout << "error is " << error << endl;
cout << "this is " << t << "time" << endl;


if (error < 1000 && t != 1) {
//break;
}
}


}
最后的误差计算还没弄懂,主要是计算权值的那点比较关键。测试重新开了一堆代码,从这里面得到结果后把测试代码的权值改了就行。
#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<string>
#include<sstream>
#include<stdlib.h>
#include<time.h>
#include<string.h>
using namespace std;


struct Tuple {
string attr1;
string attr2;
string attr3;
string attr4;
string attr5;
};


struct Tuple1 {
float attr1;
float attr2;
float attr3;
float attr4;
string attr5;
};
double weight1[4] = {0.06, 0.52, -0.81, -0.34 };
double weight2[4] = {14.3977,-11.5198, -0.501327, -30.6595 };
double weight3[4] = {-7.3401,-56.82, 17.6799, 114.3 };
double bias = 0.1;
double bias2 = -21.8;
double bias3 = -75.6;
int count = 0;
double y = 0;
double y2 = 0;
double y3 = 0;
int error = 0;
int t;
int rep;
int main() {
char fname[255] = "C:\\Users\\Administrator\\Desktop\\test.txt";
ifstream infile;
infile.open(fname, ios::in);
if (!infile) {
cout << "Can not read the test file" << endl;
while (1)
;
return 0;
}
vector<Tuple> tuples;
vector<Tuple1> tuples1;
Tuple tuple;
Tuple1 tuple1;
int remainder = 0;
//Reading data from train.txt
while (!infile.eof()) {


count++;
remainder = count % 5;


switch (remainder) {
case 0:
getline(infile, tuple.attr5, '\n');
tuples.push_back(tuple);
break;
case 1:
getline(infile, tuple.attr1, ',');
break;
case 2:
getline(infile, tuple.attr2, ',');
break;
case 3:
getline(infile, tuple.attr3, ',');
break;
case 4:
getline(infile, tuple.attr4, ',');
break;
}
}


for (vector<Tuple>::size_type i = 0; i != tuples.size(); i++) {


tuple1.attr1 = stof(tuples[i].attr1);
tuple1.attr2 = stof(tuples[i].attr2);
tuple1.attr3 = stof(tuples[i].attr3);
tuple1.attr4 = stof(tuples[i].attr4);
tuple1.attr5 = tuples[i].attr5;
tuples1.push_back(tuple1);
}


//Output the data in train.txt
/*for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) {
cout << tuples1[i].attr1 <<"," <<tuples1[i].attr2<<","  << tuples1[i].attr3 << "," << tuples1[i].attr4 << "," << tuples1[i].attr5 << endl;
}
*/
for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) {
y = weight1[0] * tuples1[i].attr1 + weight1[1] * tuples1[i].attr2
+ weight1[2] * tuples1[i].attr3
+ weight1[3] * tuples1[i].attr4 + bias;
y2 = weight2[0] * tuples1[i].attr1 + weight2[1] * tuples1[i].attr2
+ weight2[2] * tuples1[i].attr3
+ weight2[3] * tuples1[i].attr4 + bias2;
y3 = weight3[0] * tuples1[i].attr1 + weight3[1] * tuples1[i].attr2
+ weight3[2] * tuples1[i].attr3
+ weight3[3] * tuples1[i].attr4 + bias3;
//cout <<i<<","<<y << "," << y2 << "," << y3 << endl;


if (y > 0&&y2<0&&y3<0 ) {
cout << i<<",Iris-setosa" << endl;
} else if ( y < 0 &&y2>0&&y3<0) {
cout <<i<< ",Iris-versicolor" << endl;
} else if ( y< 0&&y2<0&&y3>0) {
cout << i<<",Iris-virginica" << endl;
} else {
cout << i<<",Failed" << endl;
}


}
}

第二种方法表现比较好,只用了两个权向量,先用一个向量区分第一类和第三类,再在这个基础上缩小样本空间用另一个向量区分第二类和第三类,训练次数为5352,两个权值均稳定,测试集有5个错误,准确率83%,代码是在第一个的基础上改的,有很多注释,用的话可以直接删掉。

代码:

#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<string>
#include<sstream>
#include<stdlib.h>
#include<time.h>
#include<string.h>
using namespace std;


struct Tuple {
string attr1;
string attr2;
string attr3;
string attr4;
string attr5;
};


struct Tuple1 {
float attr1;
float attr2;
float attr3;
float attr4;
string attr5;
};
double weight1[4] = { 0, 0, 0, 0 };
double weight2[4] = { 0, 0, 0, 0 };
double weight1tep[4] = { 0, 0, 0, 0 };
double weight2tep[4] = { 0, 0, 0, 0 };
double bias = 0;
double bias2 = 0;
double bias3 = 0;
int count = 0;
double y = 0;
double y2 = 0;
double y3 = 0;
int error;
int t = 1;
int rep;
int m;
int main() {
char fname[255] = "C:\\Users\\Administrator\\Desktop\\train.txt";//read data and input into tuple1
ifstream infile;
infile.open(fname, ios::in);
if (!infile) {
cout << "Can not read the training file" << endl;
while (1)
;
return 0;
}
vector<Tuple> tuples;
vector<Tuple1> tuples1;
Tuple tuple;
Tuple1 tuple1;
int remainder = 0;
//Reading data from train.txt
while (!infile.eof()) {


count++;
remainder = count % 5;


switch (remainder) {
case 0:
getline(infile, tuple.attr5, '\n');
tuples.push_back(tuple);
break;
case 1:
getline(infile, tuple.attr1, ',');
break;
case 2:
getline(infile, tuple.attr2, ',');
break;
case 3:
getline(infile, tuple.attr3, ',');
break;
case 4:
getline(infile, tuple.attr4, ',');
break;
}
}


for (vector<Tuple>::size_type i = 0; i != tuples.size(); i++) {


tuple1.attr1 = stof(tuples[i].attr1);
tuple1.attr2 = stof(tuples[i].attr2);
tuple1.attr3 = stof(tuples[i].attr3);
tuple1.attr4 = stof(tuples[i].attr4);
tuple1.attr5 = tuples[i].attr5;
tuples1.push_back(tuple1);
}//fining reading data and ready to train


//Output the red data
/*for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) {
cout << tuples1[i].attr1 <<"," <<tuples1[i].attr2<<","  << tuples1[i].attr3 << "," << tuples1[i].attr4 << "," << tuples1[i].attr5 << endl;
}
*/
for (t = 1; t < 20001; t++) {//loop of training


for (m = 0; m < 4; m++) {//this is for recoding the weight value, if the weight never change, break loop


weight1tep[m] = weight1[m];
weight2tep[m] = weight2[m];
}
for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) {//starting retrive the training data
//y = 0;
//y2 = 0;
//y3 = 0;
y = weight1[0] * tuples1[i].attr1 + weight1[1] * tuples1[i].attr2
+ weight1[2] * tuples1[i].attr3
+ weight1[3] * tuples1[i].attr4 + bias;
y2 = weight2[0] * tuples1[i].attr1 + weight2[1] * tuples1[i].attr2
+ weight2[2] * tuples1[i].attr3
+ weight2[3] * tuples1[i].attr4 + bias2;
/*y3 = weight3[0] * tuples1[i].attr1 + weight3[1] * tuples1[i].attr2
+ weight3[2] * tuples1[i].attr3
+ weight3[3] * tuples1[i].attr4 + bias3;*/
if (tuples1[i].attr5 == "Iris-setosa") { //read the lable of trained data
if (y > 0) {
}//judge and adjust weight1
else {
weight1[0] = weight1[0] + 0.1 * (tuples1[i].attr1);
weight1[1] = weight1[1] + 0.1 * (tuples1[i].attr2);
weight1[2] = weight1[2] + 0.1 * (tuples1[i].attr3);
weight1[3] = weight1[3] + 0.1 * (tuples1[i].attr4);
bias = bias + 0.1;
}
/*if (y2 > 0) { //判断第二个权值是否合适
weight2[0] = weight2[0] - 0.2 * (tuples1[i].attr1);
weight2[1] = weight2[1] - 0.2* (tuples1[i].attr2);
weight2[2] = weight2[2] - 0.2* (tuples1[i].attr3);
weight2[3] = weight2[3] - 0.2 * (tuples1[i].attr4);
bias2 = bias2 - 0.2;
} else {
};
if (y3 > 0) { //判断第三个权值是否合适
weight3[0] = weight3[0] - 0.2* (tuples1[i].attr1);
weight3[1] = weight3[1] - 0.2* (tuples1[i].attr2);
weight3[2] = weight3[2] - 0.2* (tuples1[i].attr3);
weight3[3] = weight3[3] - 0.2* (tuples1[i].attr4);
bias3 = bias3 - 0.2;
} else {
};*/
//cout << i << "flower" << endl;
//cout << "weight1 is [" << weight1[0] << "," << weight1[1] << ","
//<< weight1[2] << "," << weight1[3] << "]" << endl;
//cout << "weight2 is [" << weight2[0] << "," << weight2[1] << ","
//<< weight2[2] << "," << weight2[3] << "]" << endl;
//cout << "weight3 is [" << weight3[0] << "," << weight3[1] << ","
//<< weight3[2] << "," << weight3[3] << "]" << endl;
//cout << y << "," << y2 << endl;
//cout << "bias:" << bias << "," << bias2 << endl;
} else if (tuples1[i].attr5 == "Iris-versicolor") { //read the lable of trained data
if (y > 0) { //judge and adjust weight1
weight1[0] = weight1[0] - 0.1 * (tuples1[i].attr1);
weight1[1] = weight1[1] - 0.1 * (tuples1[i].attr2);
weight1[2] = weight1[2] - 0.1 * (tuples1[i].attr3);
weight1[3] = weight1[3] - 0.1 * (tuples1[i].attr4);
bias = bias - 0.1;
} else {
}
if (y2 > 0) {
} //judge and adjust weight2
else {
weight2[0] = weight2[0] + 0.1 * (tuples1[i].attr1);
weight2[1] = weight2[1] + 0.1 * (tuples1[i].attr2);
weight2[2] = weight2[2] + 0.1 * (tuples1[i].attr3);
weight2[3] = weight2[3] + 0.1 * (tuples1[i].attr4);
bias2 = bias2 + 0.1;
}
/*if (y3 > 0) { //判断第三个权值是否合适
weight3[0] = weight3[0] - 0.2 * (tuples1[i].attr1);
weight3[1] = weight3[1] - 0.2 * (tuples1[i].attr2);
weight3[2] = weight3[2] - 0.2 * (tuples1[i].attr3);
weight3[3] = weight3[3] - 0.2 * (tuples1[i].attr4);
bias3 = bias3 - 0.2;
} else {
}*/
//cout << i << "flower" << endl;
//cout << "weight1 is [" << weight1[0] << "," << weight1[1] << ","
//<< weight1[2] << "," << weight1[3] << "]" << endl;
//cout << "weight2 is [" << weight2[0] << "," << weight2[1] << ","
//<< weight2[2] << "," << weight2[3] << "]" << endl;
//cout << "weight3 is [" << weight3[0] << "," << weight3[1] << ","
//<< weight3[2] << "," << weight3[3] << "]" << endl;
//cout << y << "," << y2 << endl;
//cout << "bias:" << bias << "," << bias2 << endl;
} else { //realize the class of trained data
if (y > 0) { //judge and adjust weight1
weight1[0] = weight1[0] - 0.1 * (tuples1[i].attr1);
weight1[1] = weight1[1] - 0.1 * (tuples1[i].attr2);
weight1[2] = weight1[2] - 0.1 * (tuples1[i].attr3);
weight1[3] = weight1[3] - 0.1 * (tuples1[i].attr4);
bias = bias - 0.1;
} else {
}
if (y2 > 0) { //judge and adjust weight2
weight2[0] = weight2[0] - 0.1 * (tuples1[i].attr1);
weight2[1] = weight2[1] - 0.1 * (tuples1[i].attr2);
weight2[2] = weight2[2] - 0.1 * (tuples1[i].attr3);
weight2[3] = weight2[3] - 0.1 * (tuples1[i].attr4);
bias2 = bias2 - 0.1;
} else {
}
/*if (y3 > 0) {
} //判断第三个权值是否合适
else {
weight3[0] = weight3[0] + 0.2* (tuples1[i].attr1);
weight3[1] = weight3[1] + 0.2 * (tuples1[i].attr2);
weight3[2] = weight3[2] + 0.2 * (tuples1[i].attr3);
weight3[3] = weight3[3] + 0.2 * (tuples1[i].attr4);
bias3 = bias3 + 0.2;


}*/
//cout << i << "flower" << endl;
//cout << "weight3 is [" << weight3[0] << "," << weight3[1] << ","
//<< weight3[2] << "," << weight3[3] << "]" << endl;
//cout << y << "," << y2 << endl;
}


}
//cout<<"weight1 is ["<<weight1[0]<<","<<weight1[1]<<","<<weight1[2]<<","<<weight1[3]<<"]"<<endl;
//cout<<"weight2 is ["<<weight2[0]<<","<<weight2[1]<<","<<weight2[2]<<","<<weight2[3]<<"]"<<endl;
//cout<<"weight3 is ["<<weight3[0]<<","<<weight3[1]<<","<<weight3[2]<<","<<weight3[3]<<"]"<<endl;
//cout<<"this is the "<<t<<" time training"<<endl;
/*for (vector<Tuple1>::size_type i = 0; i != tuples1.size(); ++i) { //计算MSE决定何时停止训练
//error=0;
y = weight1[0] * tuples1[i].attr1 + weight1[1] * tuples1[i].attr2
+ weight1[2] * tuples1[i].attr3
+ weight1[3] * tuples1[i].attr4 + bias;
y2 = weight2[0] * tuples1[i].attr1 + weight2[1] * tuples1[i].attr2
+ weight2[2] * tuples1[i].attr3
+ weight2[3] * tuples1[i].attr4 + bias2;
y3 = weight3[0] * tuples1[i].attr1 + weight3[1] * tuples1[i].attr2
+ weight3[2] * tuples1[i].attr3
+ weight3[3] * tuples1[i].attr4 + bias3;*/
/*if (tuples1[i].attr5 == "Iris-setosa") {
if (y > 0) {
} else {
error = error + (-y);
}
if (y2 > 0) {
error = error + y2;


}
}
if (tuples1[i].attr5 == "Iris-versicolor") {


if (y2 > 0) {
} else {
error = error + (-y2);
}


} else {
if (y2 > 0) {
error = error + y2;


}
if (y3 > 0) {
} else {
error = error + (-y3);
}
}


}


//cout << "error is " << error << endl;
cout << "this is " << t << "time" << endl;


}*/
cout << "weight1 is [" << weight1[0] << "," << weight1[1] << ","//output weight and bias
<< weight1[2] << "," << weight1[3] << "]" << endl;
cout << "weight2 is [" << weight2[0] << "," << weight2[1] << ","
<< weight2[2] << "," << weight2[3] << "]" << endl;
cout << "bias:" << bias << "," << bias2 << endl;
cout << "this is " << t << " time" << endl;
if (weight1tep[0] == weight1[0] && weight2tep[0] == weight2[0]//if the weight never change, break loop
&& weight1tep[1] == weight1[1] && weight2tep[1] == weight2[1]
&& weight1tep[2] == weight1[2] && weight2tep[2] == weight2[2]
&& weight1tep[3] == weight1[3] && weight2tep[3] == weight2[3]) {
break;
}
}


}

测试代码把权值输入进去了把不要的删了就行了,第一次神经网络作业,弄了两个晚上,女朋友都没陪好,赶紧赎罪去哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值