题目:
思路: 这其实就是最小二乘法的一个简单实践,我们通过梯度下降来让均方误差最小。
接下来我们用C++进行编程:
#include<iostream>
using namespace std;
int main()
{
vector<int> x = {1, 2, 3, 4};
vector<int> y = {6, 5, 7, 10};
int n = x.size();
double a = 0, b = 0, lr = 0.001;
while(true)
{
double g_a = 0, g_b = 0;
for(int i = 0; i < n; i++)
{
g_a += 2 * x[i] * (a * x[i] + b - y[i]);
g_b += 2 * (a * x[i] + b - y[i]);
}
g_a /= n;
g_b /= n;
a = a - lr * g_a;
b = b - lr * g_b;
double loss = 0;
for(int i = 0; i < n; i++)
{
loss += pow((a * x[i] + b - y[i]), 2);
}
if(loss < 4.2)
break;
}
cout << a << endl;
cout << b << endl;
}