第01周 吴恩达机器学习课后作业ex1整理-python

1.Simple function

     返回一个5x5的单位矩阵

import numpy as np//用到了numpy.eye(),所以先导包

A = np.eye(5) //创建矩阵
print(A)   //输出
  •   输出:

 2.Linear regression with one variable

通过城市人口,预测小吃车的利润

  • 先导入数据(人口、利润),数据读取方法用到read_csv,所以需要导pandas包
import pandas as pd //导包

data = pd.read_csv("D:\Pycharm\Machine-Learning\ex1\ex1data1.txt",names=["population","profit"])) //读取数据,并将第一列数据命名为population,第二列profit

print(data)//打印
  •  打印,结果如下,说明数据导入成功

 2.1 Plotting the Data(绘制数据)

用点状图画出上面导入的数据

  • 绘图需要Pyplot,它是常用的绘图模块,能很方便绘制 2D 图表,并且它是Matplotlib的一个子库,所以需要先导入。然后用到scatter(x,y)这个函数绘制点状图,并将x,y设置好,x为人口,y为利润。
import matplotlib.pyplot as plt//导包
X = data.population//设置x、y变量
Y = data.profit
plt.scatter(X,Y) //绘制点状图
plt.xlabel("Polpulation of City") //设置x、y轴含义
plt.ylabel("Profit ")
plt.show()//输出图像
  • 图像如图所示:

2.2 Gradient Descent(梯度下降)

 使用梯度下降将线性回归参数 θ 拟合到数据集。

2.2.1 Update Equations(更新方程)

2.2.2 Implementation  

  •  将上面的公式向量化后,用代码进行定义
def J(X,Y,theta):
    cost = np.sum((X.dot(theta)-y)**2)/(2*len(X))
    return cost

2.2.3 Computing the cost J(θ 

  • 将数据带入公式
data = np.array(data) //将数据转换为数组形式,方便计算代价函数

X = data[:,0].reshape(-1,1) //将X也就是人口,从数据中的第一列数值取出,并在数组中转换成一列的形式
X = np.hstack([np.ones((len(X),1)),X])//给X添加一列全为1的元素,使用np.hstack,水平方向堆叠,np.ones可以生成一列元素

Y = data[:,1].reshape(-1,1)//将Y也就是利润,从数据中的第二列数值取出,并在数组中转换成一列的形式

theta = np.zeros(X.shape[1]).reshape(-1,1)//将theta初始化为0

result = round(J(X,Y,theta),2) //运行定义的方法(函数公式)并保留2位小数
print(result) //输出代价函数值
  • 输出结果为32.07,值较高,因此需要进行梯度下降

2.2.4 Gradient descent(开始梯度下降)

 不断更新θ,使J(\theta)最小化

  •  先求代价函数的导数为\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^i)-y^i)x_j^i
  • 代码定义代价函数的导数dJ(\theta)
def dJ(theta,X,Y) //定义导数
    res = X.T.dot(X.dot(theta)-Y)/len(X) //导数等于
    return res //返回导数值
  • 更新θ,定义求参数θ的公式(梯度下降)
def gradient_descent(dJ,X,Y,initial_theta,alpha,iters=1500,epsilon=1e-8)//定义,输入数据的参数,除了利润、人口,还有学习率,迭代次数,以及一个非常小的差值,当代价函数插值非常小,基本上趋于稳定,此时最小化代价函数值
    theta = initial_theta //使θ等于最初值
    now_iters = 0 //此时迭代次数为0
    while now_iters<iters: //只要迭代次数没到1500就循环
        gradient = dJ(theta,X,Y) 
        last_theta = theta //保留上一个θ值
        theta = theta - alpha*gradient //更新
        if(abs(J(X,Y,theta)-J(X,Y,last_theta))<epsilon): //代价函数趋于不变跳出循环
            break
        now_iters += 1 //否则,迭代次数加一,继续更新
        return theta//最后返回最佳θ值
  • 调用梯度下降的方法
theta = [0,0] //初始化θ
theta = gradient_descent(dJ,X,Y,theta,alpha=0.01,all_iters=1500)//调用梯度下降算法
print(theta)//打印结果为最优θ值
  • 结果为如图,因为假设函数为h_{\theta}(x)=\theta_0+\theta_1x,故结果为最优截距和斜率

  •  对 θ 的最终值也将用于预测35,000 和 70,000 人的地区的利润是多少,利用参数进行数据拟合并可视化。预测函数为y = \theta_0+\theta_1x
    predict1 = np.array([1,3.5]).dot(theta)
    predict2 = np.array([1,7]).dot(theta)
    print("3w5人口的城市小吃车利润是:",predict1)
    print("7w人口的城市小吃车利润是:",predict2)

    结果为:

       

  •  绘制最终的预测函数图像   
plt.scatter(data[:,0],data[:,1])//绘制点状图
plt.plot(X[:,1],X.dot(theta),color='r')//绘制预测函数的线型图
plt.xlabel("population of city")//设置坐标含义
plt.ylabel("profit")
plt.show()//输出图像
  • 最终的利润预测图像为

  • 绘制代价函数的图像
    iters=1500
    
    print(np.shape(cost))
    
    plt.plot(np.arange(iters),cost,color='r')
    plt.xlabel("Iterations")
    plt.ylabel("Cost")
    plt.show()
    

     

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值