整个项目的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,: