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()#展示
#三步:导入数据,改变数据形状,创建模型并拟合