判定系数:用于估计回归方程是否很好的拟合了样本的数据,判定系数为估计的回归方程提供了一个拟合优度的度量
1 误差平方和---SSE
对于样本中的第i次的观测值,应变量的观测值和应变量的预测值之间的离差为第i个残差,第i个残差表示用去估计的误差,
于是,对于第i次观测值,它的残差是 - ,这些残差或误差的平方和是一个用最小二乘来极小化的量。这个量就是误差平方和,记作SSE
简单总结为:实际观测值与回归方程预测值之差的平方再求和
公式:SSE =
2 总平方和---SST
简单总结为:样本的观测值与样本均值之差的平方再求和
我们依然使用上一篇中披萨饼的数据例子,求得的回归方程为: = 60 + 5x,样本均值为 y(mean) = 130,我们把SST看作是观测值在直线y(mean) = 130周围聚集程度的度量,而把SSE看作是观测值在回归线 = 60 + 5x周围的聚集程度的度量。
公式:SST =
3 回归平方和---SSR
我们依然使用上一篇中披萨饼的数据例子,求得的回归方程为: = 60 + 5x,样本均值为 y(mean) = 130,回归平方和用来度量:在估计的回归线上的 值与直线y(mean)的偏离的大小
简单总结为:回归方程的预测值与样本均值之差的平方再求和
公式:SSR =
4 统计学中的一个重要结论:
公式:SST = SSR + SSE
即:总平方和 = 回归平方和 + 误差平方和
对于这个结论的一点理解:
如果应变量每一个值都刚好落在估计的回归线上,那么估计的回归方程将给出一个完全的拟合,在这种情况下,对于每一个观测值,-的值将等于0,即SSE=0,因为SST = SSR + SSE,我们可以看到对于一个完全的拟合,SST必然等于SSR,并且SSR/SST必然等于1。这种情况是理想情况下最好的拟合,因为SSE=0,但实际中一般不会存在这种情况。
比较差的拟合,将导致SSE的值计较大,我们把公式变换下SSE = SST - SSR,因此当SSR=0时,SSE=SST,此时SSE的值最大,即最差的拟合
5 判定系数
回归平方和与总平方和的比值,这个值的取值范围在区间[0, 1]之间,SSR/SST这个值用来对估计的回归方程的拟合优度作出评估,这个比值被称为判定系数,记作。
公式:
判定系数的意义:如果我们用一个百分数表示判定系数,我们能把理解为总平方和中能被估计的回归方程解释的百分比。
例子:对于上一篇中比萨饼连锁店的例子,判定系数的值为:
= SSR / SST = 14200 / 157300 = 0.9027
在用估计的回归方程去预测季度销售收入时,我们能判定,总平方和中的90.27%能被估计的回归方程 = 60 + 5x所解释,换句话说,季度销售收入变异性的90.27%能被学生人数和销售收入之间的线性关系所解释。
6 相关系数
前几篇中说过皮尔逊积相关系数,这里相关系数的另一种求法
公式: * (的符号)
式中:为估计的回归方程的斜率
的值,在区间[-1, 1]之间,越接近于0,x与y之间相关性越小,大于0时,表示x与y存在正相关性,小于0时,表示x与y存在负相关性。
7 下面是披萨饼店例子中各评估数据的求取的实现,具体数据请看上一篇传送门,使用python3.6实现
def predicate_work(self): # 求取模型的各评估值
pre_x_data = self.test_data_work(self.x_data)
# [70.0, 90.0, 100.0, 100.0, 120.0, 140.0, 160.0, 160.0, 170.0, 190.0]
# 这里不同于机器学习中的监督学习算法,这里是把源数据带入回归方程,得到的样本预测值
y_mean = np.mean(self.y_data)
# 计算SSE
tem1 = np.array(self.y_data)- np.array(pre_x_data)
tem1 = np.square(tem1) # 求各元素平方
sse = np.sum(tem1) # sse= 1530.0
# 计算SST
tem2 = self.y_data - y_mean
tem2 = np.square(tem2)
sst = np.sum(tem2) # sst= 15730.0
# 计算SSR
tem3 = pre_x_data - y_mean
tem3 = np.square(tem3)
ssr = np.sum(tem3) # ssr= 14200.0
# 证明SST = SSR + SSE
tem4 = ssr + sse
if sst == tem4:
print('the SST = SSR + SSE is true')
# 计算判定系数
rr = ssr / sst # rr= 0.9027336300063573
# 计算相关系数
tem5 = self.b1 * (1 / np.abs(self.b1)) # 取b1的正号或负号
tem6 = np.sqrt(rr)
r_xy = tem5 * tem6 # r_xy= 0.9501229552044079
dict = {'SSE' : sse, 'SST' : 'sst', 'SSR' : 'ssr', 'pdxs' : rr, 'xgxs' : r_xy}
return dict
请在上一篇代码中,类SimpleRegress中加入上述方法,可运行得到结果