公号:码农充电站pro
主页:https://codeshellme.github.io

目录

  • 1,解方程组
  • 2,线性回归模型
  • 3,线性拟合
  • 4,最小二乘法
  • 5,用 numpy 库进行矩阵运算
  • 6,sklearn 对线性回归的实现
  • 7,对波士顿房价进行线性分析
  • 8,总结

线性回归模型用于处理回归问题,也就是预测连续型数值。线性回归模型是最基础的一种回归模型,理解起来也很容易,我们从解方程组谈起。

1,解方程组

相信大家对解方程都不陌生,这是我们初中时期最熟悉的数学知识。

假如我们有以下方程组:

  • 2x + y = 3 —— ①
  • 5x - 2y = 7 —— ②

要解上面这个方程组,我们可以将第一个方程的等号两边都乘以2:

  • 4x + 2y = 6 —— ③

再将第2 个方程与第3 个方程的等号两边分别相加:

  • 9x = 13 —— ④

这样我们就将变量y 消去了,就可以求解出x 的值。然后再将x 的值代入第1或第2个方程中,就可以解出y 的值。

以上这个解方程的过程就是高斯消元法

2,线性回归模型

如果将上面方程组中的任意一个表达式单拿出来,那么xy 都是一种线性关系,比如:

  • y = 3 - 2x

该表达式中,我们将x 叫做自变量y 叫作因变量

如果将其扩展到机器学习中,那么特征集就相当于自变量X目标集就相当于因变量Y

当自变量的个数大于1时,就是多元回归;当因变量的个数大于1 时,就是多重回归

线性回归模型的目的就是想找出一种特征集目标集之间的线性关系,使得我们可以通过已知的特征数据预测出目标数据。

通常,我们的模型是通过多个特征值来预测一个目标值,那么线性回归模型的数学公式为:

其中:

  • y 表示我们要预测的目标值。
  • x1,x2…xn 代表每个特征,一共有n 个特征。
  • b1,b2…bn 代表每个特征的系数,特征系数也代表了某个特征对目标值的影响。
  • b0 是一个常数,称为截距。
  • ε 表示模型的误差,也被称作损失函数。

线性回归模型与数学中的解方程不同,后者的结果是精确解,而前者则是一个近似解。因此在公式中存在一个 ε

我们的目标是求得一组使得 ε 最小的特征系数(b1,b2…bn),当有了新的特征时,就可以根据特征系数求得预测值。

回归一词的来源

1875 年,英国科学家弗朗西·斯高尔顿(达尔文的表弟)尝试寻找父代身高与子代身高之间的关系。

在经过了1078 份数据的分析之后,最终他得出结论:人类的身高维持在相对稳定的状态,他称之为回归效应,并给出了历史上第一个回归公式:

  • Y = 0.516X + 33.73

公式中的 Y 代表子代身高,X 代表父代身高,单位为英寸。

3,线性拟合

线性拟合中不存在精确解,但是存在最优解,也就是使得 ε 最小的解。

上图中有3 个坐标系:

  • 在第1个图中只有两个点,这时候存在一条唯一的直线能够同时穿过这两个点,这条直线就是精确解。
  • 当坐标中的点多于两个时,比如第2个图,这时候就不可能存在一条直线,同时穿过这些点。但是会存在多条直线,会尽可能多的穿过更多的点,就像图3。而这些直线中会有一条直线,是这些点的最好的拟合

如何才能找到这条最好的拟合的直线呢?

4,最小二乘法

最小二乘法可以用来求解这个最优直线。

最小二乘法的主要思想是让真实值预测值之差(即误差)的平方和达到最小。用公式表示如下:


上面的公式中:

  • yi 是数据的真实值。
  • y^ 是数据的预测值。
  • ε 是我们要找的最小误差,它是所有的真实值与预测值之差的平方的和。

方程组除了可以使用高斯消元法求解之外,还可以使用矩阵来求解。

将上面的 ε 公式写成矩阵的形式就是:


其中:

  • B 为系数矩阵
  • X 为特征矩阵
  • Y 为目标矩阵

我们的目标就是找到一个向量B,使得向量 XB 与 Y 之间欧氏距离的平方数最小。

经过一系列的推导之后,系数矩阵B 为:


其中:

  • X'X 的转置矩阵。
  • (X'X)-1(X'X) 的逆矩阵。

5,用 numpy 库进行矩阵运算

NumPy 是一个使用Python 进行科学计算的软件包,其中就实现了我们需要的矩阵运算:

  • x.transpose():矩阵x 的转置运算。
  • x.dot(y):矩阵x 点乘矩阵y。
  • x.I:返回可逆矩阵x 的逆矩阵。

那么根据公式:

我们可以编写求B 的函数:

def get_B(X, Y):_X = X.transpose()B = (_X.dot(X)).I.dot(_X).dot(Y)return B

假设我们有以下数据集,要对该数据集进行线性拟合:

特征x1 特征x2 目标y
0 1 1.4
1 -1 -0.48
2 8 13.2

我们知道线性回归的公式为:

那么上面表格的数据转化为方程组:

  • b0​ + b1​⋅0 + b2​⋅1 = 1.4
  • b0 ​+ b1​⋅1 - b2​⋅1 = −0.48
  • b0 ​+ b1​⋅2 + b2​⋅8 = 13.2

那么矩阵X 为:


转化为代码如下:

from numpy import *X = mat([[1,0,1],[1,1,-1],[1,2,8]])Y = mat([[1.4],[-0.48],[13.2]])

计算系数矩阵B:

>>> get_B(X, Y)
matrix([[-0.01454545],   # b0[ 0.94909091],   # b1[ 1.41454545]])  # b2

这样就得出了各个系数项,我们可以用这些系数项进行数据预测。

6,sklearn 对线性回归的实现

sklearn 库中的 LinearRegression 类是对线性回归的实现。

LinearRegression 类的原型:

LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

来看下其参数的含义:

  • fit_intercept:拟合模型时,是否存在截距b0,默认为True,即存在。
  • normalize:在拟合模型之前,是否要对特征集进行标准化处理。
    • fit_interceptFalse 时,该参数被忽略。
  • copy_X:是否复制特征集X
  • n_jobs:用于计算的作业数,只对多重回归且比较复杂的数据进行加速。

接下来,使用 LinearRegression 类对上面表格数据进行拟合。(为了方便查看,我将表格放在这里)

特征x1 特征x2 目标y
0 1 1.4
1 -1 -0.48
2 8 13.2

将该表格数据转化成 Python 变量,如下:

X = [(0, 1), [1, -1], [2, 8]]
Y = [1.4, -0.48, 13.2]

创建线性回归对象:

from sklearn.linear_model import LinearRegressionreg = LinearRegression() # 均使用默认参数

拟合数据:

reg.fit(X, Y)

coef_ 属性是特征系数列表:

>>> reg.coef_
array([0.94909091, 1.41454545])

intercept_ 属性是截距 b0 的值:

>>> reg.intercept_
-0.014545454545452863

通过coef_intercept_ 属性可以看到,使用 LinearRegression 类和使用 NumPy 得到的结果是一样的。

需要注意的是,只有当数据集的特征集与目标集是线性关系时,才能使用线性回归拟合出一个不错的结果。如果不是线性关系,则拟合结果一般不会很好。

对于非线性关系的回归问题,可以使用树回归等其它模型。

那如何判断特征集与目标集是否是线性关系呢?有两个指标:

  • 决定系数 R2:该指标使用了回归平方和与总平方和之比,是反映模型拟合度的重要指标。

    • 它的取值在 0 到 1 之间,越接近于 1 表示拟合的程度越好、数据分布越接近线性关系。
  • 校正的决定系数 Rc2:如果特征非常多,那么Rc2 指标将更加可靠。

LinearRegression 类中的 score 方法就是R2 指标的实现:

>>> reg.score(X, Y)
1.0 # 结果是 1,说明特征集与目标集是非常好的线性关系。

7,对波士顿房价进行线性分析

对于波士顿房价数据集,之前的文章中,已经多次使用过,这次我们对其使用线性回归模型进行分析。

首先加载数据:

from sklearn.datasets import load_bostonboston = load_boston()
features = boston.data # 特征集
prices = boston.target # 目标集

创建线性回归对象:

from sklearn.linear_model import LinearRegression# 在拟合之前对数据进行标准化处理
reg = LinearRegression(normalize=True)

拟合数据:

reg.fit(features, prices)

对模型进行评分:

>>> reg.score(features, prices)
0.7406426641094095

通过评分可知,最终的准确率为74.1%,虽谈不上很高,但也还说得过去。

8,总结

使用最小二乘法训练出的线性回归模型是最简单基础的一种线性模型,只有当特征集与目标集呈线性关系时,它才能拟合出比较好的结果。

在它的基础之上,还有很多改进版的线性模型,比如:局部加权线性回归,岭回归,lasso 等,你可以在 Sklearn Linear Models 进一步了解和学习。

(本节完。)


推荐阅读:

AdaBoost 算法-分析波士顿房价数据集

EM 算法-对鸢尾花数据进行聚类

Apriori 算法-如何进行关联规则挖掘

PageRank 算法-Google 如何给网页排名

K 均值算法-如何让数据自动分组


欢迎关注作者公众号,获取更多技术干货。

线性回归-如何对数据进行回归分析相关推荐

  1. Alink漫谈(十) :线性回归实现 之 数据预处理

    Alink漫谈(十) :线性回归实现 之 数据预处理 文章目录 Alink漫谈(十) :线性回归实现 之 数据预处理 0x00 摘要 0x01 概念 1.1 线性回归 1.2 优化模型 1.3 损失函 ...

  2. 数据回归分析 | Python实现数据逻辑回归分析

    数据回归分析 | Python实现数据逻辑回归分析 目录 数据回归分析 | Python实现数据逻辑回归分析 基本介绍 环境准备 模型原理 程序设计 学习小结 基本介绍 逻辑回归是一种分类算法(虽然名 ...

  3. excel计算二元线性回归_用Excel做回归分析

    Excel数据分析工具库是个很强大的工具,可以满足基本的统计分析,这里介绍用Excel数据分析工具库中的回归做回归分析. 本节知识点: Excel数据分析工具库-回归 线性回归和非线性回归 简单线性回 ...

  4. 【R】葡萄牙森林火灾(数据可视化回归分析)

    下面将以葡萄牙森林火灾数据为例进行数据可视化及建模分析.葡萄牙森林火灾数据 (数据来源) 一.数据集描述 属性 解释 X 在蒙特西尼奥公园地图的横坐标(1-9) Y 在蒙特西尼奥公园地图的纵坐标(2- ...

  5. excel计算二元线性回归_快速掌握Logistic回归分析及应用

    影响关系研究是所有研究中最为常见的.我们都知道当Y是定量数据时,线性回归可以用来分析影响关系.如果现在想对某件事情发生的概率进行预估,比如一件衣服的是否有人想购买?这里的Y是"是否愿意购买& ...

  6. excel计算二元线性回归_使用Excel进行回归分析

    Excel数据分析工具库是个很强大的工具,可以满足基本的统计分析,这里介绍用Excel数据分析工具库中的回归做回归分析. 本文主要介绍: Excel数据分析工具库-回归 线性回归和非线性回归 简单线性 ...

  7. python对于一元线性回归模型_Python一元线性回归分析实例:价格与需求的相关性...

    来自烟水暖的学习笔记 回归分析(Regression analysis) 回归分析(Regression analysis),是研究因变量与自变量之间相关性的一种数学方法,并将相关性量化,即得到回归方 ...

  8. python 线性回归回归 缺失值 忽略_python – 使用scikit-learn(sklearn),如何处理线性回归的缺失数据?...

    我的数据包含2个DataFrame. DataFrame_1.shape =(40,5000)和DataFrame_2.shape =(40,74).我正在尝试进行某种类型的线性回归,但DataFra ...

  9. Python使用线性回归简单预测数据

    转载自: http://python.jobbole.com/81215/ 本文中,我们将进行大量的编程--但在这之前,我们先介绍一下我们今天要解决的实例问题. 1) 预测房子价格 我们想预测特定房子 ...

最新文章

  1. Maven 无法下载 json-lib
  2. echart旭日图_150Echarts - 旭日图(Sunburst Label Rotate)
  3. optee中TA的堆的分配
  4. PHP中redis的使用
  5. 九阴真经 第十五层--node.js 第2天
  6. matlab 2010 工具箱,Matlab2010下使用FULLBNT工具箱實現簡單的靜態貝葉斯網絡及推理...
  7. python中的命令行参数_python学习笔记6:命令行参数
  8. gc就是fullgc吗 major_线上出现fullgc问题如何排查?
  9. 记事本状态栏不会自动_如何在记事本中同时启用状态栏和自动换行
  10. 领域驱动设计之领域模型_在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……...
  11. ros_readbagfile:未找到命令的解决方法
  12. bzoj 1131: [POI2008]Sta(DPS)
  13. mvdr波束形成原理_有了波束赋形这个5G黑科技,让你畅享飞一样的网速
  14. java简历项目经验描述,分分钟搞定!
  15. 网页设计中文标题h1~h4应用技巧
  16. Java docx4j 操作word 1.0
  17. java对接云之家群聊机器人
  18. Windows用户态和内核态原理讲解
  19. 简明扼要的HDFS元数据管理机制描述(NameNode和Secondary NameNode工作机制)
  20. css显示苹方字体,苹方字体合集

热门文章

  1. 励志故事——强盗师徒
  2. 道听途说的网赚究为何物
  3. js监听手机端的touch滑动事件
  4. 【FAQ】应用内支付服务无法拉起支付页面常见原因分析和解决方法
  5. Unity Editor 知识点整理( MenuItem)
  6. 前端实现点击复制功能,兼容Safari浏览器 @令狐张豪
  7. 搜狗浏览器扩展插件开发制作详细流程记录
  8. unity小球酷跑(删减版)
  9. 使用personal access token进行Github认证
  10. 一个深圳高级女白领的真实世界(3) ----李白有诗云:"轻舟已过万重山"