第二讲_线性回归

线性回归模型 linear regression

第一步:数据集 dataset 维度-->自变量的个数 维度大于等于三,统一叫超平面,公式上很直观

第二步:parameters 参数-->权重和常数项

第三步:损失函数 loss function --> MSE 均方误差 损失函数其实就是复合函数

均方误差(Mean Squared Error,MSE)是一种常用的衡量估计量与被估计量之间差异程度的指标。

一、定义

均方误差是各数据偏离真实值的距离平方和的平均数,即:

\(MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y_i})^2\)

其中,\(n\) 是样本数量,\(y_i\) 是 真实值,\(\hat{y_i}\) 是估计值。

二、特点

  1. 非负性:均方误差的值始终是非负的,当且仅当估计值与真实值完全相等时,均方误差为零。
  2. 对误差的放大作用:由于计算的是误差的平方,所以对较大的误差会给予更大的权重,这使得均方误差对异常值比较敏感。

三、应用场景

  1. 回归分析:在机器学习和统计学的回归问题中,均方误差常被用作损失函数,通过最小化均方误差来优化模型参数,使模型的预测值尽可能接近真实值。
  2. 信号处理:用于评估信号重建或滤波的效果。
  3. 质量控制:在工业生产中,可以用来衡量产品的质量与标准值之间的差异。

例如,在房价预测问题中,使用均方误差作为损失函数,通过不断调整模型参数,使得模型预测的房价与实际房价之间的均方误差最小化,从而提高房价预测的准确性。

模型

选择线性模型,一元一次方程

线性回归模型的损失函数是均方误差的一半

alt text

损失函数是针对每个样本点计算:

\(\frac{1}{2}MSE=\frac{1}{2}(y_i-\hat{y_i})^2\)

代价函数是损失函数求和并取均值(取均值消除样本数量的影响):

\(\frac{1}{2}MSE=\frac{1}{2}\times\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y_i})^2\)

损失函数 相对 代价函数要重要一点!

因为损失函数是标准,损失函数更重要,损失函数确定好了,代价函数无非就是对于损失函数的求和

复习数学知识:

优化算法---梯度下降法

梯度下降法的思想是基于损失函数的梯度(或者说斜率)来更新参数,以达到最小化损失函数的目的

参数空间和特征空间的概念

学习率:https://blog.csdn.net/m17635262186/article/details/136134379 (【python机器学习】——梯度下降法)

学习率是超参数,是人自己设置的,而不是机器自己学习能够得到的

梯度下降算法常见的三种类型:

  • 全量梯度下降
  • 随机梯度下降
  • 小批量梯度下降

一、全量梯度下降:

每次迭代都使用整个训练数据集来计算损失函数关于模型参数的梯度,内存需求量大

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
# 全量梯度下降 参考:http://t.csdnimg.cn/mK1HJ
import numpy as np
import matplotlib.pyplot as plt
#创建数据集X,y
np.random.seed(1) # 设置随机数种子为 1,确保每次运行代码时生成的随机数具有可重复性
X = np.random.rand(100,1)
y = 4+3*X+np.random.randn(100,1) # 随机噪声 np.random.randn(100,1), 随机噪声符合标准正态分布
X_b = np.c_[np.ones((100,1)),X] # 对输入特征 X 进行处理,在其左侧添加一列全为 1 的向量,得到 X_b,这是为了在进行线性回归时考虑截距项(即当 X 为 0 时的 y 值)

#创建超参数
learning_rate = 0.001
n_iterations = 10000

#1.初始化θ,W0...Wn,标准正态分布创建W
theta = np.random.randn(2,1) # 包含了截距和斜率两项

#4.判断是否收敛,一般不会设定阈值,而是直接采用设置相对大的迭代次数,保证可以收敛
for _ in range(n_iterations):
#2.求梯度 计算gradient
gradients = X_b.T.dot((X_b.dot(theta)-y))
#3.应用梯度下降法的公式去调整θ值,θt+1=θt-η*gradient
theta = theta-learning_rate*gradients
print(theta)

plt.scatter(X, y)
plt.plot(X, X_b.dot(theta), color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Scatter Plot of y vs X')
plt.show()
alt text

二、随机梯度下降:

梯度下降算法每次从训练集中随机选择一个样本来进行学习,每次的学习是非常快的,并且可以进行在线更新,但是也有缺点,在于每次更新可能并不会按照正确的方向进行,带来优化波动。

  • 当训练数据集非常大时,随机梯度下降是一种常用的优化算法。它可以在每次迭代中快速处理少量样本,从而减少计算时间内存需求
  • 在在线学习场景中,数据不断地到来,随机梯度下降可以实时地根据新数据更新模型参数,适用于处理动态变化的数据集
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
import numpy as np
import matplotlib.pyplot as plt

X = 2*np.random.rand(100,1)
y = 4+2*X+np.random.randn(100,1)

X_b = np.c_[np.ones((100,1)),X]

n_epoches = 10000 # epoches表示迭代的轮数,一个 epoch 是指将整个训练数据集完整地遍历一次
m = 100
learing_rate = 0.001
theta = np.random.randn(2,1)
for epoche in range(n_epoches): # 迭代 n_epoches 次
for _ in range(m): # 遍历 m 个样本
random_index = np.random.randint(m) #有放回的采样
xi = X_b[random_index:random_index+1]
yi = y[random_index:random_index+1]
gradients = xi.T.dot(xi.dot(theta)-yi)
theta = theta - learing_rate*gradients

print(theta)

plt.scatter(x=X,y=y)
plt.plot(X,X_b.dot(theta),color='r')
plt.xlabel('X')
plt.ylabel('y')
plt.show()
alt text

三、小批量梯度下降算法

小批量梯度下降优化算法是一种优化算法,结合了全量梯度和随机梯度下降的优点,广泛应用于机器学习和深度学习中

  • 第一步将数据集划分为若干个小的批量mini-batch,每个小批量包含一定数量的样本
  • 小批量梯度下降算法在每次迭代中使用一个小批量的样本来进行计算,既不像全量梯度下降算法需要计算整个数据集的梯度,也不像随机梯度下降算法只使用一个样本(可能会导致更新方向的不稳定性)

2024年9月11日晚 实验课的作业:

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
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

def cost_gradient(W, X, Y, n):
G = X.T.dot(X.dot(W)-Y) ###### Gradient
j = (1/n)*np.sum((X.dot(W)-Y)**2) ###### cost with respect to current W

return (j, G)

def gradientDescent(W, X, Y, lr, iterations):
n = np.size(Y)
J = np.zeros([iterations, 1])

for i in range(iterations):
(J[i], G) = cost_gradient(W, X, Y, n)
W = W - lr * G ###### Update W based on gradient

return (W,J)

iterations = 10 ###### Training loops
lr = 0.00001 ###### Learning rate

data = np.loadtxt('LR.txt', delimiter=',')

n = np.size(data[:, 1])
W = np.zeros([2, 1])
X = np.c_[np.ones([n, 1]), data[:,0]]
Y = data[:, 1].reshape([n, 1])

(W,J) = gradientDescent(W, X, Y, lr, iterations)

#Draw figure
plt.figure()
plt.plot(data[:,0], data[:,1],'rx')
plt.plot(data[:,0], np.dot(X,W))

plt.figure()
plt.plot(range(iterations), J)
alt text
alt text

梯度下降模型的局限

1、如果梯度在某点为0,则无法确定参数的更新方向,导致梯度下降算法无法收敛。

2、梯度下降算法在某些情况下可能无法收敛到最优解,例如在非凸函数上,或者当函数的梯度存在非线性项时。

线性回归模型总结

四个部分:

  • 数据

  • 模型

  • 损失函数/代价函数

  • 优化算法

对于后面的每一个模型,都需要按照这四个部分进行学习,非常重要,一定要掌握!!!

补充的内容:

最小二乘法与梯度下降算法辨析:

二者都是用于求解回归问题的常用方法,它们的主要区别如下:

一、原理

  1. 最小二乘法:通过最小化误差的平方和来确定数据的最佳拟合直线或曲线。它基于解析的方法直接求解使误差平方和最小的参数值
  • 对于线性回归问题,最小二乘法可以通过求解正规方程来得到参数的解析解。即对于线性模型 \(y = w_1x_1 + w_2x_2 +... + w_nx_n + b\),最小二乘法通过最小化实际值 \(y\) 与预测值 \(\hat{y}\) 之间的误差平方和 \(S=\sum_{i=1}^{m}(y_i-\hat{y}_i)^2\),其中 \(m\) 是样本数量,\(\hat{y}=w_1x_{1i}+w_2x_{2i}+...+w_nx_{ni}+b\),来确定参数 \(w_1,w_2,...,w_n,b\) 的值。

    • 要点一:最小二乘法是直接求解参数

    • 要点二:最小二乘法是解方程

  1. 梯度下降算法:是一种迭代优化算法,通过不断地沿着目标函数的负梯度方向更新参数,以逐渐减小目标函数的值。
  • 在回归问题中,目标函数通常是误差平方和。对于线性回归,目标函数为 \(S=\sum_{i=1}^{m}(y_i-\hat{y}_i)^2\),其中 \(\hat{y}=w_1x_{1i}+w_2x_{2i}+...+w_nx_{ni}+b\)。梯度下降算法从初始的参数值开始,每次迭代计算目标函数关于参数的梯度,然后沿着负梯度方向更新参数,即 \(w_j = w_j-\alpha\frac{\partial S}{\partial w_j}\),其中 \(\alpha\) 是学习率,控制每次更新的步长。

    • 梯度下降算法的目标函数的均方误差和,这样就与最小二乘法非常相似,但最小二乘法是直接求解参数,而梯度下降算法是迭代求解参数。

    • 是一种迭代优化算法,线性非线性的回归问题都可以使用梯度下降算法。

二、二者的优缺点

  1. 最小二乘法:
    • 优点:如果数据满足一定的条件(如线性独立、满秩等),可以直接得到全局最优解,计算速度快。
    • 缺点:当数据量很大或特征维度很高时,计算正规方程的逆矩阵可能会非常耗时甚至不可行,并且对异常值比较敏感
  2. 梯度下降算法:
    • 优点:适用于大规模数据和高维度问题,可以通过调整学习率等参数来控制算法的收敛速度和性能。对异常值相对不那么敏感。
    • 缺点:需要选择合适的学习率,学习率过大可能导致算法不收敛,学习率过小则收敛速度会很慢。并且只能得到局部最优解,可能会陷入局部极小值。

第二讲_线性回归
http://jrhu0048.github.io/2024/09/11/ji-qi-xue-xi/di-er-jiang-xian-xing-hui-gui/
作者
JR.HU
发布于
2024年9月11日
更新于
2024年10月25日
许可协议