最小二乘法:https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346?fr=aladdin

原文链接:https://blog.csdn.net/sinat_23338865/article/details/80608834

1.背景:

1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,但是根据大多数人计算的结果来寻找谷神星都没有结果。时年24岁的高斯也计算了谷神星的轨道。奥地利天文学家海因里希·奥伯斯根据高斯计算出来的轨道重新发现了谷神星。

高斯使用的最小二乘法的方法发表于1809年他的著作《天体运动论》中,而法国科学家勒让德于1806年独立发现“最小二乘法”,但因不为世人所知而默默无闻。两人曾为谁最早创立最小二乘法原理发生争执。

1829年,高斯提供了最小二乘法的优化效果强于其他方法的证明,见高斯-马尔可夫定理。

                                                            ----维基百科

2. 最小二乘法在机器学习中被用来

3. 高中关于最小二乘法估计

概括:

假设有若干个样本点,(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5),求解直线y=kx+b,是的这些样本点到直线的距离最小.

我们高中的求解方式也是这样的:

展开为:

min_sum = [y1- (kx1+b)]^2+[y2- (kx2+b)]^2+[y3- (kx3+b)]^2+[y4- (kx4+b)]^2+[y5- (kx5+b)]^2

就是各个点到我们设定的直线的欧式距离

化简为:

     

以上就是我们高中对于最小二乘法的最初认知. 这个求解的过程,我们称之为最小二乘法,而求解的这条直线,我们称之为线性回归,线性回归用来近似的预测数据的真是情况.

举个例子:(此题来自:北师大版高中数学)

从某所高中随机抽取一些可爱的萌妹子,就比如6个女生好了,测出她们的体重和身高如下表,现在来了一个60kg的女生,求问它的身高会有多高?

女生数据
女生ID
身高
体重

      

用python画图来表示这些数据好了:

 1 # encoding: utf8
2 import matplotlib
3 import matplotlib.pyplot as plt
4 from matplotlib.font_manager import FontProperties
5 from sklearn.linear_model import LinearRegression
6 from scipy import sparse
7
8 print matplotlib.matplotlib_fname() # 将会获得matplotlib包所在文件夹
9 font = FontProperties()
10 plt.rcParams['font.sans-serif'] = ['Droid Sans Fallback'] # 指定默认字体
11 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
12
13 plt.figure()
14 plt.title(u' 可爱女生的数据 ')
15 plt.xlabel(u'x 体重')
16 plt.ylabel(u'y 身高')
17 plt.axis([40, 80, 140, 200])
18 plt.grid(True)
19 x = [[48], [57], [50], [54], [64], [61], [43], [59]]
20 y = [[165], [165], [157], [170], [175], [165], [155], [170]]
21 plt.plot(x, y, 'k.')
22 model = LinearRegression()
23 model.fit(x, y)
24 # y2 = model.predict(x)
25 # plt.plot(x, y2, 'g-')
26 plt.show()

散点图:

对于这个例子,我们可以使用上面的公式,求解出回归方程,并可以得到方程拟合的该女生的身高值,但是这太麻烦了 , 毕竟高中还是太too yong too simple了~

4. 大学关于最小二乘法

基于上面的那个问题,我们大学有没有更好的一点的求解方式 ?

4.1 大学对于最小二乘法的概括:

          找到那样一条函数曲线使得观测值的残差平方之和最小.   通俗的讲:见高中部分概括

4.2 继续上面的这个问题思路:

  我们已知这些数据:

      f(x,y) = [y1- (kx1+b)]^2+[y2- (kx2+b)]^2+[y3- (kx3+b)]^2+[y4- (kx4+b)]^2+[y5- (kx5+b)]^2+[y6- (kx6+b)]^2+[y7- (kx7+b)]^2+[y7- (kx7+b)]^2

如果存在最大值,那么只需要满足f(x,y)对于x,y的一阶偏导数均为0

求解得:

k= 0.849  , b =85.172

所以预测值为:

y = 0.849x - 85.172  将y = 60kg  代入求解得:  x = 170.99175

我们再使用Python求解一次:

 1 # encoding: utf8
2 import matplotlib
3 import matplotlib.pyplot as plt
4 from matplotlib.font_manager import FontProperties
5 from scipy.optimize import leastsq
6 from sklearn.linear_model import LinearRegression
7 from scipy import sparse
8 import numpy as np
9
10 # 拟合函数
11 def func(a, x):
12 k, b = a
13 return k * x + b
14
15
16 # 残差
17 def dist(a, x, y):
18 return func(a, x) - y
19
20
21 font = FontProperties()
22 plt.rcParams['font.sans-serif'] = ['Droid Sans Fallback'] # 指定默认字体
23 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
24
25 plt.figure()
26 plt.title(u' 可爱女生的数据 ')
27 plt.xlabel(u'x 体重')
28 plt.ylabel(u'y 身高')
29 plt.axis([40, 80, 140, 200])
30 plt.grid(True)
31 x = np.array([48.0, 57.0, 50.0,54.0, 64.0, 61.0, 43.0, 59.0])
32 y = np.array([165.0, 165.0,157.0, 170.0, 175.0, 165.0, 155.0, 170.0])
33 plt.plot(x, y, 'k.')
34
35 param = [0, 0]
36
37 var= leastsq(dist, param, args=(x, y))
38 k, b = var[0]
39 print k, b
40
41 plt.plot(x, k*x+b, 'o-')
42
43 plt.show()

从图中,可以发现结果大致相符.

关于leastsq备注:

scipy库中的函数,它可以省去中间那些具体的求解步骤,只需要输入一系列样本点,给出待求函数的基本形状(如一元一次函数,或者二元二次函数就是一种形状——f(x,y)=w0x^2+w1y^2+w2xy+w3x+w4y+w5,在形状给定后,我们只需要求解相应的系数w0~w6),即可得到相应的参数。至于中间到底是怎么求的,这一部分内容就像一个黑箱一样。

(转)Python- sklearn之最小二乘法的更多相关文章

  1. Python —— sklearn.feature_selection模块

    Python —— sklearn.feature_selection模块 sklearn.feature_selection模块的作用是feature selection,而不是feature ex ...

  2. Python: sklearn库——数据预处理

    Python: sklearn库 —— 数据预处理 数据集转换之预处理数据:      将输入的数据转化成机器学习算法可以使用的数据.包含特征提取和标准化.      原因:数据集的标准化(服从均值为 ...

  3. Python Sklearn.metrics 简介及应用示例

    Python Sklearn.metrics 简介及应用示例 利用Python进行各种机器学习算法的实现时,经常会用到sklearn(scikit-learn)这个模块/库. 无论利用机器学习算法进行 ...

  4. 用python+sklearn(机器学习)实现天气预报数据 模型和使用

    用python+sklearn机器学习实现天气预报 模型和使用 项目地址 系列教程 0.前言 1.建立模型 a.准备 引入所需要的头文件 选择模型 选择评估方法 获取数据集 b.建立模型 c.获取模型 ...

  5. 用python+sklearn(机器学习)实现天气预报数据 数据

    用python+sklearn机器学习实现天气预报 数据 项目地址 系列教程 勘误表 0.前言 1.爬虫 a.确认要被爬取的网页网址 b.爬虫部分 c.网页内容匹配取出部分 d.写入csv文件格式化 ...

  6. 用python+sklearn(机器学习)实现天气预报 准备

    用python+sklearn机器学习实现天气预报 准备 项目地址 系列教程 0.流程介绍 1. 环境搭建 a.python b.涉及到的机器学习相关库 sklearn panda seaborn j ...

  7. python+sklearn+kaggle机器学习

    python+sklearn+kaggle机器学习 系列教程 0.kaggle 1. 初级线性回归模型机器学习过程 a. 提取数据 b.数据预处理 c.训练模型 d.根据数据预测 e.验证 今天是10 ...

  8. python sklearn模型的保存

    使用python的机器学习包sklearn的时候,如果训练集是固定的,我们往往想要将一次训练的模型结果保存起来,以便下一次使用,这样能够避免每次运行时都要重新训练模型时的麻烦. 在python里面,有 ...

  9. 数据正规化 (data normalization) 的原理及实现 (Python sklearn)

    原理 数据正规化(data normalization)是将数据的每个样本(向量)变换为单位范数的向量,各样本之间是相互独立的.其实际上,是对向量中的每个分量值除以正规化因子.常用的正规化因子有 L1 ...

  10. 安装python sklearn经验总结

    1. 需要安装 numpy, scipy, 和sklearn和ipython,Cython sklearn,ipython, Cython都可以通过pip来安装.但scipy,可能还有numpy必须通 ...

随机推荐

  1. 前端开发必备:nvm与npm与nrm

    nvm Node.js version manager ,推荐使用它来安装 node.js . Mac 版项目地址 Windows 版项目地址 windows 版安装 进入 下载页 找到安装包: 跟着 ...

  2. JS---DOM---为同一个元素绑定多个不同事件指向同一个事件处理函数

    为同一个元素绑定多个不同事件指向同一个事件处理函数 1. 用了switch(e.type){} 来修改 2. break <input type="button" value ...

  3. C++之new关键字

    我们都知道new是用来在程序运行过程中为变量临时分配内存的C++关键字,那它跟C语言中的malloc有什么区别呢,相比之下又为什么推荐使用new呢 c++ throwing() void* opera ...

  4. IT兄弟连 HTML5教程 DIV+CSS网站首页布局示例

    首页的设计直接影响网站的整体形象,虽然没有一个统一的规范,但最好将其设计为大众化的,只要信息内容能够合理地编排即可,使用户可以方便地找到需要的信息.另外,首页的高度最好不要超过三个屏幕,页面中使用的颜 ...

  5. VUE+Element UI实现简单的表格行内编辑效果

    原理是通过Css控制绑定的输入控件与显示值,在选中行样式下对控件进行隐藏或显示 <!DOCTYPE html> <html> <head> <meta cha ...

  6. soapUI 之 测试文件上传 [6]

    在接口测试中会遇到需要上传文件的操作,比如头像修改等.那么soapui是怎么实现这部分测试的呢.以下以文件上传接口为例. 一.获取文件上传接口 可以通过开发直接提供的接口文档,或者自己抓包获取接口信息 ...

  7. SpringAOP基础

    例1.已知有这么一段代码,会打印出Hello public static void main(String[] args) { sayHello(); } public static void say ...

  8. 从零开始的vue学习笔记(一)

    前言 项目要用vue.js,今天开始自学vue.js官方教程,记录下自己的学习摘要,方便后面查阅(此笔记按照学习天数,每天一篇) Vue.js是什么 Vue是一套用于构建用户界面的渐进式框架,Vue ...

  9. 如何用python查看自己的电脑有几个核

    今天在研究多进程的时候,如果想要充分利用多核CPU资源,最起码的一点你应该知道自己的电脑有几个核. 下面是用python3 的 os 模块来查看自己的电脑是几个核的方法. import os prin ...

  10. Angular(06)- 为什么数据变化,绑定的视图就会自动更新了?

    这里提一点,前端三大框架(Angular,React,Vue)的数据驱动来更新视图的原理,即 MVVM 的实现. 为什么数据发生变化,绑定的视图就会刷新了呢? 以下是我的个人理解,仅供参考: 在还是 ...