神经网络
单层感知器
单层感知器代码
import numpy as np
import matplotlib.pyplot as plt
#输入数据
X = np.array([[1,3,3],
[1,4,3],
[1,1,1],
[1,0,2]])
#标签
Y = np.array([[1],
[1],
[-1],
[-1]])
#权值初始化,3行1列,取值范围-1到1
W = (np.random.random([3,1])-0.5)*2
print(W)
#学习率设置
lr = 0.11
#神经网络输出
O = 0
def update():
global X,Y,W,lr
O = np.sign(np.dot(X,W)) # shape:(3,1)
W_C = lr*(X.T.dot(Y-O))/int(X.shape[0])
W = W + W_C
for i in range(100):
update()#更新权值
print(W)#打印当前权值
print(i)#打印迭代次数
O = np.sign(np.dot(X,W))#计算当前输出
if(O == Y).all(): #如果实际输出等于期望输出,模型收敛,循环结束
print('Finished')
print('epoch:',i)
break
#正样本
x1 = [3,4]
y1 = [3,3]
#负样本
x2 = [1,0]
y2 = [1,2]
#计算分界线的斜率以及截距
k = -W[1]/W[2]
d = -W[0]/W[2]
print('k=',k)
print('d=',d)
xdata = (0,5)
plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
单层感知器异或问题代码
'''
异或
0^0 = 0
0^1 = 1
1^0 = 1
1^1 = 0
'''
import numpy as np
import matplotlib.pyplot as plt
#输入数据
X = np.array([[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]])
#标签
Y = np.array([[-1],
[1],
[1],
[-1]])
#权值初始化,3行1列,取值范围-1到1
W = (np.random.random([3,1])-0.5)*2
print(W)
#学习率设置
lr = 0.11
#神经网络输出
O = 0
def update():
global X,Y,W,lr
O = np.sign(np.dot(X,W)) # shape:(3,1)
W_C = lr*(X.T.dot(Y-O))/int(X.shape[0])
W = W + W_C
for i in range(100):
update()#更新权值
print(W)#打印当前权值
print(i)#打印迭代次数
O = np.sign(np.dot(X,W))#计算当前输出
if(O == Y).all(): #如果实际输出等于期望输出,模型收敛,循环结束
print('Finished')
print('epoch:',i)
break
#正样本
x1 = [0,1]
y1 = [1,0]
#负样本
x2 = [0,1]
y2 = [0,1]
#计算分界线的斜率以及截距
k = -W[1]/W[2]
d = -W[0]/W[2]
print('k=',k)
print('d=',d)
xdata = (-2,3)
plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
线性神经网络
import numpy as np
import matplotlib.pyplot as plt
#输入数据
X = np.array([[1,3,3],
[1,4,3],
[1,1,1],
[1,0,2]])
#标签
Y = np.array([[1],
[1],
[-1],
[-1]])
#权值初始化,3行1列,取值范围-1到1
W = (np.random.random([3,1])-0.5)*2
print(W)
#学习率设置
lr = 0.11
#神经网络输出
O = 0
def update():
global X,Y,W,lr
O = np.dot(X,W)
W_C = lr*(X.T.dot(Y-O))/int(X.shape[0])
W = W + W_C
for _ in range(100):
update()#更新权值
#正样本
x1 = [3,4]
y1 = [3,3]
#负样本
x2 = [1,0]
y2 = [1,2]
#计算分界线的斜率以及截距
k = -W[1]/W[2]
d = -W[0]/W[2]
print('k=',k)
print('d=',d)
xdata = (0,5)
plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
激活函数
BP神经网络Back Propagation Neural Network
扫描二维码关注公众号,回复:
12588469 查看本文章
BP神经网络-异或问题
import numpy as np
#输入数据
X = np.array([[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]])
#标签
Y = np.array([[0,1,1,0]])
#权值初始化,取值范围-1到1
V = np.random.random((3,4))*2-1
W = np.random.random((4,1))*2-1
print(V)
print(W)
#学习率设置
lr = 0.11
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
def update():
global X,Y,W,V,lr
L1 = sigmoid(np.dot(X,V))#隐藏层输出(4,4)
L2 = sigmoid(np.dot(L1,W))#输出层输出(4,1)
L2_delta = (Y.T - L2)*dsigmoid(L2)
L1_delta = L2_delta.dot(W.T)*dsigmoid(L1)
W_C = lr*L1.T.dot(L2_delta)
V_C = lr*X.T.dot(L1_delta)
W = W + W_C
V = V + V_C
for i in range(20000):
update()#更新权值
if i%500==0:
L1 = sigmoid(np.dot(X,V))#隐藏层输出(4,4)
L2 = sigmoid(np.dot(L1,W))#输出层输出(4,1)
print('Error:',np.mean(np.abs(Y.T-L2)))
L1 = sigmoid(np.dot(X,V))#隐藏层输出(4,4)
L2 = sigmoid(np.dot(L1,W))#输出层输出(4,1)
print(L2)
def judge(x):
if x>=0.5:
return 1
else:
return 0
for i in map(judge,L2):
print(i)
BP网络-数字识别
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer
from sklearn.cross_validation import train_test_split
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
class NeuralNetwork:
def __init__(self,layers):#(64,100,10)
#权值的初始化,范围-1到1
self.V = np.random.random((layers[0]+1,layers[1]+1))*2-1
self.W = np.random.random((layers[1]+1,layers[2]))*2-1
def train(self,X,y,lr=0.11,epochs=10000):
#添加偏置
temp = np.ones([X.shape[0],X.shape[1]+1])
temp[:,0:-1] = X
X = temp
for n in range(epochs+1):
i = np.random.randint(X.shape[0]) #随机选取一个数据
x = [X[i]]
x = np.atleast_2d(x)#转为2维数据
L1 = sigmoid(np.dot(x,self.V))#隐层输出
L2 = sigmoid(np.dot(L1,self.W))#输出层输出
L2_delta = (y[i]-L2)*dsigmoid(L2)
L1_delta= L2_delta.dot(self.W.T)*dsigmoid(L1)
self.W += lr*L1.T.dot(L2_delta)
self.V += lr*x.T.dot(L1_delta)
#每训练1000次预测一次准确率
if n%1000==0:
predictions = []
for j in range(X_test.shape[0]):
o = self.predict(X_test[j])
predictions.append(np.argmax(o))#获取预测结果
accuracy = np.mean(np.equal(predictions,y_test))
print('epoch:',n,'accuracy:',accuracy)
def predict(self,x):
#添加偏置
temp = np.ones(x.shape[0]+1)
temp[0:-1] = x
x = temp
x = np.atleast_2d(x)#转为2维数据
L1 = sigmoid(np.dot(x,self.V))#隐层输出
L2 = sigmoid(np.dot(L1,self.W))#输出层输出
return L2
digits = load_digits()#载入数据
X = digits.data#数据
y = digits.target#标签
#输入数据归一化
X -= X.min()
X /= X.max()
nm = NeuralNetwork([64,100,10])#创建网络
X_train,X_test,y_train,y_test = train_test_split(X,y) #分割数据1/4为测试数据,3/4为训练数据
labels_train = LabelBinarizer().fit_transform(y_train)#标签二值化 0,8,6 0->1000000000 3->0001000000
labels_test = LabelBinarizer().fit_transform(y_test)#标签二值化
print('start')
nm.train(X_train,labels_train,epochs=20000)
print('end')
sklearn-神经网络-手写数字识别
# pip install scikit-learn --upgrade
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report,confusion_matrix
digits = load_digits()#载入数据
x_data = digits.data #数据
y_data = digits.target #标签
# 标准化
scaler = StandardScaler()
x_data = scaler.fit_transform(x_data)
x_train,x_test,y_train,y_test = train_test_split(x_data,y_data) #分割数据1/4为测试数据,3/4为训练数据
mlp = MLPClassifier(hidden_layer_sizes=(100,50) ,max_iter=500)
mlp.fit(x_train,y_train )
predictions = mlp.predict(x_test)
print(classification_report(y_test, predictions))
print(confusion_matrix(y_test,predictions))
神经网络-葡萄酒分类
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report,confusion_matrix
# 载入数据
data = np.genfromtxt("wine_data.csv", delimiter=",")
x_data = data[:,1:]
y_data = data[:,0]
print(x_data.shape)
print(y_data.shape)
# 数据切分
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data)
# 数据标准化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
# 建模
mlp = MLPClassifier(hidden_layer_sizes=(100,50),max_iter=500)
# 训练
mlp.fit(x_train,y_train)
# 评估
predictions = mlp.predict(x_test)
print(classification_report(y_test,predictions))
print(confusion_matrix(y_test,predictions))