在以前的内容中,我们学习到了KNN分类算法。其中:分类(Classification)指 Y变量为类别型(categorical variable),如:颜色类别,电脑品牌,有无信誉。
今天学习的线性回归算法,其中: 回归(regression) 指 Y变量为连续数值型(continuous numerical variable),如:房价,人数,降雨量。
一、简单线性回归
1-1、简单线性回归
- 很多做决定过程通常是根据两个或者多个变量之间的关系
- 回归分析 (regression analysis) 用来建立方程模拟两个或者多个变量之间如何关联
- 被预测的变量叫做:因变量(dependent variable), y, 输出(output)
- 被用来进行预测的变量叫做: 自变量(independent variable), x, 输入(input)
1-2、 简单线性回归介绍
-
简单线性回归包含一个自变量(x)和一个因变量(y)
-
以上两个变量的关系用一条直线来模拟
-
如果包含两个以上的自变量,则称作多元回归分析(multiple regression)
1-3. 简单线性回归模型
-
被用来描述因变量(y)和自变量(X)以及偏差(error)之间关系的方程叫做回归模型
-
简单线性回归的模型是:
y: 样本的预测值,即回归模型中的应变量
x: 样本的特征数值,即回归模型中的自变量
ε: 回归模型中的误差项,误差项说明了包含在y里面,但不能被x与y之间线性关系解释的变异性
本质:寻找一条直线,最大程度地去拟合样本特征和样本输出标记之间的关系
二、最小二乘法推导
普通
首先,我们的目标是,找到a和b,使得损失函数:
尽可能的小。
这里,将简单线性问题转为最优化问题。下面对函数的各个位置分量求导,导数为0的地方就是极值:
然后mb提到等号前面,两边同时除以m,等号右面的每一项相当于均值。
这样在实现的时候简单很多。
最终我们通过最小二乘法得到a、b的表达式:
向量
将式
改为矩阵表示
将转置放到括号里面
相乘展开
求梯度
最后一项转置写开
合并
求梯度的驻点,
最终得到参数θ的解析式
为什么不使用最小二乘法
上节对最小二乘法进行了理论上的推导,得到的结果可以说是很漂亮的,但是在实际的操作中却不常使用,原因如下:
三、简单线性回归代码实现
参考链接:https://blog.csdn.net/zhaodedong/article/details/102855126
四、多元线性回归
4-1、什么是多元线性回归
在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。
4-2、推导
4-3、代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
#加载数据集
boston=datasets.load_boston()
X = boston.data
y = boston.target
X = X[y < 50.0]
y = y[y < 50.0]
#加载自己的模块
from playML.LinearRegression import LinearRegression
reg = LinearRegression() #实例化过程
reg.fit_normal(X_train,y_train) #训练数据集的过程
reg.coef_ #查看相应的特征属性值
'''
array([-1.18919477e-01, 3.63991462e-02, -3.56494193e-02, 5.66737830e-02,
-1.16195486e+01, 3.42022185e+00, -2.31470282e-02, -1.19509560e+00,
2.59339091e-01, -1.40112724e-02, -8.36521175e-01, 7.92283639e-03,
-3.81966137e-01])
'''
reg.intercept_ #截距:34.16143549624022
reg.score(x_test,y_test) #查看算法的准确性 :0.8129802602658537
使用sklearn实现线性回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
#加载数据
boston=datasets.load_boston()
X = boston.data
y = boston.target
#数据预处理过程,去掉边界上的点
X = X[y < 50.0]
y = y[y < 50.0]
#采用自己写的分割方法对原始数据进行分割,分割成为训练数据和测试数据
from playML.model_selection import train_test_split
X_train,x_test,y_train,y_test=train_test_split(X,y,seed=666)
#导入相应的模块
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
#特征参数的值
lin_reg.coef_
'''
array([-1.18919477e-01, 3.63991462e-02, -3.56494193e-02, 5.66737830e-02,
-1.16195486e+01, 3.42022185e+00, -2.31470282e-02, -1.19509560e+00,
2.59339091e-01, -1.40112724e-02, -8.36521175e-01, 7.92283639e-03,
-3.81966137e-01])
'''
#截距
lin_reg.intercept_ #34.16143549624665
#测试算法的准确度 R Squared
lin_reg.score(x_test,y_test) #0.8129802602658495
来源:oschina
链接:https://my.oschina.net/u/3938912/blog/3208149