8、神经网络

'''
预测手写数字
使用多类logistic回归不能形成更复杂的假设,因为它只是一个线性分类器。
神经网络可以实现非常复杂的非线性的模型。
利用已经训练好了的权重进行预测。
'''
import numpy as np
from scipy.io import loadmat


# 加载权重数据
def load_weight(path):
    data = loadmat(path)
    return data['Theta1'], data['Theta2']


# 加载权重数据
theta1, theta2 = load_weight('data/ex3weights.mat')


# print(theta1.shape, theta2.shape)  # (25, 401) (10, 26)


# 加载数据集
def load_data(path):
    data = loadmat(path)  # loadmat读取mat文件
    # 这里的数据为MATLAB的格式,所以要使用SciPy.io的loadmat函数
    X = data['X']
    y = data['y']
    return X, y


# 加载数据集
X, y = load_data('data/ex3data1.mat')
y = y.flatten()  # 转为一维向量
X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # np.ones(n) 返回一个元素值全为1的n维向量


# print(X.shape, y.shape)  # (5000, 401) (5000,)

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


# 神经网络计算
a1 = X  # 第一层神经元
z2 = a1 @ theta1.T
z2 = np.insert(z2, 0, 1, axis=1)
a2 = sigmoid(z2)  # 第二层神经元
# print(a2.shape)  # (5000, 26)
z3 = a2 @ theta2.T
a3 = sigmoid(z3)  # 第三层神经元
# print(a3.shape)  # (5000, 10)

# 计算准确率
y_pred = np.argmax(a3, axis=1) + 1  # 按行取最大值的索引值,加一是因为索引从0开始
# print(y_pred.shape)  # (5000,)
accuracy = np.mean(y_pred == y)
print('accuracy={}%'.format(accuracy * 100)) # accuracy=97.52%

运行结果:

accuracy=97.52%

你可能感兴趣的:(吴恩达-机器学习,神经网络,python,机器学习)