欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最小二乘法原理推导和代码演示

程序员文章站 2022-06-04 10:48:47
...

原理推导公式太多,写到草稿纸上,下图所示:

最小二乘法原理推导和代码演示

代码演示,这里生成200个0到100的数值X,且这个数值间隔相同。再通过给定权重w、偏置b、噪音noise,生成200个对应的Y值。最后通过最小二乘法计算出最适合的权重w和b来拟合这些数据。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,100,200)
noise = np.random.normal(loc=0,scale = 20,size=200)
y = 3*x+10+noise
def complute_loss(w,b,x,y): #计算损失
    loss_total = 0
    for i in range(len(x)):
        loss_total += (w*x[i]+b-y[i])**2
    return loss_total
def average(data): #求平均值
    data_sum = 0
    for i in range(len(data)):
        data_sum += data[i]
    data_aver = data_sum/len(data)
    return data_aver
def fit(x,y):   #求w和b
    up = 0 #分子
    down = 0 #分母
    x_bar = average(x)
    y_bar = average(y)
    for i in range(len(x)):
        up += x[i]*y[i]
        down += x[i]**2
    up -= len(x)*x_bar*y_bar
    down -= len(x)*x_bar**2
    w = up/down
    b = y_bar-w*x_bar
    return w,b
w,b = fit(x,y)
y_pre = w*x +b
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.scatter(x,y,c='c')
plt.title('x和y的关系图')
plt.plot(x,y_pre,'r')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

最小二乘法原理推导和代码演示

相关标签: math