最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

那什么是最小二乘法呢?别着急,我们先从几个简单的概念说起。

假设我们现在有一系列的数据点

,那么由我们给出的拟合函数h(x)得到的估计量就是

,那么怎么评估我们给出的拟合函数与实际待求解的函数的拟合程度比较高呢?这里我们先定义一个概念:残差

, 我们估计拟合程度都是在残差的基础上进行的。下面再介绍三种范数:

• ∞-范数:残差绝对值的最大值

,即所有数据点中残差距离的最大值

• 1-范数:绝对残差和

,即所有数据点残差距离之和

• 2-范数:残差平方和

前两种范数是最容易想到,最自然的,但是不利于进行微分运算,在数据量很大的情况下计算量太大,不具有可操作性。因此一般使用的是2-范数。

说了这么多,那范数和拟合有什么关系呢?拟合程度,用通俗的话来讲,就是我们的拟合函数h(x)与待求解的函数y之间的相似性。那么2-范数越小,自然相似性就比较高了。

由此,我们可以写出最小二乘法的定义了:

对于给定的数据

,在取定的假设空间H中,求解h(x)∈H,使得残差

的2-范数最小,即

从几何上讲,就是寻找与给定点

距离平方和最小的曲线y=h(x)。h(x)称为拟合函数或者最小二乘解,求解拟合函数h(x)的方法称为曲线拟合的最小二乘法。

那么这里的h(x)到底应该长什么样呢?一般情况下,这是一条多项式曲线:

这里h(x,w)是一个n次多项式,w是其参数。

也就是说,最小二乘法就是要找到这样一组

,使得

最小。

那么如何找到这样的w,使得其拟合函数h(x)与目标函数y具有最高拟合程度呢?即最小二乘法如何求解呢,这才是关键啊。

假设我们的拟合函数是一个线性函数,即:

(当然,也可以是二次函数,或者更高维的函数,这里仅仅是作为求解范例,所以采用了最简单的线性函数)那么我们的目标就是找到这样的w,

这里令

为样本

的平方损失函数

这里的Q(w)即为我们要进行最优化的风险函数。

学过微积分的同学应该比较清楚,这是一个典型的求解极值的问题,只需要分别对 18 求偏导数,然后令偏导数为0,即可求解出极值点,即:

接下来只需要求解这个方程组即可解出w_i 的值

============ 分割分割 =============

上面我们讲解了什么是最小二乘法,以及如何求解最小二乘解,下面我们将通过Python来实现最小二乘法。

这里我们把目标函数选为y=sin(2πx),叠加上一个正态分布作为噪音干扰,然后使用多项式分布去拟合它。

代码:

# _*_ coding: utf-8 _*_

# 作者: yhao

# 博客: http://blog.csdn.net/yhao2014

# 邮箱: yanhao07@sina.com

import numpy as np # 引入numpy

import scipy as sp

import pylab as pl

from scipy.optimize import leastsq # 引入最小二乘函数

n = 9 # 多项式次数

# 目标函数

def real_func(x):

return np.sin(2 * np.pi * x)

# 多项式函数

def fit_func(p, x):

f = np.poly1d(p)

return f(x)

# 残差函数

def residuals_func(p, y, x):

ret = fit_func(p, x) - y

return ret

x = np.linspace(0, 1, 9) # 随机选择9个点作为x

x_points = np.linspace(0, 1, 1000) # 画图时需要的连续点

y0 = real_func(x) # 目标函数

y1 = [np.random.normal(0, 0.1) + y for y in y0] # 添加正太分布噪声后的函数

p_init = np.random.randn(n) # 随机初始化多项式参数

plsq = leastsq(residuals_func, p_init, args=(y1, x))

print 'Fitting Parameters: ', plsq[0] # 输出拟合参数

pl.plot(x_points, real_func(x_points), label='real')

pl.plot(x_points, fit_func(plsq[0], x_points), label='fitted curve')

pl.plot(x, y1, 'bo', label='with noise')

pl.legend()

pl.show()

输出拟合参数:

图像如下:

从图像上看,很明显我们的拟合函数过拟合了,下面我们尝试在风险函数的基础上加上正则化项,来降低过拟合的现象:

为此,我们只需要在残差函数中将lambda^(1/2)p加在了返回的array的后面

regularization = 0.1 # 正则化系数lambda

# 残差函数

def residuals_func(p, y, x):

ret = fit_func(p, x) - y

ret = np.append(ret, np.sqrt(regularization) * p) # 将lambda^(1/2)p加在了返回的array的后面

return ret

输出拟合参数:

图像如下:

很明显,在适当的正则化约束下,可以比较好的拟合目标函数。

注意,如果正则化项的系数太大,会导致欠拟合现象(此时的惩罚项权重特别高)

如,设置regularization=0.1时,图像如下:

此时明显欠拟合。所以要慎重进行正则化参数的选择。

以上这篇最小二乘法及其python实现详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

python 最小二乘法_最小二乘法及其python实现详解相关推荐

  1. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  2. Python中下划线 _ 的最全用法详解

    Python中下划线 _ 的最全用法详解 '_'是什么? _在python中可以作为一个标识符,用于定义变量和方法唯一名称.同时它也是Python中的一个软关键字,指在某些特定上下文中保留的关键字.截 ...

  3. python argv 详解_对python中的argv和argc使用详解

    主要问题 为什么argv中第一个,即index=0的内容就是文件名? python中argc是用什么实现的? 概念解释 argc:argument counter,命令行参数个数 argv:argum ...

  4. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  5. python3 isinstance用法_对python中assert、isinstance的用法详解

    1. assert 函数说明: Assert statements are a convenient way to insert debugging assertions into a program ...

  6. python移动平均线绘图_对python pandas 画移动平均线的方法详解

    数据文件 66001_.txt 内容格式: date,jz0,jz1,jz2,jz3,jz4,jz5 2012-12-28,0.9326,0.8835,1.0289,1.0027,1.1067,1.0 ...

  7. python中zip的使用_浅谈Python中的zip()与*zip()函数详解

    前言 1.实验环境: Python 3.6: 2.示例代码地址:下载示例: 3.本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables ...

  8. pythonxml库_对python 生成拼接xml报文的示例详解

    最近临时工作要生成xml报名,通过MQ接口发送.简单小程序. 自增长拼成xml报文 Test_001.py # encoding=utf-8 import time orderId = '' s1= ...

  9. 运用python的方式_对Python使用mfcc的两种方式详解

    1.Librosa import librosa filepath = "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" ...

  10. python labelencoder参数_对python 数据处理中的LabelEncoder 和 OneHotEncoder详解

    python 怎么读取 Label 里面的值 #简单来说 LabelEncoder 是对不连续的数字或者文本进行编号 from sklearn.preprocessing import LabelEn ...

最新文章

  1. 比特大陆发力边缘计算,详解终端AI芯片BM1880
  2. 利用Spring的aop原理实现系统级日志管理 附带源码
  3. fofa 搜索结果提取技术分析
  4. 排列出所有子串暴力递归
  5. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(一)-- 起步
  6. 计算机系统遵循,自考《计算机系统结构》第10章精讲
  7. 作者:程学旗(1972-),男,中国科学院计算技术研究所研究员、博士生导师、副所长,中国科学院网络数据科学与技术重点实验室主任。...
  8. [导入] [转]总结C++与C#的区别
  9. 试图加载 Crystal Reports 运行时出现错误
  10. axure8 Mac破解版+汉化包
  11. 智能物流的常见应用场景及系统
  12. bios 昂达h61c_Onda昂达主板BIOS,ONDA昂达H61N全固版(ver 3.00)主板BIOS 3.02版,主板BIOS,硬件驱动下载...
  13. java 格林尼治生僻时间转换
  14. 2018 银联Java笔试 题,中国银联2018秋招笔试题
  15. eof() 和fail()
  16. 如何将mysql导出数据泵_Oracle数据库之ORACLE 数据泵导入导出数据
  17. Android Studio 获取手机联系人并进行,发短信,打电话,增删改操作
  18. 学生报名太火热,黑马大门要被挤掉了?
  19. STM32F103C8T6寄存器简单应用(流水灯)
  20. jQuery slideToggle

热门文章

  1. Spring-RestTemplate之urlencode参数解析异常全程分析
  2. 网站高并发优化性能调优总结
  3. 006-Python迭代器
  4. 怎样改动SharePoint管理中心的语言
  5. 使用Bootstrap + Vue.js实现 添加删除数据
  6. React 源码剖析系列 - 解密 setState
  7. 表likp新增第一次过账输入日期字段,vl02n/vl01n/vl03n/vl06o的增强
  8. 解决Lync Server前端必备组件Wmf2008R2安装失败
  9. ZZULIOJ 1060:逆序数字
  10. ts watch路由 参数变化_TypeScript基础(六):TS 在 Vue 中的用法,data,生命周期,methods,computed,props,watch,$emit...