梯度下降法实现线性回归

梯度下降法实现线性回归

一、梯度下降法的简单介绍

1.梯度下降法寻找全局最小值的过程在这里插入图片描述

不能保证梯度下降法总是能够找到全局最小值,有时还可能找到局部最小值,这也是梯度下降法的缺点。

repeat until convergence{
θ j : = θ j − α ∂ J ( θ 0 , θ 1 ) ∂ θ j ( f o r   j = 0   a n d   j = 1 ) \theta_{j} := \theta_{j} - \alpha\frac{\partial J(\theta_{0}, \theta_{1})}{\partial{\theta_{j}}} \quad (for\ j =0\ and\ j=1) θj:=θjαθjJ(θ0,θ1)(for j=0 and j=1)
}

其中α为学习率
学习率不可以太小,也不可以太大,可以多尝试一些值0.1, 0.03, 0.01, 0.0001…
如果学习率过小,寻找全局最小值的时间会过长
如果学习率过大,可能会导致调整的时候过大,找不到全局最小值,陷入局部极小值

二、线性回归的模型和代价函数

h θ = θ 1 x + θ 0 h_{\theta} = \theta_{1}x + \theta_{0} hθ=θ1x+θ0
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_{0},\theta_{1}) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})^2 J(θ0,θ1)=2m1i=1m(hθ(x(i))y(i))2

∂ J ( θ 0 , θ 1 ) ∂ θ j = { j = 0 : ∂ J ( θ 0 , θ 1 ) ∂ θ 0 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) j = 1 : ∂ J ( θ 0 , θ 1 ) ∂ θ 1 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \frac{\partial J(\theta_{0},\theta_{1})}{\partial\theta_{j}} = \begin{cases} j = 0:\quad \frac{\partial J(\theta_{0}, \theta_{1})}{\partial \theta_{0}} = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})\\ j=1 : \quad \frac{\partial J(\theta_{0}, \theta_{1})}{\partial \theta_{1}} = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)} \end{cases} θjJ(θ0,θ1)={j=0:θ0J(θ0,θ1)=m1i=1m(hθ(x(i))y(i))j=1:θ1J(θ0,θ1)=m1i=1m(hθ(x(i))y(i))x(i)

repeat until convergence
{
θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \theta_{0} := \theta_{0} - \alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)}) θ0:=θ0αm1i=1m(hθ(x(i))y(i))

θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \theta_{1} := \theta_{1} - \alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})x^{(i)} θ1:=θ1αm1i=1m(hθ(x(i))y(i))x(i)

}

线性回归的代价函数是凸函数

在这里插入图片描述

三、代码实现

import numpy as np
import matplotlib.pyplot as plt

# 导入数据

x_data = np.array([0, 1, 2, 3, 4])
y_data = np.array([1.5, 2.5, 3.8, 5.0, 7.5])
y_data = np.log(y_data)
plt.scatter(x_data, y_data)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jaWMOpjQ-1664413032760)(C:\Users\25016\AppData\Roaming\Typora\typora-user-images\image-20220929085148523.png)]

# 步长
lr = 0.01
#截距
b = 0
# 斜率 
k = 0
# 最大迭代次数
epochs = 5000

#最小二乘法
def computer_error(b, k, x_data, y_data):
    totalError = 0
    for i in range(0, len(x_data)):
        totalError += (y_data[i] - (k*x_data[i] + b)) ** 2  #代价函数
    return totalError / float(len(x_data)) / 2.0

def tdxj(x_data, y_data, b, k, lr, epoches):
    # 计算
​    m = float(len(x_data))
    # 循环i次for i in range(epochs):
​        b_grad = 0
​        k_grad = 0

        # 计算梯度的总和求平均for j in range(0, len(x_data)):
​            b_grad += -(1/m) * (y_data[j] - ((k * x_data[j]) + b))
​            k_grad += -(1/m) * x_data[j] * (y_data[j] - ((k * x_data[j]) + b))

        # 更新b和k
​        b = b - (lr * b_grad)
​        k = k - (lr * k_grad)return b, k
b, k = tdxj(x_data, y_data, b, k, lr, epochs)
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k*x_data+b, 'r')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9MLmLscR-1664413032761)(C:\Users\25016\AppData\Roaming\Typora\typora-user-images\image-20220929085527395.png)]

b = np.exp(b)
b
plt.plot(x_data,b*np.exp(k*x_data),'r')
y_data = np.array([1.5, 2.5, 3.8, 5.0, 7.5])
plt.scatter(x_data, y_data)

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Python代码对梯度下降算法实现线性回归的示例: 首先,我们需要导入所需的包: ```python import numpy as np import matplotlib.pyplot as plt ``` 然后,我们定义一个函数来计算误差,即损失函数: ```python def compute_cost(X, y, theta): m = len(y) predictions = X.dot(theta) square_err = (predictions - y) ** 2 J = 1 / (2 * m) * np.sum(square_err) return J ``` 其中,X是一个m行n列的特征矩阵,y是一个m行1列的目标向量,theta是一个n行1列的参数向量,m是样本数量,n是特征数量。 接下来,我们定义一个函数来执行梯度下降算法: ```python def gradient_descent(X, y, theta, alpha, num_iters): m = len(y) J_history = np.zeros((num_iters, 1)) for i in range(num_iters): predictions = X.dot(theta) errors = np.subtract(predictions, y) delta = (alpha / m) * X.transpose().dot(errors) theta = theta - delta J_history[i] = compute_cost(X, y, theta) return theta, J_history ``` 其中,alpha是学习率,num_iters是迭代次数,J_history记录了每次迭代后的损失函数值。 最后,我们可以使用上述函数来拟合一个简单的线性模型: ```python # 生成随机数据 np.random.seed(0) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # 对特征矩阵X添加一列全为1的向量,以便于计算截距 X_b = np.c_[np.ones((100, 1)), X] # 初始化参数向量theta theta = np.random.randn(2, 1) # 执行梯度下降算法 alpha = 0.1 num_iters = 1000 theta, J_history = gradient_descent(X_b, y, theta, alpha, num_iters) # 绘制拟合直线 plt.scatter(X, y) plt.plot(X, X_b.dot(theta), 'r') plt.show() ``` 这里我们生成了一个简单的一维数据集,然后对其进行线性回归拟合并绘制出拟合直线。 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值