【吴恩达】机器学习作业-ex3data1/weights-神经网络正向(Python)

一.前言

       这篇主要是用神经网络来预测手写数据集,用的数据还是多分类逻辑回归的数据,这次多填了一个ex3weight.mat文件,有5000个样本,400列特征值

二.代码解析

1.导入包

        这里的包和多分类逻辑回归中所用到的相同

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat

2.数据导入与数据初始化

        这里需要取俩个文件,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的维度

 3.sigmoid函数

        这里不在解释了,几乎每一次都要用到

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

4.进行传递

        这里我把传递的过程简单画了一下,如果看不懂可以结合着老师的视频看,下面也写出了在传递过程中每一次矩阵维度的变化,分成了三层,每一层都有自己的进化方向,最后一层获得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)

5.预测函数

        预测函数和多元逻辑回归里的大致相同,这次我们直接获得了结果矩阵,只需要从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

6.结果展示 

        可以看到成功率与多分类逻辑回归相比,提高了很多,运行速度也是快了很多倍,所以神经网络方法还是很实用的

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}%')






猜你喜欢

转载自blog.csdn.net/calmdownn/article/details/126040786
今日推荐