原理
一元线性回归模型:
从上公式可以看出,每个样本带到公式里后,公式形式相同,β0和β1相同,ε不同。ε服从标准正太分布。其中,β0和β1是未知参数,ε是由其他随机因素引起的。
一元线性回归模型的关键问题是求解β0和β1、σ2的值。
β0和β1的求解
采用最小二乘法:
得到:
因此:
σ2的估计
从上推导过程可以看出,β0和β1、σ2的估计值都可以由样本值计算得出。
python简单实现
import numpy as np
import matplotlib.pyplot as plt
class SimpleRegress(object):
def __init__(self, x_data, y_data):
self.x_data = x_data
self.y_data = y_data
self.b0 = 0
self.b1 = 1
return
def calculate_work(self): # 回归方程中b0、b1的求解
x_mean = np.mean(self.x_data) # x_mean= 14.0
y_mean = np.mean(self.y_data) # y_mean= 130.0
x1 = self.x_data - x_mean # x1= [-12. -8. -6. -6. -2. 2. 6. 6. 8. 12.]
y1 = self.y_data - y_mean # y1= [-72. -25. -42. -12. -13. 7. 27. 39. 19. 72.]
s = x1 * y1 # s= [864. 200. 252. 72. 26. 14. 162. 234. 152. 864.]
u = x1 * x1 # u= [144. 64. 36. 36. 4. 4. 36. 36. 64. 144.]
self.b1 = np.sum(s) / np.sum(u) # b1= 5.0
self.b0 = y_mean - self.b1 * x_mean # b0= 60.0
return
def test_data_work(self, text_data): # 回归方程的建立与数值预测
result = list([])
for one_test in text_data:
y = self.b0 + self.b1 * one_test
result.append(y)
return result
def root_data_view(self): # 绘制源数据可视化图
plt.scatter(x_data, y_data, label='simple regress', color='k', s=5) # s 点的大小
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
return
def test_data_view(self): # 绘制回归线
# 绘制回归线两个点的数据
x_min = np.min(self.x_data)
x_max = np.max(self.x_data)
y_min = np.min(self.y_data)
y_max = np.max(self.y_data)
x_plot = list([x_min, x_max])
y_plot = list([y_min, y_max])
# 绘制
plt.scatter(x_data, y_data, label='root data', color='k', s=5) # s 点的大小
plt.plot(x_plot, y_plot, label='regression line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('simple linear regression')
plt.show()
return
x_data = list([2, 6, 8, 8, 12, 16, 20, 20, 22, 26])
y_data = list([58, 105, 88, 118, 117, 137, 157, 169, 149, 202])
test_data = list([16])
sr = SimpleRegress(x_data, y_data)
sr.calculate_work()
result = sr.test_data_work(test_data) # result= [140.0]
# sr.root_data_view()
sr.test_data_view()
效果图:
参考:一元线性回归(一)----简单线性回归与最小二乘法