机器学习多分类神经网络实践
·
2-19实现多分类神经网络
代码
# 2-19实现多分类神经网络
import pandas
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
iterations = 1000 # 迭代次数
learning_rate = 0.1 # 学习率
m_train = 200 # 训练样本数量
n = 3 # 隐含层节点数量
# 整数索引值转one-hot向量
def index2onehot(index, classes):
onehot = np.zeros((classes, index.size))
onehot[index.astype(int), np.arange(index.size)] = 1
return onehot
# 读入轮椅数据集
df = pandas.read_csv('wheelchair_dataset.csv')
data = np.array(df)
m_all = np.shape(data)[0]
d = np.shape(data)[1] - 1
classes = np.amax(data[:, d])
m_test = m_all - m_train
# 构造随机种子为指定值的随机数生成器,并对数据集中的样本随机排序
rng = np.random.default_rng(1)
rng.shuffle(data)
# 特征缩放(标准化)
data = data.astype(float)
mean = np.mean(data[0:m_train, 0:d], axis=0)
std = np.std(data[0:m_train, 0:d], axis=0, ddof=1)
data[:, 0:d] = (data[:, 0:d] - mean) / std
# 划分数据集
X_train = data[0:m_train, 0:d].T
y_train = data[0:m_train, d].reshape((1, -1))
Y_train_onehot = index2onehot(y_train.astype(int) - 1, classes)
X_test = data[m_train:, 0:d].T
y_test = data[m_train:, d].reshape((1, -1))
# 初始化
W_1 = rng.random((d, n)) # W[1], d b*n
b_1 = rng.random((n, 1)) # b[1], n b*1
W_2 = rng.random((n, classes)) # w[2], n*c
b_2 = rng.random((classes, 1)) # b[2], c*1
v = np.ones((1, m_train)).reshape((1, -1)) # 1 向量
U = np.ones((classes, classes)) # 1矩阵
costs_saved = []
# 迭代循环
for i in range(iterations):
# 正向传播
Z_1 = np.dot(W_1.T, X_train) + np.dot(b_1, v)
A_1 = Z_1 * (Z_1 > 0)
Z_2 = np.dot(W_2.T, A_1) + np.dot(b_2, v)
exp_Z_2 = np.exp(Z_2)
Y_hat = exp_Z_2 / np.dot(U, exp_Z_2)
# 反向传播
E = Y_hat - Y_train_onehot
db_2 = np.dot(E, v.T) / m_train
dW_2 = np.dot(A_1, E.T) / m_train
d_1_dot = np.dot(W_2, E) * (Z_1 > 0)
db_1 = np.dot(d_1_dot, v.T) / m_train
dW_1 = np.dot(X_train, d_1_dot.T) / m_train
# 更新权重与偏差
b_1 = b_1 - learning_rate * db_1
W_1 = W_1 - learning_rate * dW_1
b_2 = b_2 - learning_rate * db_2
W_2 = W_2 - learning_rate * dW_2
# 保存代价函数的值
costs = - np.trace(np.dot(Y_train_onehot.T, np.log(Y_hat))) / m_train
costs_saved.append(costs.item(0))
# 打印最新权重与偏差
print('W_[1] =\n', np.array2string(W_1, precision=3))
print('b_[1] =', np.array2string(np.squeeze(b_1, axis=1), precision=3))
print('W_[2] =\n', np.array2string(W_2, precision=3))
print('b_[2] =', np.array2string(np.squeeze(b_2, axis=1), precision=3))
# 画代价函数的值
plt.plot(range(1, np.size(costs_saved) + 1), costs_saved, 'r-o', linewidth=2, markersize=5)
plt.ylabel('Costs')
plt.xlabel('Iterations')
plt.title('Learning rate = ' + str(learning_rate))
plt.show()
# 训练数据集上的预测
Z_1 = np.dot(W_1.T, X_train) + np.dot(b_1, v)
A_1 = Z_1 * (Z_1 > 0)
Z_2 = np.dot(W_2.T, A_1) + np.dot(b_2, v)
y_train_hat = np.argmax(Z_2, axis=0) + 1
# 测试数据集上的预测
Z_1_test = np.dot(W_1.T, X_test) + b_1 # 广播操作
A_1_test = Z_1_test * (Z_1_test > 0)
Z_2_test = np.dot(W_2.T, A_1_test) + b_2 # 广播操作
y_test_hat = np.argmax(Z_2_test, axis=0) + 1
# 打印预测错误数量
print('Trainset prediction errors =', np.sum(y_train != y_train_hat))
print('Testset prediction errors =', np.sum(y_test != y_test_hat))
结果图

更多推荐

所有评论(0)