数据如下:
代码如下:
import copy
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 读取excel 并将其向量化为训练数据集x y
data = pd.read_excel("D:\python\python_for_beginner\成本产量数据表.xlsx", head=None, index_col=None, usecols='B' )
x_train = np.asarray(data.stack())
print(x_train)
data = pd.read_excel("D:\python\python_for_beginner\成本产量数据表.xlsx", head=None, index_col=None, usecols='C' )
y_train = np.asarray(data.stack())
print(y_train)
# 开始实现线性回归
# 函数准备
# 线性拟合函数 返回函数值列表
def computer_model_output(x, w, b):
m = x.shape[0]
f_wb = np.zeros(m)
for i in range(m):
f_wb[i] = w * x[i] + b
return f_wb
# 成本函数 返回总偏差
def compute_cost(x, y, w, b):
m = x.shape[0]
total_cost =0
for i in range(m):
total_cost = total_cost + ((w * x[i] + b )-y[i]) ** 2
total_cost = (1/(2*m)) * total_cost
return total_cost
# 梯度计算函数 返回成本函数分别对w,b的偏导
def compute_gradient(x, y, w, b):
m = x.shape[0]
dj_dw = 0
dj_db = 0
for i in range(m):
f_wb = w * x[i] +b
dj_dw_i = (f_wb - y[i]) * x[i]
dj_db_i = f_wb - y[i]
dj_dw += dj_dw_i
dj_db += dj_db_i
dj_dw = (1/m) * dj_dw
dj_db = (1/m) * dj_db
return dj_dw, dj_db
# 梯度下降函数 返回__次回归后w,b的值和此处梯度
def gradient_descent(x, y, w, b, alpha1, alpha2, iter_num, compute_gradient):
w = copy.deepcopy(w)
while iter_num:
dj_dw, dj_db = compute_gradient(x, y, w, b)
w = w - dj_dw * alpha1
b = b - dj_db * alpha2
iter_num -= 1
return w, b, compute_gradient(x, y, w, b)
# 学习率设置
tmp_alpha1 = 0.00000005
tmp_alpha2 = 0.00009
# 迭代次数
iter_num = 500000
w_final, b_final, dj_dw = gradient_descent(x_train, y_train, 0, 0, tmp_alpha1, tmp_alpha2, iter_num, compute_gradient)
print(dj_dw)
# 拟合出的线性函数y值
tmp_f_wb = computer_model_output(x_train, w_final, b_final)
print(w_final)
# 使中文正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘制出拟合曲线 和 训练集数据点
plt.plot(x_train, tmp_f_wb, c='b', label='Our Prediction')
plt.scatter(x_train, y_train, c='r', marker='x', s=50, label='Actual Value')
plt.title("成本产量关系预测图")
plt.xlabel("人工成本费(元)")
plt.ylabel("产量(公斤)")
# 显示
plt.legend()
plt.show()
运行结果如下:
为检测是否正常导入数据,梯度下降最终效果,下列输出分别为训练集数据x、训练集数据y、最终梯度(dj_dw, dj_db)、最终w。
拟合曲线如下(采用不同的学习率和迭代次数最终曲线会有不同,此代码为更好地拟合曲线采用了alpha1、alpha2两个学习率):
希望内容对你有所帮助!也期待大佬们的纠正!