最小二乘法之一元线性拟合

import numpy as np
import matplotlib.pyplot as plt

from scipy import optimize

data=np.array([[176,169],[171,162],[165,164],[178,170],[169,172],[172,170],[176,181],[168,161],[173,174],[171,164],[180,182],[191,188],[179,182],[162,153],
                [164,160],[180,168],[170,180],[172,170],[172,170],[174,177],[187,175],[178,173],[181,183],[180,178],[182,180],[173,176],[173,175]
                ])
def f_1(x, A, B):
    return A*x + B
#scipy算法包封装的曲线拟合函数
def test3():
    X = np.array(data[:, 0])
    Y = np.array(data[:, 1])
    A1, B1 = optimize.curve_fit(f_1, X, Y)[0]
    x1 = np.arange(160, 190, 0.01)
    y1 = A1 * x1 + B1
    plt.plot(X, Y, 'ro', x1, y1, "blue")  # 将拟合曲线和散点绘制在一起
    plt.show()
#使用多远线性回归的推导模型来计算,看成矩阵来计算
def test2():
    N=data.shape[0]
    Y_T=np.matrix(data[:,1]).T#变成列矩阵
    X_T=np.matrix([np.ones(N),data[:,0]]).T#变成列矩阵
    b=np.linalg.inv(X_T.T.dot(X_T)).dot(X_T.T).dot(Y_T)
    #计算出来后,第一个为常数,横街点,第二个为斜率
    print("")
#使用二元推导模型计算
def test1():
    #求Xi*Yi
    N=data.shape[0]
    X=np.array(data[:,0])
    Y=np.array(data[:,1])
    sumXi_Yi=np.dot(X,Y)
    avg_X=np.sum(X,axis=0)/N#X的平均值
    avg_Y=np.sum(Y,axis=0)/N#Y的均值
    sum_X2=np.sum(X*X,axis=0)
    #根据公式计算b值
    b= (sumXi_Yi-N*avg_X*avg_Y)/(sum_X2-N*avg_X**2)
    a=avg_Y-b*avg_X
    # plt.plot(X, Y, 'ro')
    # plt.show()
    x1 = np.arange(160, 190, 0.01)
    y1 = b * x1 + a
    plt.plot(X, Y, 'ro',x1, y1, "blue")#将拟合曲线和散点绘制在一起
    plt.show()

备注:

方法一的推导公式:

93441e9c218f67117a3aa25b2e74c2f2106.jpg

方法二的推导模型公式:

08c62d670a3cbf584ecbc1e0b2e3bfd82a3.jpg

方法三:直接使用scipy的线性拟合函数。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值