from matplotlib import pyplot as plt
import numpy as np
from sklearn import datasets, model_selection
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容'
def sigmoid(x):
return 1 / (1 + np.exp(-x))
#对y进行二值化处理
def y_init(y):
Y = y
y_set = set(y)
y = np.array([y] * len(y_set))
j = 0
for i in y_set:
y[j][np.where(Y == i)] = 1
y[j][np.where(Y != i)] = 0
j += 1
pass
y = y.T
return y
#将最后输出变换成one_hot
def y_handle(r_y):
j = 0
for i in np.argmax(r_y, axis=1):
r_y[j, :] = 0
r_y[j, i] = 1
j += 1
return r_y
#求得最后输出层输出
def forward(x, w, v):
alpha = x.dot(v) # 隐层神经元输入
b_h = sigmoid(alpha) # 隐层神经元输出
beta = b_h.dot(w)
r_y = sigmoid(beta)
return r_y
#训练参数
def train(x, y, epcho, w, v):
k = 0
eta = 0.01
acc = []
while k < epcho:
alpha = x.dot(v).astype(np.float64) # 隐层神经元输入0
b_h = sigmoid(alpha).astype(np.float64) # 隐层神经元输出
beta = b_h.dot(w).astype(np.float64) # 输出层输入
r_y = sigmoid(beta).astype(np.float64) # 输出层输出
g = r_y * (1 - r_y) * (y - r_y) # 150*3
e = b_h * (1 - b_h) * g.dot(w.T) # 150*8
w = w + eta * b_h.T.dot(g)
v = v + eta * x.T.dot(e)
prec_y = y_handle(r_y)
acc.append(accuracy(y, prec_y))
k += 1
return w, v, acc
#求得训练参数
def net(x, y, hidden_num, epcho):
v = np.random.random((x.shape[1], hidden_num))
w = np.random.random((hidden_num, y.shape[1]))
w, v, acc = train(x, y, epcho, w, v)
prec_y = forward(x, w, v)
prec_y = y_handle(prec_y)
acc.append(accuracy(y, prec_y))
return prec_y, w, v, acc, accuracy(y, prec_y)
#求出精确度
def accuracy(acts, pres):
acc = 0
for i in range(acts.shape[0]):
for j in range(acts.shape[1]):
if acts[i, j] == pres[i, j]:
if j == (acts.shape[1] - 1):
acc += 1
else:
break
acc = acc / acts.shape[0]
return acc
iris = datasets.load_iris()
x = iris.data # 150*4
y = y_init(iris.target) # 150*1
train_data, test_data, train_label, test_label = model_selection.train_test_split(x, y, test_size=0.3, random_state=0)
epcho = 5000
train_prec_y, w, v, acc, A = net(train_data, train_label, 8, epcho)
prec_y = y_handle(forward(test_data, w, v))
accur = accuracy(test_label, prec_y)
print(accur)
plt.plot(acc)
plt.xlabel("迭代次数")
plt.ylabel("精确度")
plt.show()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)