这篇主要是用神经网络来预测手写数据集,用的数据还是多分类逻辑回归的数据,这次多填了一个ex3weight.mat文件,有5000个样本,400列特征值
这里的包和多分类逻辑回归中所用到的相同
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
这里需要取俩个文件,ex3data1中存放的是X,y为键的数据集,ex3weights中存放的是俩个theta矩阵,分别是用来在第一层和第二层进化数据,这里同样需要在X的第一列插入1
data = loadmat('ex3data1.mat')
# print(data) # 查看数据
# print(data.keys()) # 关键字(['__header__', '__version__', '__globals__', 'X', 'y'])
data_theta = loadmat('ex3weights.mat') # 存放theta矩阵
# print(data_theta) # 查看一下数据
# print(data.keys()) # 查看关键字(['__header__', '__version__', '__globals__', 'Theta1', 'Theta2'])
X = data['X']
y = data['y']
X_add1 = np.matrix(np.insert(X, 0, values=np.ones(5000), axis=1)) # 插入1
y = np.matrix(y)
# print(X_add1.shape,y.shape) # 查看X_add1,y维度---(5000, 401) (5000, 1)
theta1 = np.matrix(data_theta['Theta1'])
theta2 = np.matrix(data_theta['Theta2'])
# print(theta1.shape,theta2.shape) # 查看theta1,theta2维度()---(25, 401) (10, 26)
ex3weights数据展示
第一行分别是x_add1和y的维度,第二行是theta1和theta2的维度
这里不在解释了,几乎每一次都要用到
def sigmoid(z):
return 1/(1+np.exp(-z))
这里我把传递的过程简单画了一下,如果看不懂可以结合着老师的视频看,下面也写出了在传递过程中每一次矩阵维度的变化,分成了三层,每一层都有自己的进化方向,最后一层获得10个概率值,分别是1-10的预测率hx(图中忘画了一个a0,第二层也需要加入一列1)
a1 = X_add1 # 第一层(5000*400)
z2 = a1 @ theta1.T
a2 = sigmoid(z2) # 得到第二层矩阵(5000*25)
a2 = np.insert(a2, 0, values=1, axis=1) # 在第二层插入一列1(5000*26)
# print(a2.shape) # (5000, 26)
z3 = a2 @ theta2.T
a3 = sigmoid(z3) # 得到第三层矩阵(5000*10)
预测函数和多元逻辑回归里的大致相同,这次我们直接获得了结果矩阵,只需要从5000*10的矩阵中找出每一行最大的hx,并与y进行比较即可,变得更为方便了
# 预测函数
def predict_fuc(a3,y):
p_max = np.argmax(a3,axis=1) # 从a3矩阵中找到每一行中最大值的坐标
p_max_last = np.matrix(p_max.reshape(5000,1) + 1) # 因为返回的下标是0-9所以这里加一才能与y做对比
count = 0
for i in range(0,5000):
if p_max_last[i] == y[i]:
count += 1
return count/len(y)
pass
可以看到成功率与多分类逻辑回归相比,提高了很多,运行速度也是快了很多倍,所以神经网络方法还是很实用的
print(f'预测的成功率为{predict_fuc(a3,y) * 100}%')
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
data = loadmat('ex3data1.mat')
# print(data) # 查看数据
# print(data.keys()) # 关键字(['__header__', '__version__', '__globals__', 'X', 'y'])
data_theta = loadmat('ex3weights.mat') # 存放theta矩阵
# print(data_theta) # 查看一下数据
# print(data.keys()) # 查看关键字(['__header__', '__version__', '__globals__', 'Theta1', 'Theta2'])
X = data['X']
y = data['y']
X_add1 = np.matrix(np.insert(X, 0, values=np.ones(5000), axis=1)) # 插入1
y = np.matrix(y)
# print(X_add1.shape,y.shape) # 查看X_add1,y维度---(5000, 401) (5000, 1)
theta1 = np.matrix(data_theta['Theta1'])
theta2 = np.matrix(data_theta['Theta2'])
# print(theta1.shape,theta2.shape) # 查看theta1,theta2维度()---(25, 401) (10, 26)
def sigmoid(z):
return 1/(1+np.exp(-z))
# 预测函数
def predict_fuc(a3,y):
p_max = np.argmax(a3,axis=1) # 从a3矩阵中找到每一行中最大值的坐标
p_max_last = np.matrix(p_max.reshape(5000,1) + 1) # 因为返回的下标是0-9所以这里加一才能与y做对比
count = 0
for i in range(0,5000):
if p_max_last[i] == y[i]:
count += 1
return count/len(y)
pass
a1 = X_add1 # 第一层(5000*400)
z2 = a1 @ theta1.T
a2 = sigmoid(z2) # 得到第二层矩阵(5000*25)
a2 = np.insert(a2, 0, values=1, axis=1) # 在第二层插入一列1(5000*26)
# print(a2.shape) # (5000, 26)
z3 = a2 @ theta2.T
a3 = sigmoid(z3) # 得到第三层矩阵(5000*10)
print(f'预测的成功率为{predict_fuc(a3,y) * 100}%')