• 代数与逻辑:作业一 线性模型


    代数与逻辑:作业一 线性模型

    一、作业要求

    1. 简述线性回归模型的数学表达与物理意义,举例说明。
    2. 编程实现线性回归模型的求解(最小二乘法与梯度下降法)。
    3. 选择公开数据集,编程实现利用线性回归模型进行预测建模。注:数据集选择回归问题数据集,先对数据进行规范化处理,然后选择部分数据训练模型,剩余数据对模型进行测试,重复20次数据集划分,输出平均预测精度。

    二、回归模型的数学表达式与物理意义

    1、什么是线性回归

    线性回归是一种算法,它提供自变量和因变量之间的线性关系来预测未来事件的结果。它是一种在数据科学和机器学习中用于预测分析的统计方法。

    自变量也是由于其他变量的变化而保持不变的预测变量或解释变量。但是,因变量会随着自变量的波动而变化。回归模型预测因变量的值,即被分析或研究的响应或结果变量。

    因此,线性回归是一种监督学习算法,它模拟变量之间的数学关系,并对销售、工资、年龄、产品价格等连续或数值变量进行预测。

    当数据中至少有两个变量可用时,这种分析方法是有利的,如在股票市场预测、投资组合管理、科学分析等中所观察到的。

    倾斜的直线代表线性回归模型。

    在这里插入图片描述

    在上图中,x轴是自变量,y轴是输出/因变量,回归线是模型的最佳拟合线,在这里,为适合所有问题的给定数据点绘制了一条线。因此,它被称为“最佳拟合线”。线性回归算法的目标是找到上图中看到的最佳拟合线。

    2、线性回归方程

    线性回归线具有Y = a + bX形式的方程,其中X是解释变量,Y是因变量。直线的斜率为ba是截距( x = 0 时y的值)。

    举个例子,我们考虑一个涵盖RAM 大小及其相应成本的数据集。

    在这种情况下,数据集包含两个不同的特征:内存(容量)和成本。RAM 越多,RAM 的购买成本就越高。

    Ram CapacityCost
    2 GB$12
    4 GB$16
    8 GB$28
    16 GB$62

    如果我们在 X 轴上绘制 RAM,在 Y 轴上绘制其成本,则从图表的左下角到右上角的线表示 X 和 Y 之间的关系。在散点图上绘制这些数据点,我们得到下图:

    在这里插入图片描述

    内存成本比可能会根据不同的制造商和RAM版本而有所不同,但数据趋势显示出规律。左下角的数据显示内存更小且价格更低的 RAM,这条线一直延伸到图表的右上角,其中 RAM 容量更大且成本更高)。

    回归模型定义了 X 和 Y 变量之间的线性函数,可以最好地展示两者之间的关系。它由上图中的斜线表示,其目标是确定最适合所有单个数据点的最佳“回归线”。

    三、线性回归模型的求解

    1、最小二乘法

    我们定义一个数据集,其中每个特征x都有一个响应值y。

    在这里插入图片描述

    回归方程表示:

    h(xi)=β01xi

    其中h(x_i)表示第i个观察的预测响应值,b_0和b_1是回归系数,分别代表回归线的y截距和斜率。

    使用最小二乘法原理我们需要考虑

    在这里插入图片描述

    这里,e_i 是第 i 个观察中的残差。 因此,我们的目标是最小化总残差。我们将平方误差或成本函数 J 定义为:

    在这里插入图片描述

    我们的任务是找到 b_0 和 b_1 的值,其中 J(b_0,b_1) 最小。

    在这里插入图片描述

    其中 SS_xy 是 y 和 x 的交叉偏差之和:

    在这里插入图片描述

    SS_xx 是 x 的平方偏差之和:

    在这里插入图片描述

    上述问题用python实现:

    import numpy as np
    import matplotlib.pyplot as plt
    
    def estimate_coef(x, y):
    	# 观察次数/点数
    	n = np.size(x)
    
    	# x 和 y 向量的平均值
    	m_x = np.mean(x)
    	m_y = np.mean(y)
    
    	# 计算关于 x 的交叉偏差和偏差
    	SS_xy = np.sum(y*x) - n*m_y*m_x
    	SS_xx = np.sum(x*x) - n*m_x*m_x
    
    	# 计算回归系数
    	b_1 = SS_xy / SS_xx
    	b_0 = m_y - b_1*m_x
    
    	return (b_0, b_1)
    
    def plot_regression_line(x, y, b):
    	# 将实际点绘制为散点图
    	plt.scatter(x, y, color = "m",
    			marker = "o", s = 30)
    
    	# 预测响应向量
    	y_pred = b[0] + b[1]*x
    
    	plt.plot(x, y_pred, color = "g")
    
    	plt.xlabel('x')
    	plt.ylabel('y')
    
    	plt.show()
    
    def main():
    	# 观察/数据
    	x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    	y = np.array([1, 3, 2, 5, 7, 8, 8, 9, 10, 12])
    
    	# 估计系数
    	b = estimate_coef(x, y)
    	print("估计系数:\nb_0 = {} \
    		\nb_1 = {}".format(b[0], b[1]))
    
    	# 绘制回归线
    	plot_regression_line(x, y, b)
    
    if __name__ == "__main__":
    	main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    运行的结果是:

    估计系数:
    b_0 = 1.2363636363636363 
    b_1 = 1.1696969696969697
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2、梯度下降法

    我们将逐步迭代以达到最佳点。W 从任意的权重值开始,并检查该点的梯度。我们的目标是达到谷底的最小值。所以我们的梯度应该总是负的。

    在这里插入图片描述

    接下来,我们需要更新权重以使它们更接近最小值。我们有以下等式:

    在这里插入图片描述

    这意味着下一次迭代中的权重将是上一次迭代中的权重减去更新。现在这个更新有两个组成部分:方向——斜率或梯度,以及——步长。渐变将是:

    在这里插入图片描述

    我们需要考虑的第二个组成部分是步长——α。这是一个超参数,我们需要在算法开始之前决定它。如果 α 太大,那么我们的优化器将大跃进,永远找不到最小值。相反,如果将它设置得太小,优化器将永远达到最小值。因此,我们需要事先为 α 设置一个最佳值。

    因此,我们的权重更新方程变为:

    在这里插入图片描述

    总的步骤就是:

    1. 初始化权重 W0、W1 的值——可以是任意值,步长 α——需要一个好的值。
    2. 找到所有 X 的目标 Ŷ = W0 + W1.X 的预测。
    3. 计算误差值 (Ŷ-Y) 和 MSE。
    4. 根据梯度下降更新规则更新权重。
    5. 重复 2-4。

    上述工作我们用Python来实现一下:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义数据集
    x = np.array([1, 3, 5])
    y = np.array([5, 12, 18])
    
    # 初始化权重和选择步长
    W0_new = 0
    W1_new = 0
    a = 0.04
    MSE = np.array([])
    
    # 对数据集进行多次迭代,计算每次迭代的均方误差并更新权重
    for iteration in range(1, 11):
        y_pred = np.array([])   # 预测目标
        error = np.array([])    # 每次迭代的误差值:(Ŷ-Y)
        error_x = np.array([])
        
        # 分配更新的权重
        W0 = W0_new
        W1 = W1_new
        
        # 逐行迭代x,以计算Ŷ和错误
        for i in x:
            # Ŷ = W0 + W*X
            y_pred = np.append(y_pred, (W0 + W1*i))
            
        error = np.append(error, y_pred-y)      # 计算每个样本的误差
        error_x = np.append(error_x, error*x)
        MSE_val = (error**2).mean()     # 计算MSE值
        MSE = np.append(MSE, MSE_val)
        
        W0_new = W0 - a*np.sum(error)       # 计算更新W0
        W1_new = W1 - a*np.sum(error_x)     # 计算更新W1
    
    # 查看最终权重   
    print("W0=", W0_new)
    print("W1=", W1_new)
    
    # 检查预测的目标变量Ŷ和误差
    print("y_pred:", y_pred)
    print("error:", error)
    
    # 绘制每次迭代的均方误差值
    print("MSE:", MSE)
    
    
    plt.plot(MSE, "b-o")
    plt.title("每次迭代的均方误差")
    plt.xlabel("迭代")
    plt.ylabel("MSE 值")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    运行的结果是:

    W0= 1.1474479185822484
    W1= 3.448230314024035
    y_pred: [ 4.5923844  11.51794949 18.44351457]
    error: [-0.4076156  -0.48205051  0.44351457]
    MSE: [164.33333333  40.35466667  10.05422336   2.64304765   0.8249095
       0.37371724   0.25687049   0.2220511    0.20759194   0.19840945]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    四、利用线性回归模型进行预测建模

    我们将使用 scikit-learn 中提供的加利福尼亚房价集。这记录了加州住房市场的 8 个属性以及中位价格的测量值。

    1、导入依赖项

    import pandas as pd
    from sklearn import datasets, linear_model
    from sklearn.model_selection import train_test_split
    from matplotlib import pyplot as plt
    
    • 1
    • 2
    • 3
    • 4

    2、加载数据集,将其转换为数据框并定义列名

    # 加载糖尿病数据集
    columns = "age sex bmi map tc ldl hdl tch ltg glu".split() # 声明列名
    diabetes = datasets.load_diabetes() # 从 sklearn 调用糖尿病数据集
    df = pd.DataFrame(diabetes.data, columns=columns) # 将数据集加载为 pandas 数据框
    y = diabetes.target # 将目标变量(因变量)定义为 y
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、定义训练集和测试集

    # 创建训练和测试变量
    X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.2)
    print(X_train.shape, y_train.shape)
    print(X_test.shape, y_test.shape)
    
    • 1
    • 2
    • 3
    • 4
    (353, 10) (353,)
    (89, 10) (89,)
    
    • 1
    • 2

    4、拟合模型

    # 拟合模型
    lm = linear_model.LinearRegression()
    model = lm.fit(X_train, y_train)
    predictions = lm.predict(X_test)
    
    • 1
    • 2
    • 3
    • 4

    5、预测

    print(predictions[0:5])
    
    • 1
    [181.69402001 151.31483349 159.42134908 188.13122001 168.83426575]
    
    • 1

    6、绘制模型

    plt.scatter(y_test, predictions)
    plt.xlabel("True Values")
    plt.ylabel("Predictions")
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    7、打印准确度

    print("Score:", model.score(X_test, y_test))
    
    • 1

    8、计算平均预测精度

    我们运行20次然后记录每次的精度然后求平均值。

    from numpy import *
    score = [0.5435576684039353, 0.5278223090263431, 0.5428586295068993, 0.48953519457408035, 0.4249912062254072, 0.42650991893500434, 0.5787191615733711, 0.37981926356039364, 0.4170187886884227, 0.5082912328753193 /
             0.5202580979798506, 0.532535890174009, 0.3087861414400682, 0.4466007206335131, 0.460212035904611, 0.40788387790519776, 0.5631222570259837, 0.5183668561533962, 0.4256938089725384, 0.4183517892689459]
    mean_score = mean(score)
    print(mean_score)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    平均值是:

    0.49417809118980843
    
    • 1
  • 相关阅读:
    全国职业院校技能大赛 - ruijie网络模块 - 样卷三解析
    Helm的安装和使用
    11.Ansible.roles角色
    【学生管理系统】班级管理
    Python-序列、集合和字典
    Dubbo3入门实践,SpringBoot+Dubbo+Nacos+DubboAdmin
    构建应用程序的低代码思路
    Spring拦截器的简单应用
    即时分账系统对B2B电商业务的重要性?
    计算机毕业设计 SSM家具定制管理系统 家具生产管理系统 家具订单管理系统
  • 原文地址:https://blog.csdn.net/qq_52417436/article/details/127418606