吴恩达机器学习课后习题(前馈神经网络)

一、神经网络

多分类问题时,若特征变量的次数过高,项数过多,用逻辑回归会很慢,此时需要用到神经网络。还是区分0-9的十个数字的问题,若已给定神经网络中的theta矩阵(需要用反向传播算法得出),实现前馈神经网络,理解神经网络的作用。
题目已给出a(1)为第一层输入层数据,有400个神经元代表每个数字的图像(不加偏置值);
a(2)为隐藏层,有25个神经元(不加偏置值);
a(3)为输出层‘,又10个神经元,以10个(0/1)值的向量表示;
theta1为第一层到第二层的参数矩阵(25,401);
theta2为第二层到第三层的参数矩阵(10,26)。
吴恩达机器学习课后习题(前馈神经网络)_第1张图片

二、实现前馈神经网络

导入数据包。

import numpy as np
from scipy.io import loadmat
from sklearn.metrics import classification_report

提取文件中的数据,查出两个向量的维度。(25,401) (10,26)

data = loadmat("E:\\Pycharm\\workspace\\ex3_Andrew\\ex3data1.mat")
weight = loadmat("E:\\Pycharm\\workspace\\ex3_Andrew\\ex3weights.mat")
theta1,theta2 = weight['Theta1'],weight['Theta2']
print("theta1,theta2的shape:",theta1.shape,theta2.shape) 
#题目中已经给出的神经网络参数矩阵theta1(25,401),theta2(10,26)
#theta矩阵的形状为(下层的神经元个数,本层的神经元个数+1),隐藏层仅一层,有25个神经元

初始化输入X与输出y,查出X与y的维度。(5000, 401) (5000, 1)

X = np.insert(data['X'],0,values=np.ones(data['X'].shape[0]),axis=1) #X增加一列变为(5000*401)
X = np.matrix(X)
y = np.matrix(data['y'])
print("X,y的shape:",X.shape,y.shape)

进行前馈神经网络的运算,设计sigmoid函数。
将输入集X赋值给a1,将z2设为a1theta1.T;
a2为隐藏层的值,是根据a1层与theta1相乘后用sigmoid函数算出;
给a2增加一列偏置值后,将z3设为a2
theta2.T;
a3为输出值,是根据a2层与theta2相乘后用sigmoid函数算出。(5000,10)
a3输出值有5000行代表5000个数字,每个数字10个值。

def sigmoid(z):
    return 1/(1+np.exp(-z))

a1 = X
z2 = a1*theta1.T #theta1为(25,401),X为(5000,401),z2为(5000,25)

a2 = sigmoid(z2) #a2为(5000,25)
a2 = np.insert(a2,0,values=np.ones(a2.shape[0]),axis=1) #a2为(5000,26)
z3 = a2*theta2.T #z3为(5000,10)
a3 = sigmoid(z3)

对结果打印预测报告。argmax函数返回每一行10个数中最大值的索引,并加1。

y_pre = np.argmax(a3,axis=1)+1
print(classification_report(y,y_pre))

三、运行结果

吴恩达机器学习课后习题(前馈神经网络)_第2张图片

你可能感兴趣的:(机器学习,神经网络,深度学习,机器学习,python,numpy)