欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 08:52:11
...

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