上一篇 我们讲了如何用单层感知器进行分类。实现了对可线性解决问题的处理。 但是当遇到线性不可分问题时(异或问题) ,上一篇的方式则失效了。
例如下图:
四个点交错时 上一篇的 线性解决就失效了。
如何实现 对上图的四个点 实现区分呢? 和上篇一样, 我们将问题转化为了方程: 即求出一个二元二次方程, 使上图的正样本为正,负样本为负。
即 这个方程为 w0 + w1x+w2y +w3(xy) +w4(x*x)+w5(y*y) 当输入正样本的坐标(x,y)时 则这个方程大于0,输入负样本坐标则小于零。
二元二次方程 生成的是两个弧线 如下图,随着权重的调整,弧线会移动
我们都是随机生成一个权重。 随后对这个权重进行调整。当四个值都满足的时候,权重调整结束 :
最后, 是我们的代码 , 下载来慢慢调试下,就知道这个原理了
#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#输入值
X = np.array([
[1,0,0,0,0,0],
[1,0,1,0,0,1],
[1,1,0,1,0,0],
[1,1,1,1,1,1]
])
#值的 标签值 也即是期望输出值
Y = np.array([-1,1,1,-1])
#权值初始化 np.random.random(3) 生成一行三列的大于0小于1 的 矩阵
W = (np.random.random(6)-0.5)*2
#学习率设置
lr = 0.11
#迭代次数
n=0
# 神经网络输出
O=0
def update():
global X,Y,W,lr,n
n+=1#计算执行次数
#激活函数改变了
# O = np.sign(np.dot(X, W.T))
O=np.dot(X,W.T)
#学习率 * (期望输出矩阵 - 实际输出矩阵)* 输入矩阵
W_C = lr*((Y-O.T).dot(X))/int(X.shape[0])
W=W+W_C
for i in range(10000):
update()
x1=[0,1]
y1=[1,0]
x2=[0,1]
y2=[0,1]
def calculate(x,root):#其中的root是指传入x获取二元二次方程的yce
a = W[5]
b = W[2] + x * W[4]
c = W[0] + x * W[1] + x * x * W[3]
if root == 1:
return (-b + np.sqrt(b*b-4*a*c))/(2*a)
if root == 2:
return (-b-np.sqrt(b*b-4*a*c))/(2*a)
print (W)
print(W[0])
xdata = np.linspace(-1,2)#生成一个-1到2 的等差数列
plt.figure()
plt.plot(xdata,calculate(xdata,1),'r')
plt.plot(xdata,calculate(xdata,2),'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()