线性回归,python语法实现

找了很多资料发现好像大家的线性回归都是用sklearn来实现的,作为一个不会用sklearn的小白,寻找了多篇无果后 决定自己用一些比较基础的模块来实现线性回归的梯度下降算法。

import matplotlib.pyplot as plt
import numpy as np

x_data = np.array([1,2,3,4,5])
y_data = np.array([1,2,3,4,5])

a = 0.163
b = np.random.random()
k = np.random.random()
epochs = 1000

设置最简单的y=x函数来进行拟合,设置学习率为0.163,训练次数1000次。

# 计算代价函数
def compute_error(b, k, x_data, y_data):
    total_error = 0
    for i in range(0, len(x_data)):
        total_error += (y_data[i] - (k * x_data[i] + b)) ** 2
    return total_error / len(x_data) / 2.0


def gradient_descent_runner(x_data, y_data, k, b, a, epochs):
    m = len(x_data)
    for i in range(epochs):  # 循环epochs次
        new_b = 0  # 初始化截距
        new_k = 0  # 初始化斜率
        # 计算梯度的总和再求平均
        for j in range(0, len(x_data)):
            new_b += (1 / m) * (((k * x_data[j]) + b) - y_data[j])
            new_k += (1 / m) * x_data[j] * (((k * x_data[j]) + b) - y_data[j])
        # 更新b和k
        b = b - (a * new_b)
        k = k - (a * new_k)

    else:
            plt.plot(x_data, y_data, 'b.')
            plt.plot(x_data, k * x_data + b, 'r')
            plt.show()
    return b, k


print("Starting b = {0}, k = {1}, error = {2}".format(b, k, compute_error(b, k, x_data, y_data)))
print("Running...")
b, k = gradient_descent_runner(x_data, y_data, b, k, a, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))

第十次训练:
在这里插入图片描述
二十次
在这里插入图片描述
三十次
在这里插入图片描述

最终运行结果:在这里插入图片描述
在这里插入图片描述

接近100%拟合,错误率小于10^-26,基本上可以满足需求了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值