一、神经网络
使用神经网络算法识别数据集中的手写数字,数据集有数字集与初始theta值。步骤:构建神经网络模型——初始化向量——向前传播算法——计算代价函数——反向传播,计算偏导数项——(梯度检验)——高级优化算法下降梯度得到预测值theta——对比预测数据得出准确率。
二、实现神经网络
导入数据包。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from scipy.io import loadmat
from sklearn.preprocessing import OneHotEncoder #用于初始化y为有K个单元的向量
导入文件中数据,分别是数据集和向量集。
使用encoder转结果集y的结构,将其变更成K个单位的一维向量(1,10)。
data = loadmat("E:\\Pycharm\\workspace\\ex4_Andrew\\ex4data1.mat")
X = data['X'] #输入集X的shape为(5000,400)
y = data['y'] #输出集y的shape为(5000,1)
weight = loadmat("E:\\Pycharm\\workspace\\ex4_Andrew\\ex4weights.mat")
theta1 = weight['Theta1'] #theta1矩阵的shape为(25,401)
theta2 = weight['Theta2'] #theta2矩阵的shape为(10,26)
encoder = OneHotEncoder(sparse=False) #sparese表示编码格式,为False时显示为10个元素的向量
y_onehot = encoder.fit_transform(y) #转换为向量形式
初始化数据集X,为.mat类型。X中每个数据为(1,400),共5000个数据。
随机抽取其中的100个数据,并将每个数据重构为(20,20)的矩阵再显示。
sample_idx = np.random.choice(np.arange(X.shape[0]),100) #随机抽取100个0-4999的数
sample_images = X[sample_idx,:] #sample_images记录随机100个X的行数据
fig,ax_array = plt.subplots(nrows=10,ncols=10,sharex=True,sharey=True,figsize=(8,8))
for i in range(10):
for j in range(10):
ax_array[i,j].matshow(np.array(sample_images[10*i+j].reshape((20,20))).T,cmap=matplotlib.cm.binary)
plt.xticks(np.array([]))
plt.yticks(np.array([]))
定义sigmoid函数和前馈神经网络函数,返回各层激活值与最后的h(x)。
def sigmoid(z):
return 1/(1+np.exp(-z))
def forward_propagate(X,theta1,theta2): #前馈神经网络函数
m = X.shape[0]
a1 = np.insert(X, 0, values