吴恩达机器学习 逻辑回归 作业3(手写数字分类) Python实现 代码详细解释

本文介绍了使用Python实现吴恩达机器学习课程中的逻辑回归作业,针对手写数字识别问题,包括数据集介绍、代码详细解释以及实验结果展示。通过一对所有逻辑回归和神经网络,识别0-9的手写数字,涉及多分类任务,代码可在提供的GitHub仓库中获取。
摘要由CSDN通过智能技术生成

整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python

里面可以下载进行代码实现的数据集

 

题目介绍:

In this exercise, you will implement one-vs-all logistic regression and neural networks to recognize hand-written digits.

 

翻译:

在本练习中,您将实现一对所有逻辑回归和神经网络来识别手写数字。

 

题目解析:

就是有5000个手写数字的图片。从0-9,每个数字有500个数据,存放在matlab文件里。我们要用这个数据去进行逻辑回归。当然,这里是多分类,所以跟之前的逻辑回归作业有点区别。

同时还要注意的是,matlab文件中存放的是5000x400的数据。这个400需要理解为一张20x20的图片。

 

代码详细解释:

先看看主函数中logisticRegression_oneVsAll的构成:

def logisticRegression_oneVsAll():
    data=loadMatFile('data_digits.mat')    #1.导入文件。在.mat文件中存放的是两个矩阵,X是图片矩阵(5000x400),每一行都是一个数字图片的矩阵
    X=data['X']
    y=data['y']
    m=len(X)

    #我们先选100个数字看看。
    rand_indices=[np.random.randint(0,m) for x in range(100)]   #2.显示100个数字:这一步是利用列表表达式选取100个随机的数字。
    show_data(X[rand_indices, :])  # 显示100个数字

    Lambda=0.1 #选定一个合适的正则化系数。

    num_labels=10   #这里对0-9数字做个标记,用于后面对数字的遍历。


    X=np.hstack((np.ones((len(y),1)),X))     #先将X中补上一列1。

    all_theta=oneVsAll(X,y,num_labels,Lambda)    #3.调用oneVsAll()函数。

    predict(all_theta,X,y)     #4.调用predict函数。

 

 

1.导入文件loadMatFile(),注意,跟之前不同,这次导入的文件是.mat文件

#导入mat文件
def loadMatFile(path):
    return spio.loadmat(path)       #这里我们需要借助scipy.io的loadmat方法来导入.mat文件

 

 

2.利用show_data()函数,我们先显示100个数字看看。

# 显示随机的100个数字
'''
显示100个数(若是一个一个绘制将会非常慢,可以将要画的数字整理好,放到一个矩阵中,显示这个矩阵即可)
    - 初始化一个二维数组
    - 将每行的数据调整成图像的矩阵,放进二维数组
    - 显示即可
'''
def show_data(imgs):
    pad=1      #因为我们显示的是100张图片矩阵的集合,所以每张图片我们可以设置一个分割线,对图片进行划分。pad指的是分割线宽度。
    show_imgs=-np.ones((pad+10*(20+pad),pad+10*(20+pad)))    #初始化一个211x211的矩阵,因为100张图片都是20x20,加上分割线,总共的大小就是211x211。
                                                            #这里需要了解下,如果初始化的矩阵值为-1,则分割线的颜色会是黑色。

    row=0    #因为我们要显示100个数字,所以我们需要从图片数组的第0行遍历到第99行,这个row是用来控制遍历的行数

    for i in range(10):     #双层循环,100张图片放进去。
        for j in range(10):
            show_imgs[pad+i*(20+pad):pad+i*(20+pad)+20,pad+j*(20+pad):pad+j*(20+pad)+20]=(     #这段代码比较复杂。等号左边是从show_imgs这个大矩阵中给图片挑选位置。需要注意图片与图片之间都需要留位置给分割线
                imgs[row,:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值