Oh my god!居然有人看我的博文!所以,我加上了注释,并做了一点修改。
#include <iostream>
using namespace std;
double w = 0.0001; // 最小误差
double r = 0.00001; // 步长(学习效率)
double a = 1.0,b = 0.0; // 权重,偏置值
// 数学模型
double f(double x)
{
double res;
res = a*x + b;
return res;
}
// 训练
void df(double x,double y)
{
double t1,t2; // t1:a增加r时,预测值与实际值的差距;t2:b增加r时,预测值与实际值的差距
int n; // 改变符号的作用
// 用max函数代替了绝对值函数(主要是想不起来了)
// 重复修改权重与偏置值直到预测值与实际值的差距小于最小误差
while(max((f(x) - y),(y - f(x))) > w)
{
cout << "errors:" << max((f(x)-y),(y-f(x))) << " a:" << a << " b:" << b << endl;
if(f(x) < y) // 预测值比正确值小
{
n = 1.0; // 权重,偏置值要增加
}
else // 预测值比正确值大
{
n = -1.0; // 权重,偏置值要减少
}
t1 = max(((f(x)+x*r*n) - y),(y - (f(x)+x*r*n)));
t2 = max(((f(x)+r*n) - y),(y - (f(x)+r*n)));
// 更快的接近真实值
if(t1 < t2)
{
a += r*n;
}
else
{
b += r*n;
}
}
cout << "Train over!" << endl;
}
int main()
{
string s;
double x,y;
// 重复进行训练与预测,输入over结束
while(true)
{
cin >> s;
if(s == "in")
{
cin >> x >> y;
df(x,y);
}
else if(s == "out")
{
cin >> x;
cout << f(x) << endl;
}
else if(s == "over")
{
return 0;
}
else
{
cout << "Error";
}
}
}
训练:
输入格式
in x y
预测:
输入格式
out x
控制台会输出预测的y。
我的思路是否正确,恳请大佬指教。最主要是我看到的教程,一开始就在讲之后可能遇见的问题,我看得一愣一愣的,只能靠自己的理解写。