吴恩达机器学习 线性回归 作业(房价预测) Python实现 代码详细解释

 

整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python

里面可以下载进行代码实现的数据集data.txt或data.csv

 

介绍:

最近在看吴恩达机器学习视频的时候,为了巩固自己的基础,想亲自实现一下课程里面的每个算法。在实现之前,我先看了一下别人实现的相关代码,看完就特别沮丧,很多人的代码,要么就是完全没注释,要么就是注释了关键点,有些细节甚至技巧简直深藏不露,对我这样的渣渣实在是不太友好。

俗话说万事开头难,实现线性回归确实花了我很多时间,不过实现完了就贼开心了,不仅熟悉了python,numpy,pandas等各种操作,还让自己对枯燥的数学公式有了质的理解。好在我这次实现的过程中,对很多细节都留了注释,虽然冗长,但是很适合新手去慢慢推敲。

当然,代码中也有很多问题,或者说不够优化的地方,希望能在讨论中不断改进。当然,改进算法不是最重要的,这些机器学习算法早被封装好了,其实讨论学习才是我的目的所在。

 

题目:

In this part, you will implement linear regression with multiple variables to predict the prices of houses. Suppose you are selling your house and you want to know what a good market price would be. One way to do this is to first collect information on recent houses sold and make a model of housing prices.

 

翻译:

在这里,您将使用多个变量用来实现线性回归来预测房屋的价格。假设你在卖房子,你想知道一个好的市场价格是多少。这样做的一个方法是首先收集最近售出的房屋的信息,并制作一个房价模型。

 

 

 

代码结构图:

 

思考步骤:

首先设置一个线性回归函数:linearRegression(),我们在后来将在这个函数里调用很多其他函数。下面的linearRegression函数一定会让初学者看着就崩溃。稍安勿躁,一步一步分解,就能理解很多只看书学不到的细节。

def linearRegression(alpha=0.01, num_iters=400):    #学习速率为0.01,迭代次数为400
    data=loadFile('data.csv')   #步骤1 先载入文件

    X=np.array(data[:,0:-1])   #步骤2 对载入的数据进行提取。具体看思考
    y=np.array(data[:,-1]).reshape(-1,1) #这里一定要将y数组转换为47行1列的二维数组,不然后面计算肯定全部报错

    X=meanNormalization(X)     #步骤3 进行均值归一化操作 。这里需不需要对y进行均值归一化???其实我也很疑问,因为我尝试过归一化,发现结果与没归一化一样。算是给我留个问题,等我后来解决

                               #步骤3更新解答。经过一年的AI学习,回过头来看这个问题。要不要对y进行标准化?实际上是不需要的。因为梯度下降的时候,我们只是对X进行计算,y值只是一个target,而且这个target是在同一个metric,也就是尺度下的。那么什么时候需要将数据标准化?只要计算涉及梯度下降的算法,都要标准化,这点在深度学习尤为明显,标准化和不标准化,速度差距真的很大。那么什么算法不需要标准化?不依赖于值的大小的算法都不标准化,比如树算法,已经其衍生,随机森林,gradient boost machine等等。

    plotMeanNormalization(X)   #步骤4 画图
    X=np.hstack((np.ones((len(y),1)),X))   #步骤5 插入一列全为1的数组。   这里利用np.hstack()函数进行插入,前一个参数是插入的矩阵的形状,后一个参数是插入到哪个矩阵中

    num_theta=X.shape[1]
    theta=np.zeros((num_theta,1))    #步骤6 theta是我们想要求出的参数,我们构建一个3行1列的零矩阵用来存放theta。
    y=y.reshape(-1,1)      #将y转置,变为一个向量。超级注意!这里不能用y.T。因为y原来是个一维数组,写y.T依旧是个一维数组,不是向量

    thetaValue,J_all=gradientDescent(X,y,theta,alpha,num_iters)   #步骤7 调用梯度下降算法  返回的thetaValue,就是让函数收敛的theta值

    plotJ(J_all,num_iters)  #步骤9 画J曲线
    plotLinearRegression(X, thetaValue,y)
    return thetaValue
  1. 创建一个loadFile()函数负责导入文件,并且返回一个np数组。
    #载入文件函数
    def loadFile(path):
        return np.loadtxt(path,delimiter=',',dtype=np.float64)    #此处调用的是np.loadtxt()方法加载csv文件,分隔符采用',',数据类型为np.float64
  2. 这个时候,因为我们已经获得了导入文件的数据,需要对导入文件数据进行处理:X作为一个两列的矩阵,存放第一列(square)和第二列(room),y作为一个向量,存放的是最后一列,房价的实际价格(price)。
    data=loadFile('data.csv')   #步骤1 先载入文件
    
    X=np.array(data[:,0:-1])   #步骤2 对载入的数据进行提取。具体看思考
    y=np.array(data[:,-1]).
  • 18
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值