简单的线性回归与最小二乘法

时间:2024-03-23 19:31:12

一  理论与基础

自变量:样本的特征数值

因变量:需要预测的样本的预测值

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()