线性回归手动实现(代码+结果)

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

结果:散点+预测曲线
在这里插入图片描述

如果需要从外部导入数据,可以以下数据形式可供参考

在这里插入图片描述

梯度更新部分相关计算可以参考西瓜书或者邱锡鹏老师的《神经网络与深度学习》线性回归部分,由于线性回归比较简单,原理和计算过程就不再赘述。
参考资料:线性回归梯度下降计算
参考资料:线性回归代码实现

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值