sklearn速度复习-梯度下降

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.1#学习率learning rate
b=0#截距
k=0#斜率
epochs=1000#最大迭代次数(周期)
def compute_error(b,k,x_data,y_data):#最小二乘法估计误差
    totalError=0#开始时误差为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#返回总误差除了X的个数
#梯度下降法降低误差
def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
    m=float(len(x_data))#计算总数据量
    for i in range(epochs):#循环eposhs次
        b_grad=0#梯度初始为0
        k_grad=0#梯度初始为0
        for j in range(0,len(x_data)):#计算梯度的总和再求平均(每次乘1/m就是取平均)
            b_grad+=-(1/m)*(y_data[j]-((k*x_data[j])+b))#求导得梯度
            k_grad+=-(1/m)*x_data[j]*(y_data[j]-((k*x_data[j])+b))#求导得梯度
        b=b-(lr*b_grad) #更新b
        k=k-(lr*k_grad) #更新k
    return b,k
b,k=gradient_descent_runner(x_data,y_data,b,k,lr,epochs)#正式进行训练
plt.plot(x_data,y_data,'b.')#画散点(b后面要有一点,否则会随机连线)
plt.plot(x_data,k*x_data+b,'r')#画拟合线
plt.show()#展示

上面是纯手工算法,下面是sklearn库调用

from sklearn.linear_model import LinearRegression#导入线性回归
import numpy as np
import matplotlib.pyplot as plt

data=np.genfromtxt("data.csv",delimiter=',')#导入数据
'''
x_data=data[:,0]#读出第一列
y_data=data[:,1]#读出第二列
print(x_data.shape)#输出数据形状(100,)
'''
x_data=data[:,0,np.newaxis]#升维
y_data=data[:,1,np.newaxis]#升维
print(x_data.shape)#(100,1)处理成这样是因为下面fit接口要求
model=LinearRegression()#创建线性回归模型
model.fit(x_data,y_data)#拟合直线(实即就是得到斜率与截距)

plt.plot(x_data,y_data,'b.')#画蓝点
plt.plot(x_data,model.predict(x_data),'r')#画红线
plt.show()#展示

#三步:导入数据,改变数据形状,创建模型并拟合

猜你喜欢

转载自blog.csdn.net/cj1064789374/article/details/88226780