回归之一元线性回归代码部分

1,119 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、梯度下降法-一元线性回归

有关梯度下降算法的分析,可以参考之前发的文章全连接神经网络

1、导入相关模块

numpy:处理数据 pyplot :可视化相关结果

import numpy as np
import matplotlib.pyplot as plt

2、最小二乘法求Loss值

def compute_loss(b,k,x_data,y_data):
    totalLoss = 0
    for i in range(0,len(x_data)):
        totalLoss += (y_data[i] - (k*x_data[i] + b))**2
    return  totalLoss/float(len(x_data))/2.0

3、梯度下降法求解系数

def gradient_descent(x_data,y_data,b,k,lr,epchos):
    #计算数据量长度
    m = float(len(x_data))
    # 循环批次:epochs次
    for i in range(epochs):
        b_grad = 0
        k_grad = 0
        # 计算梯度
        for j in range(len(x_data)):
            b_grad += (1/m)*(((k*x_data[j])+b)-y_data[j])
            k_grad += (1/m)*x_data[j]*(((k*x_data[j])+b)-y_data[j])
        # 更新k和b
        b = b - (lr*b_grad)
        k = k - (lr*k_grad)
    return b,k

4、载入数据

从csv文件中导入数据

data = np.genfromtxt("data.csv",delimiter=',')
x_data = data[:,0]
y_data = data[:,1]

csv数据如下图:

image.png

5、设置训练参数

要设置的参数有: 学习率、最大迭代次数以及初始化的截距和斜率

# 学习率learning rate
lr = 0.0001
# 截距
b = 0
# 斜率
k = 0
# 最大迭代次数
epochs = 50

6、初始化参数

print("Initialization Parameter b = {}, k = {}, Loss = {}".format(epochs,b,k,compute_loss(b,k,x_data,y_data)))

7、使用梯度下降算法训练

b, k = gradient_descent(x_data, y_data, b, k, lr, epochs)

8、打印训练后参数

print("After {} interations b = {}, k = {}, Loss = {}".format(epochs,b,k,compute_loss(b,k,x_data,y_data)))

9、结果

训练后得到的k和b:

image.png

训练结果可视化:

image.png

二、sklearn-一元线性回归

sklearn是一个Python第三方提供的非常强力的机器学习库,它包含了从数据预处理到训练模型的各个方面。在实战使用scikit-learn中可以极大的节省我们编写代码的时间以及减少我们的代码量。

1、导入相关模块

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

2、载入数据

data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]

3、变换数据结构

x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]

4、创建并拟合模型

model = LinearRegression()
model.fit(x_data, y_data)

5、可视化训练结果

plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()

image.png