import matplotlib.pyplot as plt
import numpy as np
class process():#数据预处理
def __init__(self,file_path):
self.file_path=file_path
self.info=[]
#pass
def read_file(self):
self.info=np.loadtxt(self.file_path)#以浮点矩阵返回结果
return self.info
# pass
class linear_regression():
def __init__(self,iter_time,Raw_data,alpha):
#初始化参数:迭代次数,坐标数据(x,y),学习率α
#定义各项参数
self.Raw_data=Raw_data
self.m, self.n = np.shape(Raw_data)
self.iter_time=iter_time
self.x_data=np.ones((self.m,self.n))
self.x_data[:,:-1]=self.Raw_data[:,:-1]
self.y_data=Raw_data[:,-1]
self.w_=np.array([0,0])#初始化w
self.alpha=alpha
#pass
def gradient_Descent(self):#梯度下降计算w
x_train=self.x_data.transpose()#矩阵行列转置
for i in range(0,self.iter_time):
predict=np.dot(self.x_data,self.w_)#w和x轴数据计算预测的predict结果
loss=predict-self.y_data#预测数据与真实数据计算损失
gradient=np.dot(x_train,loss)/self.m#计算梯度
self.w_=self.w_-self.alpha*gradient#通过梯度更新w
des_cost=1.0/(2*self.m)*np.sum(np.square(np.dot(self.x_data,np.transpose(self.w_))-self.y_data))#计算梯度下降损失
print("{}th gradient result:{},loss:{}".format(i,round(des_cost,4),loss))
return self.w_
if __name__=="__main__":
#plot the scatter
#data_info=process("data.txt").read_file()
#如果需要从外部导入数据可以加载process类并调用read_file方法
data_info=np.array([[1, 2], [1.4, 3], [2.5,4], [3.7, 5],[4,6],
[4.5,3], [3.8, 5], [6, 7],[8, 9]])
plt.scatter(data_info[:, 0], data_info[:, 1], color='b', label='training data')
linear=linear_regression(1000,data_info,0.01)
#linear model的三个基本参数,建议对learning rate和iteration time可以多调几组结果,这样对实验会有更深刻的认识
linear_result=linear.gradient_Descent()
predict_result=np.dot(linear.x_data,linear_result)
#最终的预测结果
plt.plot(data_info[:, 0], predict_result, color='r', label='prediction result')
plt.xlabel('x')
plt.ylabel('y')
plt.ylim(0,12)
plt.xlim(0,10)
plt.show()
结果:散点+预测曲线
如果需要从外部导入数据,可以以下数据形式可供参考
梯度更新部分相关计算可以参考西瓜书或者邱锡鹏老师的《神经网络与深度学习》线性回归部分,由于线性回归比较简单,原理和计算过程就不再赘述。
参考资料:线性回归梯度下降计算
参考资料:线性回归代码实现