下面所讲的问题,是第一节ml课老师布置的一个编程题,题目的要求如下:
下面我使用的语言是python,主要提供两种方法:
第一种是基于tensorflow的方法,第二种是自己进行损失的计算和梯度下降算法的书写。本人代码水平有限,欢迎大佬们指错!
一、自己编写最基础的代码,为了让结构更清晰,我多建了几个py文件,这样可以很清楚的看到每一个py文件做了什么。
文件目录如下:当然你可以不跟我一样,随便自己啦
建立一个名字为houseprice的文件夹,下面存在以下的文件,我现在列出他们的名字,根据名字你可以大致猜出每一个文件的作用,有house.txt存储的是房子的数据,第一列是房子的年份,第二列是房子的价格,中间以空格隔开;
file2_matrix.py将txt文件里面的数据变成一个矩阵的形式,这个文件返回的是一个矩阵,这个矩阵的第一列是房子的年份,第二列是房子的价格;
plot_data.py用来绘制我的数据的,x轴为年份,y轴为房价;不仅这个函数会绘制出我们的数据点的散点图,还绘制出我们的拟合直线;
normalization.py进行数据的归一化操作(我之前认为只有一个特征的问题是无需进行归一化操作的,所以我直接将数据进行线性回归,但是发现最后出现的结果为nan,出来的拟合结果是一条接近水平的直线,很显然我们的数据是递增的!我在octave上跑了一遍,发现提示我可以scale data,我就试了一下,还真行了);
compute_cost.py很显然是来计算代价的,根据公式,注意这里的上标i表示的是对第几个样本来讨论;
gradient_descent.py是进行梯度下降来最优化参数theta的函数;
total.py将以上得代码汇总之后,运行得到我们想要的结果;
chooce_lr.py我想看看有没有最佳的学习率,又写了一个根据不同的学习率来比较谁能够让问题更快的收敛。
数据和代码详见:
house.txt:
2000 2.000
2001 2.500
2002 2.900
2003 3.147
2004 4.515
2005 4.903
2006 5.365
2007 5.704
2008 6.853
2009 7.971
2010 8.561
2011 10.000
2012 11.280
2013 12.900
file2matrix.py:
import numpy as np
def file2matrix(filename):
fr=open(filename)
arrayolines=fr.readlines()
numberoflines=len(arrayolines)
returnmat=np.zeros((numberoflines,2))
index=0
for line in arrayolines:
line=line.strip()
listfromline=line.split(' ')
returnmat[index,:]=listfromline[0:2]
index=index+1
return returnmat,numberoflines
if __name__=='__main__':
print(file2matrix("./house.txt"))
plot_data.py:这里绘制数据,我的参数写的*args,这是为了有时候对绘图的要求不一样,传入的参数也不一样,*args可以传递任意数量个参数,比如说当我想要仅仅绘制我的原始数据的图像的时候,那么我直接传入的参数为file2matrix.py的第一个返回值returnmat,但是如果我想既绘制原始的图像也要绘制拟合的直线,我需要传入的参数还有。(这里的字体设置你可以全部丢掉