线性回归算法及回归实践(梯度下降法)

1、梯度下降算法
1.1、理想中的回归函数
在这里插入图片描述
1.2、根据算法推导出来的损失函数
在这里插入图片描述
1.3、对1.2的损失函数求偏导得出
在这里插入图片描述

2、相关代码
2.2、梯度下降的代码

import numpy as np
import matplotlib.pyplot as plt
 
#载入数据
data = np.genfromtxt("data.csv",delimiter=",")#加载文件,分隔符为逗号
x_data = data[:,0]#存储第0列的所有数据
y_data = data[:,1]#存储第1列的所有数据
 
#学习率
lr = 0.005
#截距
b = 0.0
#斜率
k = 0.0
#最大迭代次数
epochs = 50
 
#最小二乘法
def compute_error(b, k, x_data, y_data):
    totalError = 0
    for i in range(0,len(x_data)):
        totalError += (y_data[i] - (k * x_data[i] + b)) ** 2
    return totalError / float(len(x_data)) / 2.0
 
 
#梯度下降法求最小值
def gradient_descent_runner(x_data, y_data, b, k, lr, epochs):
    #计算总数据量
    m = len(x_data)
    #循环epochs次
    for i in range(epochs):
        b_grade = 0
        k_grade = 0
        #计算梯度总和在求平均(结合上图中的算法接口)
        for j in range(0, len(x_data)):
            b_grade += -(1/m) * (y_data[j] - (k * x_data[j] + b))
            k_grade += -(1/m) * (y_data[j] - (k * x_data[j] + b)) * x_data[j]
        #更新学习率
        b = b - (lr * b_grade)
        k = k - (lr * k_grade)
 
    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, lr, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))
 
#画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k*x_data+b, 'r')
plt.show()

3.3.、调用Scikit-learn的代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import linear_model #导入机器学习库中的线性回归方法
from sklearn.linear_model import LinearRegression #导入机器学习库中的线性回归方法

import pandas as ps
df = ps.read_csv('data.csv',encoding='gb2312')
df = df.sort_values('1')
#对数据进行排序,取到有规律的数据表
df.to_csv('output.csv',encoding='gb2312')

#读取拿到的数据
dataset = pd.read_csv('output.csv')
dataset.describe()
#type(dataset)
#x=dataset['1']
#y=dataset['3']

x = []
y = []
for x_data, y_data in zip(dataset['1'],dataset['3']):
    x.append([float(x_data)])
    y.append([float(y_data)])

#直降将数据放入scikit-learn 接口中
model= LinearRegression()
model.fit(x,y)

predict = {}
predict['a'] = model.intercept_
predict['b'] = model.coef_

plt.scatter(x,y, color='blue')
plt.plot(x,model.predict(x),color='red',linewidth=4)
plt.xticks(())
plt.yticks(())
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值