最小二乘法原理推导和代码演示
程序员文章站
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()
上一篇: KNN算法及其应用
下一篇: 让人一脸蒙圈的奇葩图片