机器学习之一元线性回归模型梯度下降算法的Python实现

机器学习之一元线性回归模型梯度下降算法的Python实现

前言: 关于一元线性回归梯度下降法的详细理论知识可至我机器学习类别的博文中查看,本文基于Python实现梯度下降算法。

一、算法实现代码
本数据的学习速率选择0.0001,迭代次数为50次,初始参数值为0

import numpy as np
import matplotlib.pyplot as plt

# 导入数据
data = np.genfromtxt('data.csv', delimiter=',')
x_data = data[:, 0]
y_data = data[:, 1]

# 学习率
lr = 0.0001
# 一元线性模型: y_data = theta0 + theta1 * x_data
theta0_init = 0
theta1_init = 0
# 梯度下降法最大迭代次数
ite = 50

# 代价函数
def compute_error(theta0, theta1, x_data, y_data):
    totleError = 0
    for i in range(0, len(x_data)):
        totleError += ((theta0 + theta1 * x_data[i]) - y_data[i]) **2
    return totleError / float(len(x_data)) / 2.0


# 梯度下降
def gradient_descent_runner(theta0, theta1, lr, ite, x_data, y_data):
    m = float(len(x_data))  # 计算样本数量

    functionFigure_num = 1  # 图形个数
    # 循环迭代进行梯度下降
    for i in range(ite):
        theta0_grad = 0
        theta1_grad = 0
        for j in range(0, len(x_data)):
            theta0_grad += 1 / m * ((theta0 + (theta1 * x_data[j])) - y_data[j])
            theta1_grad += 1 / m * ((theta0 + (theta1 * x_data[j])) - y_data[j]) * x_data[j]

        # 同步更新theta0 和theta1
        theta0 = theta0 - (lr * theta0_grad)
        theta1 = theta1 - (lr * theta1_grad)

        # 每迭代5次显示一次当前梯度下降的一元线性模型图像
        if i % 5 == 0:
            # 在一个窗口中每行5个显示图像
            print('iteration:', i)
            plt.subplot(2, 5, functionFigure_num)
            plt.plot(x_data, y_data, 'b.')
            line, = plt.plot(x_data, theta0 + (theta1 * x_data), 'r')
            plt.legend(handles=[line], labels=['iterations' + str(functionFigure_num * 5)], loc='best')
            functionFigure_num = functionFigure_num + 1
    plt.show()
    return theta0, theta1

if __name__ == '__main__':
    print('Starting theta0 = {0}, theta1 = {1}, error = {2}'.format(theta0_init, theta1_init, compute_error(theta0_init, theta1_init, x_data, y_data)))
    print('Gradient Descent Running...')
    theta0_end, theta1_end = gradient_descent_runner(theta0_init, theta1_init, lr, ite, x_data, y_data)
    print('After {0} iterations theta0 = {1}, theta1 = {2}, error = {3}'.format(ite, theta0_end, theta1_end, compute_error(theta0_end, theta1_end, x_data, y_data)))

    # 绘制最终梯度下降后的直线
    # plt.plot(x_data, y_data, 'b.')
    # plt.plot(x_data, theta0_end + theta1_end * x_data, 'r')
    # plt.show()

二、实现结果

机器学习之一元线性回归模型梯度下降算法的Python实现_第1张图片
由上图可知迭代到最后的线性模型较好的拟合了样本数据

三、数据下载地址
链接:https://pan.baidu.com/s/1KhPIzejxFZfbkIGZo8J8lg
提取码:slg1

你可能感兴趣的:(机器学习,Python)