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()