优化算法之梯度下降法

代价函数

现在有一拟合的线性函数:

                        h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+......

其代价函数为:

                        J(\theta)=\frac{1}{2m}\sum\limits_{i=1}\limits^{m}(h_0(x^{i})-y^i)^2

代价函数越小,则可以代表我们拟合出来的方程距离真实值最近;代价函数中分母有一个2,是为了,求偏导的时候前面没有系数.

代价函数对\theta_j求偏导可以得到:

                       \frac{​{\partial J(\theta )}}{​{\partial {\theta j}}} = \frac{1}{m}\sum\limits{i = 1}^m {[({h_\theta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}]}

 然后对\theta_j更新一下:

                      {\theta j} = {\theta j} - \alpha \frac{1}{m}\sum\limits{i = 1}^m {[({h\theta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}]}

由多元微分求导可知梯度所在的方向即为函数值下降最快的方向。

 

我们需要设置一个迭代次数和学习率,这两个值要根据不同的情景居中设置,是一种很好的数值优化算法。

代码演示:

1.先把所需要的库和数据导入

import numpy as np
import matplotlib.pyplot as plt
data=np.loadtxt("C:/学习笔记/python机器学习与数学建模/single.txt",delimiter=",")
x_data=data[:,0]
y_data=data[:,1]

 2.对数据进行初始化

learning_rate=0.05 #学习率
b=1
k=1           #初始化斜率和截距
n_iterables=100#迭代次数

3.设置代价函数

def compute_mse(b,k,x_data,y_data):
    total_error = 0
    for i in range(len(x_data)):
        total_error += (y_data[i] - (k * x_data[i] + b)) ** 2

    # 为方便求导:乘以1/2
    mse_ = total_error / len(x_data) / 2
    return mse_

4.开始多次迭代并每隔十次弄一个图像

def gradient_descent(x_data, y_data, b,  k,  learning_rate,  n_iterables):
    m = len(x_data)
    # 迭代
    for i in range(n_iterables):
        # 初始化b、k的偏导
        b_grad = 0
        k_grad = 0

        # 遍历m次
        for j in range(m):
            # 对b,k求偏导
            b_grad += (1 / m) * ((k * x_data[j] + b) - y_data[j])
            k_grad += (1 / m) * ((k * x_data[j] + b) - y_data[j]) * x_data[j]

        # 更新 b 和 k  减去偏导乘以学习率
        b = b - (learning_rate * b_grad)
        k = k - (learning_rate * k_grad)
        # 每迭代 10 次  输出一次图形
        if i % 10 == 0:
            print(f"当前第{i}次迭代")
            print("b_gard:", b_grad, "k_gard:", k_grad)
            print("b:", b, "k:", k)
            plt.scatter(x_data, y_data, color="maroon", marker="x")
            plt.plot(x_data, k * x_data + b)
            plt.show()
    return b, k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值