一元线性回归示例(原生实现、sklearn实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/alionsss/article/details/86809687

0. 原始数据准备

0.1 数据

# x轴数据
x_data = np.arange(20)
# y轴数据
y_data = np.array([0.4, 0.8, 1.1, 2.1, 2.8, 2.7, 3.5, 4.6, 5.1, 4.5, 6.0, 5.5, 6.9, 6.8, 7.6, 8.0, 8.8, 8.5, 9.5, 9.3])
print(x_data)
print(y_data)

0.2 作图展示

plt.scatter(x_data, y_data)
plt.show()

原始数据

1. Python原生实现

1.1 导包

import numpy as np
import matplotlib.pyplot as plt

1.2 计算均方差

def compute_mse(b, w, x_data, y_data):
    """
    求均方差
    :param b: 截距
    :param w: 斜率
    :param x_data: 特征数据
    :param y_data: 标签数据
    """
    
    total_error = 0.0
    for i in range(0, len(x_data)):
        total_error += (y_data[i] - (b + w * x_data[i])) ** 2
    return total_error / len(x_data)

1.3 梯度下降

def run_gradient_descent(x_data, y_data, b, w, learn_rate, epochs):
    """
    运行梯度下降
    :param x_data: 待训练的特征数据
    :param y_data: 标签数据
    :param b: 截距
    :param w: 斜率
    :param learn_rate: 学习曲率
    :param epochs: 训练次数
    """
    
    m = float(len(x_data))
    for i in range(epochs):
        b_grad = 0 # 损失(代价)函数对b的梯度
        w_grad = 0 # 损失(代价)函数对w的梯度
        for j in range(0, len(x_data)):
            b_grad += (1/m) * ((b + w * x_data[j]) - y_data[j])
            w_grad += (1/m) * ((b + w * x_data[j]) - y_data[j]) * x_data[j]
        # 根据梯度和学习曲率修正截距b和斜率w
        b -= learn_rate * b_grad
        w -= learn_rate * w_grad
        if i % 50 == 0:
        	# 每50次作图一次
            print("epochs:", i)
            plt.plot(x_data, y_data, "b.")
            plt.plot(x_data, b + w * x_data, "r")
            plt.show()
            print("mse:", compute_mse(b, w, x_data, y_data))
            print("------------------------------------------------------------------------------------------------------------")
    return b, w

1.4 开始运行

learn_rate = 0.0001 # 学习曲率
b = 0 # 截距
w = 0 # 斜率
epochs = 500 # 批次数

print("Start args: b = {0}, w = {1}, mse= {2}".format(b, w, compute_mse(b, w, x_data, y_data)))
print("Running...")
b, w = run_gradient_descent(x_data, y_data, b, w, learn_rate, epochs)
print("Finish args: iterations = {0}  b = {1}, w = {2}, mse= {3}".format(epochs, b, w, compute_mse(b, w, x_data, y_data)))

1.5 回归最终结果作图

plt.plot(x_data, y_data, "b.")
plt.plot(x_data, b + w * x_data, "r")
plt.show()

回归结果

2. sklearn实现

2.1 导包

from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt

2.2 建模与训练

# 转一下维度,sklearn框架才能识别
x_data = x_data[:, np.newaxis]
y_data = y_data[:, np.newaxis]

# 建立模型
model = LinearRegression()
# 开始训练
model.fit(x_data, y_data)

2.3 结果展示

# 斜率
print("coefficients: ", model.coef_)
w = model.coef_[0]

# 截距
print("intercept: ", model.intercept_)
b = model.intercept_

# 测试
x_test = np.array([[7]])
predict = model.predict(x_test)
print("predict: ", predict)

2.4 回归最终结果作图

plt.plot(x_data, y_data, "b.")
# plt.plot(x_data, model.predict(x_data), "r")
plt.plot(x_data, b + w * x_data, "r")
plt.show()

sklearn回归结果

猜你喜欢

转载自blog.csdn.net/alionsss/article/details/86809687