【机器学习算法】最小二乘法(Least Square Method)

最小二乘法(Least Square Method)

1. 简介

原理:最小误差平方和

应用:

  1. 做插值时可用,即求未知数据,并且使得这些数据与实际数据的平方和最小。
  2. 曲线拟合。
  3. 最小化能量/最大化熵解决优化问题。

通过几何中,点和线描述:

  1. 已知多条近似交汇于一个点的直线,求解一个近似交点,即寻求一个距离所有直线距离平方和最小的点,该点为即为最小二乘的解。
  2. 已知多个近似分布于同一直线上的点,求解出一条直线,并使得所有点到直线上的距离平方和最小。满足这个条件的直线参数:斜率和截距,就是最小二乘法的解。

函数介绍:

1. numpy.ploy1d(arrary,bool,variable)

  • 参数arrary:输入一个数组,表示多项式的系数(coefficient)。
  • 参数bool:当bool=True时,将数组中的值作为根。
  • 参数variable:改变未知数的字母。
import numpy as np
w = [1, 2, 3, 4]
f1 = np.poly1d(w)
f2 = np.poly1d(w, True)
f3 = np.poly1d(w, False, 'z')
print(f1)
print(f2)
print(f3)

2. scipy.optimize.leastsq()

leastsq(func, 
        x0,
        args=(),
        Dfun=None,
        full_output=0,
        col_deriv=0,
        ftol=1.49012e-08,
        xtol=1.49012e-08,
        gtol=0.0,
        maxfev=0,
        epsfcn=0.0,
        factor=100,
        diag=None,
        warning=True)

在optimize模块中,使用leastsq()函数可以很快速地使用最小二乘法对数据进行拟合。一般来说,我们只需要前三个参数就够了他们的作用分别是:

  • func:误差函数
  • x0:表示函数的参数
  • args()表示数据点

2.实例

前提假设:

目标函数:y=sinx

损失函数:loss = y'-y

'''最小二乘法'''
# _*_ coding: utf-8 _*_

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

从结果图中观察可得出结论:过拟合

优化方法:

1.调整拟合函数的项数。实验后得到当n=4时,可以得到适当的拟合函数。

2.优化损失函数,通过加上正则化项,来降低过拟合现象。

regularization = 0.001  # 正则化系数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  

注意:当系数lambda过大时,会出现欠拟合现象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值