样本从csv文件中读出
迭代10次,学习率为0.001
结果为:
样本集:
x1 x2 y
34.6 78 0
30.2 43.8 0
35.8 72.9 0
60.1 86.3 1
79 75.3 1
45 56.3 0
61.1 96.5 1
75 46.5 1
76 87.4 1
84.4 43.5 1
95.8 38.2 0
75 30.6 0
#include <iostream> #include <fstream> #include <sstream> #include <string> #include <vector> #include <utility> using namespace std; vector<vector<double>> v_data; double h_theta(double z) { double h = 1 / (1 + (exp(-z))); return h; } double stringToDouble(string num) { bool minus = false; //标记是否是负数 string real = num; //real表示num的绝对值 if (num.at(0) == '-') { minus = true; real = num.substr(1, num.size() - 1); } char c; int i = 0; double result = 0.0, dec = 10.0; bool isDec = false; //标记是否有小数 unsigned long size = real.size(); while (i < size) { c = real.at(i); if (c == '.') {//包含小数 isDec = true; i++; continue; } if (!isDec) { result = result * 10 + c - '0'; } else {//识别小数点之后都进入这个分支 result = result + (c - '0') / dec; dec *= 10; } i++; } if (minus == true) { result = -result; } return result; } string Trim(string& str) { //str.find_first_not_of(" \t\r\n"),在字符串str中从索引0开始,返回首次不匹配"\t\r\n"的位置 str.erase(0, str.find_first_not_of(" \t\r\n")); str.erase(str.find_last_not_of(" \t\r\n") + 1); return str; } void read_csv(string filename) { ifstream fin(filename); //打开文件流操作 string line; while (getline(fin, line)) //整行读取,换行符“\n”区分,遇到文件尾标志eof终止读取 { cout << "原始字符串:" << line << endl; //整行输出 istringstream sin(line); //将整行字符串line读入到字符串流istringstream中 vector<string> fields; //声明一个字符串向量 string field; while (getline(sin, field, ',')) //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符 { fields.push_back(field); //将刚刚读取的字符串添加到向量fields中 } pair<double, double> p; string one = Trim(fields[0]); //清除掉向量fields中第一个元素的无效字符,并赋值给变量name string two = Trim(fields[1]); //清除掉向量fields中第二个元素的无效字符,并赋值给变量age string three = Trim(fields[2]); //清除掉向量fields中第三个元素的无效字符,并赋值给变量birthday cout << "处理之后的字符串:" << one << "\t" << two << "\t" << three << endl; double frist_data = stringToDouble(one); double second_data = stringToDouble(two); double three_data = stringToDouble(three); vector<double> v_rows; v_rows.push_back(1); v_rows.push_back(frist_data); v_rows.push_back(second_data); v_rows.push_back(three_data); v_data.push_back(v_rows); } //return EXIT_SUCCESS; } void Gradient() { double study_alpha = 0.001; int v_data_size = v_data.size(); double *theta = new double[3]; for (int i = 0;i < 3;i++) { theta[i] = 0; } int step_time = 0; int flag = 0; while (step_time < 10) { double *theta_copy = new double[3]; for (int j = 0;j < 3;j++) { double total = 0.0; for (int i = 1;i <=v_data_size;i++) { double z = 0.0; for (int h = 0;h < 3;h++) { z = z + theta[h] * v_data[i-1][h]; } // cout << "z value" << z << endl; total = total + (h_theta(z) - v_data[i-1][3])*v_data[i-1][j]; } // cout << "这是total" << total << endl; theta_copy[j] = theta[j] - (1.0/v_data.size())*study_alpha*total; //cout << "j" <<j<<endl; } for (int p = 0;p < 3;p++) { theta[p] = theta_copy[p]; //cout << "theta" << theta[p] << endl; } step_time++; delete[] theta_copy; } for (int t = 0;t < 3;t++) { cout << "theta" << t << " : " << theta[t] << endl; } } int main() { string filename = "sample.csv"; read_csv(filename); Gradient(); }