最小二乘法
这里的目标是找出a,b,使得下面J的尽可能小:
J
(
a
,
b
)
=
∑
i
=
0
m
(
y
i
−
a
x
i
−
b
)
2
J(a,b) = \sum_{i=0}^m (y^i - ax^i -b)^2
J(a,b)=i=0∑m(yi−axi−b)2
即对a,b分别进行求导=0,得到以下的结果:
b
=
y
‾
−
a
x
‾
b = \overline{y} - a\overline{x}
b=y−ax
a
=
∑
i
=
1
m
(
x
i
y
i
−
x
i
y
‾
)
∑
i
=
1
m
(
(
x
i
)
2
−
x
‾
x
i
)
a = \frac{\sum_{i=1}^m (x^iy^i - x^i \overline{y})}{\sum_{i=1}^m ((x^i)^2-\overline{x}x^i)}
a=∑i=1m((xi)2−xxi)∑i=1m(xiyi−xiy)
化简一下
a
=
∑
i
=
1
m
(
x
i
−
x
‾
)
(
y
i
−
y
‾
)
∑
i
=
1
m
(
x
i
−
x
‾
)
2
a = \frac{\sum_{i=1}^m (x^i - \overline{x})(y^i - \overline{y})}{\sum_{i=1}^m (x^i-\overline{x})^2}
a=∑i=1m(xi−x)2∑i=1m(xi−x)(yi−y)
实现简单的线性回归
这里的代码部分相对比较简单就不用赘述了,这里需要注意的是np.dot(a,b)
实现a,b点乘的时候,如果a,b都是向量,而非矩阵的话,是对应位相乘最后相加,是矩阵的话这里就需要m*n * n*s
符合这个要求才能相乘,第一个矩阵的列和第二个矩阵的行数相等。点乘比for循环快很多。
回归算法的评价
- 均方误差(MSE)
1 m ∑ i = 1 m ( y t e s t i − y ^ t e s t i ) 2 \frac{1}{m} \sum_{i=1}^m (y^i_{test} - \hat{y}^i_{test})^2 m1i=1∑m(ytesti−y^testi)2
其中 y t e s t i y^i_{test} ytesti是测试数据集, y ^ t e s t i \hat{y}^i_{test} y^testi是预测出的结果,也就是说开始通过训练数据集预测出a,b,后面通过a,b得出 y ^ t e s t i \hat{y}^i_{test} y^testi。 - 均方根误差(RMSE)
1 m ∑ i = 1 m ( y t e s t i − y ^ t e s t i ) 2 = M S E t e s t \sqrt{ \frac{1}{m} \sum_{i=1}^m (y^i_{test} - \hat{y}^i_{test})^2 } = \sqrt{MSE_{test}} m1i=1∑m(ytesti−y^testi)2=MSEtest - 平均绝对误差(MAE)
1 m ∑ i = 1 m ∣ y t e s t i − y ^ t e s t i ∣ \frac{1}{m} \sum_{i=1}^m |y^i_{test} - \hat{y}^i_{test}| m1i=1∑m∣ytesti−y^testi∣ - R Squared
R 2 = 1 − ∑ i = 1 m ( y ^ i − y i ) 2 ∑ i = 1 m ( y ‾ − y i ) 2 = 1 − M S E ( y ^ , y ) V a r ( y ) R^2 = 1- \frac{\sum_{i=1}^m (\hat{y}^i - y^i)^2}{\sum_{i=1}^m (\overline{y}-y^i)^2} = 1-\frac{MSE(\hat{y},y)}{Var(y)} R2=1−∑i=1m(y−yi)2∑i=1m(y^i−yi)2=1−Var(y)MSE(y^,y)
R 2 R^2 R2 越大越好。 R 2 R^2 R2最大值为1,当模型不犯任何错误的时候,当模型=基准模型的时候, R 2 R^2 R2=0
当 R 2 R^2 R2<0时,说明我们的模型不如基准模型( ∑ i = 1 m ( y ‾ − y i ) 2 \sum_{i=1}^m (\overline{y}-y^i)^2 ∑i=1m(y−yi)2),此时,可能我们的数据不存在任何线性关系。上式中var为方差。
多元线性回归
之前我们考虑只有一个特征,实际上我们碰到的基本上都是多个特征,所以这里我们也要考虑多个参数,对于一个n个特征的方程,我们假设theta0 == 1 为了方便计算,这里和我前面提到的梯度下降算法是一样的原理。
我们的目标是: ( y − X b θ ) T ( y − X b θ ) (y-X_b\theta)^T(y-X_b\theta) (y−Xbθ)T(y−Xbθ) 尽可能的小
θ
=
(
X
b
T
X
b
)
−
1
X
b
T
y
\theta = (X_b^TX_b)^{-1}X_b^Ty
θ=(XbTXb)−1XbTy
问题:时间复杂度高:
O
(
n
3
)
O(n^3)
O(n3),优点是不需要进行归一化处理
下面写一下最主要部分的代码
def fit(X_train, y_train):
X_b = np.hstack([np.ones(len(X_train),1),X_train])
theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
return theta
scikit-learn中使用线性回归
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
lin_reg.coef_ # 这里也就是K的值,矩阵
lin_reg.intercept_ # 这里是 b的值,就一个数
lin_reg.score(X_test, y_test)
本章到此结束