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

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

在这里插入图片描述

代码演示,这里生成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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章