添加第73行,其他不变。
#include <iostream>
#include <vector>
using namespace std;
// 所有数组下标0不用
vector<double> w; // 权重
double b = 0.0; // 偏置值
double eps = 0.001; // 最小误差
double r = 0.0001; // 步长
// 权值初始化
void w_init(int many)
{
for(int i = 0;i <= many;i++)
{
w.push_back(0.0);
}
}
// 数学模型
double f(vector<double> x) // 将多个输入组合成向量
{
double res = 0.0;
for(int i = 1;i <= w.size()-1;i++)
{
res += x[i]*w[i];
}
res += b;
return res;
}
// 计算改变w[i]时的误差t[i]
void rt(vector<double> &t,vector<double> x,double y,double h)
{
for(int i = 1;i <= w.size()-1;i++)
{
t.push_back(max((f(x)+x[i]*r*h)-y,y-(f(x)+x[i]*r*h)));
}
}
// 训练(思路与之前一致,重点在改变哪个权重)
void df(vector<double> x,double y)
{
while(max(f(x)-y,y-f(x)) > eps)
{
// 预测值是大了还是小了
double h;
if(f(x)-y < 0)
{
h = 1.0; // 小了,权重加
}
else
{
h = -1.0; // 大了,权重减
}
vector<double> t; // 改变w[i]时的误差t[i]
t.push_back(114514.114514); // 下标0不用
rt(t,x,y,h); // 训练
int n = 1; // w[n]改变时,预测值与真实值相差最少。
// 打擂台的方式找最小值
double ans = t[1];
for(int i = 2;i <= t.size()-1;i++)
{
if(t[i] < ans)
{
n = i;
ans = t[i];
}
}
// 接下来判断偏置值
double tb = max((f(x)+r*h)-y,y-(f(x)+r*h)); // 用max函数代替绝对值函数
if(tb < ans)
{
b += r*h;
}
else
{
w[n] += r*h;
}
cout << "error:" << max(f(x)-y,y-f(x)) << endl;
}
}
int main()
{
string s;
double xi,y;
int many,n;
cin >> many;
w_init(many);
while(true)
{
vector<double> x;
x.push_back(114514.114514);
cin >> s;
// 停止
if(s == "stop")
{
return 0;
}
// 输入测试样例
else if(s == "in")
{
for(int i = 1;i <= many;i++)
{
cin >> xi;
x.push_back(xi);
}
cin >> y;
cout << "Train strat" << endl;
df(x,y);
cout << "Train over!" << endl;
}
// 输出预测结果
else if(s == "out")
{
for(int i = 1;i <= many;i++)
{
cin >> xi;
x.push_back(xi);
}
cout << f(x) << endl;
}
}
}