机器学习之最小二乘法(Python代码实现)

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

什么是最小二乘法

以最简单的一元线性模型来解释最小二乘法。在回归分析中,如果只包含一个自变量和一个因变量,且二者关系可用一条直线近似表示,这种回归分析称为一元线性回归。如果包含两个以上的自变量,且因变量与自变量之间是线性关系,那么就称为多元线性回归。

对于二维空间线性是一条直线,对于三维空间线性是一个平面,对于多维空间线性是一个超平面。

假设有多组值(Xi,Yi),他们满足一定的线性关系。对于平面中的这i组值,有无数条曲线可以拟合出来。在这儿我们使用残差和最小的方法确定直线的参数。
首先设置直线模型为:

直线模型

其平均损失函数为:
机器学习之最小二乘法(Python代码实现)_第1张图片
平均损失函数

在这儿,最小二乘法就是求解Q的最小值,因为误差Q小,对应的参数Theta则是最优的;所以我们将上式看作是一个Q关于Theta变量的函数,结果就是一个简单的求最小值的问题:
机器学习之最小二乘法(Python代码实现)_第2张图片
求极小值问题

求极小值问题就是令偏导等于0,这个应该不用解释了

两式可以化简为:


机器学习之最小二乘法(Python代码实现)_第3张图片
求极值化简

最后可以化简成:


机器学习之最小二乘法(Python代码实现)_第4张图片
最简式

求出这两个Theta值就可以拟合出一条一元线性曲线。
这就是最简单的最小二乘法

代码实现

首先调用如下几个库

import numpy as np  # 引入numpy
import scipy as sp
import pylab as pl
from scipy.optimize import leastsq  # 引入最小二乘函数

然后我们要定义一个函数模型,这样才能给定(Xi,Yi)数据

# 目标函数
def real_func(x):
    y= 3*x+6
    return y

然后定义一个残差函数,也就是定义Q的值

def residuals_func(p, y, x):
    ret = fit_func(p, x) - y
    return ret

最后就可以编写代码,总共分
1.随机选Xi,求出Yi作为数据
2.随机将Yi的值添加噪点
3.通过最小二乘法求参数Theta
4.求拟合完函数输出的Y值
5.将原始模型、数据点、拟合模型表示出来

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()

完整代码放在github上,如果需要可以去github下载。

下载地址


如果有不明白的可以关注作者微信公众号并私信问题:

机器学习之最小二乘法(Python代码实现)_第5张图片
一技破万法

你可能感兴趣的:(机器学习之最小二乘法(Python代码实现))