吴恩达机器学习编程作业python版:第一次作业

我正在努力用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");

你可能感兴趣的:(学习笔记,python,机器学习,人工智能)