zoukankan      html  css  js  c++  java
  • python最小二乘的实现

    1.使用 linalg最小二乘法的权重参数(m,c)。

    import matplotlib.pyplot as plt
    
    x=Aarray([[ 0.,  1.],       [ 1.,  1.],       [ 2.,  1.],       [ 3.,  1.]])
    y = np.array([-1, 0.2, 0.9, 2.1])
    m, c = np.linalg.lstsq(x, y)[0]
    
    
    plt.plot(x, y, 'o', label='Original data', markersize=10)
    plt.plot(x, m*x + c, 'r', label='Fitted line')
    plt.legend()
    plt.show()
    

    2.使用Scipy

    导入scipy的最小二乘法优化器:from scipy.optimize import leastsq

    import numpy as np
    from scipy.optimize import leastsq
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    
    
    # np.random.seed(0)
    
    
    def obj_func(x):
        # 创建目标函数,后面假设不知道,需要拟合出来接近这个目标函数
        # f = 1 / (1 + np.exp(-x))
        # f = np.tan(x)
        f = np.sin(x)
        return f
    
    
    size = 100
    x = np.linspace(-5, 5, size)
    y_ = obj_func(x)
    # 根据目标函数,产生随机的噪声,近似接近目标函数obj_func的数据x,y
    y = np.random.normal(0, 1, (size)) / 100 + y_
    
    
    def scatter(x, y, c, label):
        plt.scatter(x, y, label=label, c=c)
    
    
    def plot(x, y, c, label):
        plt.plot(x, y, label=label, c=c)
    
    
    # 创建拟合函数,参数为p的多项式函数,去拟合obj_func
    def fit_func(p, x):
        # poly1d([2, 1, 1]) 等同于2*x^2  + 1* x^1 +1*x^0 = 2x^2 + x +1
        f = np.poly1d(p)
        return f(x)
    
    
    # 创建损失函数,Scipy优化器依照损失最小化取优化,寻找最佳参数,这里既为多项式函数的系数,和偏置。
    def coust_func(p, x, y):
        f = fit_func(p, x)
        # 定义为残差最小
        coust = (f - y)
        return coust
    
    
    # 还可以定义正则化损失
    regularization = 0.0001
    
    
    def coust_func_regularization(p, x, y):
        f = fit_func(p, x)
        reg = np.sqrt(0.5 * regularization * np.square(p))
        coust = (f - y)
        coust = np.append(coust, reg)
        return coust
    
    
    # 适配函数
    def fiting_func(x, y, coust_func, M=1):
        init_p = np.random.rand(M + 1)
        # scipy最小二乘函数,传入:(损失函数,损失函数初始参数,(数据x,y))
        leastq = leastsq(coust_func, init_p, args=(x, y))
        return leastq
    
    
    # -------绘制真实函数-------
    plot(x, y_, c='red', label='real function')
    
    # 多项式拟合中的最高次
    p = 5
    # 无正则化损失函数
    leastq = fiting_func(x, y, coust_func, p)
    # 正则化损失函数
    leastq_reg = fiting_func(x, y, coust_func_regularization, p)
    
    pred_x = np.linspace(-5, 5, 10)
    # 预测
    predY = fit_func(leastq[0], pred_x)
    predY_reg = fit_func(leastq_reg[0], pred_x)
    
    # -------拟合函数-------
    plot(pred_x, predY, c='blue', label='fit function')
    # -------正则拟合函数-------
    plot(pred_x, predY_reg, c='yellow', label='fit reg function')
    plt.legend()
    plt.show()
    

  • 相关阅读:
    【Java】国内maven私服
    【密码学】常见证书格式及相互转换
    【密码学】数字证书原理
    【Java】Java与数字证书
    【Java】在eclipse中使用maven进行项目构建 入门篇
    【Java】在eclipse中使用gradle进行项目构建 入门篇
    Practice encryptedblobstore
    47、[源码]-Spring容器创建-初始化MessageSource
    46、[源码]-Spring容器创建-注册BeanPostProcessors
    45、[源码]-Spring容器创建-执行BeanFactoryPostProcessor
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441800.html
Copyright © 2011-2022 走看看