练习三:多分类和神经网络
目录
1.包含的文件
2.多分类问题
3.神经网络
1.包含的文件
文件名 | 含义 |
ex3.py | 逻辑回归多分类 |
ex3_nn.py | 神经网络分类 |
ex3data1.mat | 手写数字集 |
ex3weights.mat | 神经网络初始权重 |
displayData.py | 可视化数据 |
sigmoid.py | Sigmoid函数 |
lrCostFunction.py | 多分类逻辑回归代价函数 |
oneVsAll.py | 训练多分类器 |
predictOneVsAll.py | 使用多分类器进行预测 |
predict.py | 使用神经网络预测 |
红色部分需要自己填写。
2.多分类问题
- 需要的包以及初始化:
import matplotlib.pyplot as plt
import numpy as np
import scipy.io as scio
import displayData as dd
import lrCostFunction as lCF
import oneVsAll as ova
import predictOneVsAll as pova
plt.ion()
# Setup the parameters you will use for this part of the exercise
input_layer_size = 400 # 20x20 input images of Digits
num_labels = 10 # 10 labels, from 0 to 9
# Note that we have mapped "0" to label 10
2.1加载数据并可视化
- 可视化程序displayData.py:
import matplotlib.pyplot as plt
import numpy as np
def display_data(x):
(m, n) = x.shape
# Set example_width automatically if not passed in
example_width = np.round(np.sqrt(n)).astype(int)
example_height = (n / example_width).astype(int)
# Compute the number of items to display
display_rows = np.floor(np.sqrt(m)).astype(int)
display_cols = np.ceil(m / display_rows).astype(int)
# Between images padding
pad = 1
# Setup blank display
display_array = - np.ones((pad + display_rows * (example_height + pad),
pad + display_rows * (example_height + pad)))
# Copy each example into a patch on the display array
curr_ex = 0
for j in range(display_rows):
for i in range(display_cols):
if curr_ex > m:
break
# Copy the patch
# Get the max value of the patch
max_val = np.max(np.abs(x[curr_ex]))
display_array[pad + j * (example_height + pad) + np.arange(example_height),
pad + i * (example_width + pad) + np.arange(example_width)[:, np.newaxis]] = \
x[curr_ex].reshape((example_height, example_width)) / max_val
curr_ex += 1
if curr_ex > m:
break
# Display image
plt.figure()
plt.imshow(display_array, cmap='gray', extent=[-1, 1, -1, 1])
plt.axis('off')
- 测试代码:
# ===================== Part 1: Loading and Visualizing Data =====================
# We start the exercise by first loading and visualizing the dataset.
# You will be working with a dataset that contains handwritten digits.
#
# Load Training Data
print('Loading and Visualizing Data ...')
data = scio.loadmat('ex3data1.mat') #读取训练集 包括两部分 输入特征和标签
X = data['X'] #提取输入特征 5000*400的矩阵 5000个训练样本 每个样本特征维度为400 一行代表一个训练样本
y = data['y'].flatten() #提取标签 data['y']是一个5000*1的2维数组 利用flatten()将