机器学习算法(四)—— 线性回归算法

大憨熊 提交于 2020-03-22 09:52:29

3 月,跳不动了?>>>

在以前的内容中,我们学习到了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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!