我正在努力用python实现吴恩达的机器学习编程作业。由于时间关系,我大概会只实现最重要的部分,不会实现全部内容。如果有错误,希望可以及时纠正我,谢谢大家。
首先,导入要用到的库:numpy,matplotlib。
import numpy as np
import matplotlib.pyplot as plt
接下来,导入作业里的数据文件:ex1data1.txt。导入文件之后,做相应处理,分为向量x和y。
file='/Users/christine/Desktop/吴恩达作业/ex1data1.txt';
digits=np.loadtxt(file,delimiter=',')
x=digits[:,0];
y=digits[:,1];
获取x向量的行数,也就是数据的组数。
m=x.shape[0];
接下来给x向量的前面添加一列全为1的列,这是因为我们最终求出来的用于拟合的直线有两个参数,类似y=k*x+b的形式,所以可以看作y=k*x1+b*x2,其中x2=1。
temp=np.ones((m),dtype='float');
x=np.vstack((temp,x));
x=x.T;
定义以下参数:
theta:二维向量,其中的两个分量表示直线的两个参数(即k和b),不过在吴恩达的教程里,是用theta表示的,那我也定义成theta好了。
alpha:学习率,在作业本中吴恩达已经给我们选好了,是0.01。
iterations:迭代次数,这个也给我们设定好了。
h:和x维度相同的向量,表示用当前参数求出的y的估计值。
注意一点的是,theta不要初始化为int类型数组,否则将无法得到正确答案。
theta=np.array([0.0,0.0]);
alpha=0.01;
iterations=1500;
h=np.zeros(m);
接下来是迭代的过程。在我这里出现了一个问题,就是我每次输出损失函数的值的时候,都大约是在4.8左右,但是吴恩达的作业里写,最终会得到一个32.07的值,我目前还不太清楚我的错误的地方。但是我的程序也可以拟合出看起来正确的图像,我也暂时不追究了,希望看到这里的读者能帮帮我TAT
for i in range(1,iterations):
h=x.dot(theta);
for k in range(0,2):
sum=0;
for j in range(0,m):
sum+=(h[j]-y[j])*x[j,k];
theta[k]=theta[k]-alpha*sum/m;
J=0;
for j in range(0,m):
J=J+(h[j]-y[j])*(h[j]-y[j]);
J=J/(2*m);
print(J);
然后寻找两个点,求出这两个点在拟合出的直线上的函数值。
x0=5;y0=theta[0]+x0*theta[1];
x1=24;y1=theta[0]+x1*theta[1];
最后画出函数图像,大功告成。由于时间原因,关于J的函数图像我就先不画了。
plt.xlabel('Population of City in 10000s');
plt.ylabel('Profit in $10000s');
plt.plot((x0,x1),(y0,y1));
plt.plot(digits[:,0],y,"ob");