“最小二乘法”估计线性模型的参数(权重w
和截距b
)
import numpy as np
import matplotlib.pyplot as plt
import random
x=np.linspace(1,20,50)
noise=np.random.normal(0,2,(1,50))
w_real=rd.random()
b_real=rd.randint(2,5)
y=x*w_real+b_real+noise
x_avg=np.mean(x)
w=np.sum(y*(x-x_avg))/(np.sum(x*x)-x_avg*np.sum(x))
print(w_real,w)
y_avg=np.mean(y)
b=y_avg-np.mean(w*x)
print(b_real,b)
plt.scatter(x,y)
plt.plot(x,w*x+b)
plt.show()
1.导入库:
np
是 NumPy 的缩写,这是一个用于处理数组和矩阵的强大库。plt
是 Matplotlib.pyplot 的缩写,用于绘图。rd
是random
的缩写
2.生成数据:
x=np.linspace(1,20,50) # 生成一个包含50个点的等差数列,从1到20
noise=np.random.normal(0,2,(1,50)) # 生成一个形状为(1,50)的数组,包含来自正态分布的随机噪声
w_real=rd.random() # 生成一个随机斜率,但这里假设rd是random的某种形式
b_real=rd.randint(2,5) # 生成一个2到4之间的随机整数作为截距
y=x*w_real+b_real+noise # 根据斜率、截距和噪声生成y值
3.简单线性回归(最小二乘法):
这里使用了最小二乘法的公式来估计斜率 w
x_avg=np.mean(x) # 计算x的平均值
w=np.sum(y*(x-x_avg))/(np.sum(x*x)-x_avg*np.sum(x)) # 使用最小二乘法公式计算斜率
print(w_real,w) # 打印真实的斜率和估计的斜率
4.截距:
使用斜率 w
和数据点的平均值来估计截距 b
y_avg=np.mean(y) # 计算y的平均值
b=y_avg-np.mean(w*x) # 使用斜率w和x的平均值来估计截距b
print(b_real,b) # 打印真实的截距和估计的截距
5.绘图
plt.scatter(x,y) # 绘制数据点
plt.plot(x,w*x+b) # 绘制拟合的直线
plt.show() # 显示图像