### 基础公式
1、线性回归方程为:$y=ax+b$
2、损失函数 $loss=\sum_i{(w*x_i+b-y_i)^2}$
### 求解回归问题
1、先随机初始化一个$w$和$b$,然后求解出$w'$和$b'$,然后根据求导的方向再更新w和b。
2、已知有1000个数据点[(x0,y0),(x1,y1)....(x1000,y1000)]
3、把1000个数据点带入$loss$公式,求得loss
具体代码如下
```py
def compute_error_for_line_given_points(b, w, points):
totalError = 0
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
# computer mean-squared-error
totalError += (y - (w * x + b)) ** 2
# average loss for each point
return totalError / float(len(points))
```
4、求$loss$对$w$导数 (gradient)
$\frac{\partial loss}{\partial w}=2\sum_i(wx_i+b-y_i)x_i$
5、求$loss$对$b$导数 (gradient)
$\frac{\partial loss}{\partial b}=2\sum_i(wx_i+b-y_i)$
6、求解新的w和b(learningRate 为前进的步长,gradient可以求一个平均值)
$new_w=w-learningRate*\frac{\partial loss}{\partial w}$
$new_b=b-learningRate*\frac{\partial loss}{\partial b}$
具体代码如下:
```py
def step_gradient(b_current, w_current, points, learningRate):
b_gradient = 0
w_gradient = 0
N = float(len(points))
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
# grad_b = 2(wx+b-y)
b_gradient += (2/N) * ((w_current * x + b_current) - y)
# grad_w = 2(wx+b-y)*x
w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
# update w'
new_b = b_current - (learningRate * b_gradient)
new_w = w_current - (learningRate * w_gradient)
return [new_b, new_w]
```
7、最后反复用求得的w和b计算loss,求得最好的loss,从而得到最好的w和b。

回归问题