一 理论与基础
自变量:样本的特征数值
因变量:需要预测的样本的预测值
1 简单线性回归(simple linear regression)
y:样本的预测值,即回归模型中的应变量
x:样本的特征数值,即回归模型中的自变量
:回归模型中的误差项,误差项说明了包含在y里面,但不能被x与y之间线性关系解释的变异性
2 线性回归方程
,可以看到它是一条直线
: 回归直线y轴的截距
: 回归直线y轴的斜率
对于一个给定的x值,E(y)是y的均值或期望值
3 简单线性回归方程,可以分析两个变量的关系
x值越大,E(y)越大,呈正相关
x值越大,E(y)越小,呈负相关
当回归方程的图为一条直线时,两个变量没有相关性
4 估计的简单线性回归方程
对于一个给定的x值是y的平均值E(y)的一个点估计
5 最小二乘准则
式中,为对第i次观测,应变量的观测值;为对与第i次观测,应变量的预测值。
6 估计的回归方程的斜率和y轴的截距
式中,为对于第i次观测,自变量的值,为对于第i次观测,应变量的观测值;为自变量的样本平均值,为应变量的样本平均值,n为总观测次数
二 应用与实现
1 一个简单的例子
Armand比萨饼连锁店是经营意大利食品的餐馆,它们分布在美国5个洲的范围内。Armand比萨饼连锁店的最佳位置是在大学校园附近,管理人员确信,这些连锁店的季度销售收入与学生人数是正相关的。
下面是10家armand比萨饼店的季度销售数据,观测次数n=10,数据中给出了应变量为比萨饼店季度销售额,自变量为当前比萨饼店所在的学校的学生人数,现有一家新开的比萨饼店,已知这家店附近的学生人数,求比萨饼店季度销售额
数据如下图:
表中的数据单位为千
2 使用python3.6的实现代码
下面两张图为程序运行后,绘制的数据可视化图,上图为源数据的散点图,下图为回归线的绘制
代码如下:
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()