机器学习经典算法笔记——线性回归

最小二乘法

这里的目标是找出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=0m(yiaxib)2

即对a,b分别进行求导=0,得到以下的结果:
b = y ‾ − a x ‾ b = \overline{y} - a\overline{x} b=yax
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)2xxi)i=1m(xiyixiy)
化简一下
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(xix)2i=1m(xix)(yiy)

实现简单的线性回归

这里的代码部分相对比较简单就不用赘述了,这里需要注意的是np.dot(a,b)实现a,b点乘的时候,如果a,b都是向量,而非矩阵的话,是对应位相乘最后相加,是矩阵的话这里就需要m*n * n*s符合这个要求才能相乘,第一个矩阵的列和第二个矩阵的行数相等。点乘比for循环快很多。

回归算法的评价

  1. 均方误差(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=1m(ytestiy^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
  2. 均方根误差(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=1m(ytestiy^testi)2 =MSEtest
  3. 平均绝对误差(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=1mytestiy^testi
  4. 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=1i=1m(yyi)2i=1m(y^iyi)2=1Var(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(yyi)2),此时,可能我们的数据不存在任何线性关系。上式中var为方差。

多元线性回归

之前我们考虑只有一个特征,实际上我们碰到的基本上都是多个特征,所以这里我们也要考虑多个参数,对于一个n个特征的方程,我们假设theta0 == 1 为了方便计算,这里和我前面提到的梯度下降算法是一样的原理。

我们的目标是: ( y − X b θ ) T ( y − X b θ ) (y-X_b\theta)^T(y-X_b\theta) (yXbθ)T(yXbθ) 尽可能的小

θ = ( 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)

本章到此结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值