TensorFlow 教程:4. 单层感知器 处理异或问题

上一篇 我们讲了如何用单层感知器进行分类。实现了对可线性解决问题的处理。 但是当遇到线性不可分问题时(异或问题) ,上一篇的方式则失效了。

例如下图:

《TensorFlow 教程:4. 单层感知器 处理异或问题》
《TensorFlow 教程:4. 单层感知器 处理异或问题》

四个点交错时 上一篇的 线性解决就失效了。

如何实现 对上图的四个点 实现区分呢? 和上篇一样, 我们将问题转化为了方程: 即求出一个二元二次方程, 使上图的正样本为正,负样本为负。

即 这个方程为 w0 + w1x+w2y +w3(xy) +w4(x*x)+w5(y*y) 当输入正样本的坐标(x,y)时 则这个方程大于0,输入负样本坐标则小于零。

二元二次方程 生成的是两个弧线 如下图,随着权重的调整,弧线会移动

我们都是随机生成一个权重。 随后对这个权重进行调整。当四个值都满足的时候,权重调整结束 :

《TensorFlow 教程:4. 单层感知器 处理异或问题》
《TensorFlow 教程:4. 单层感知器 处理异或问题》

最后, 是我们的代码 , 下载来慢慢调试下,就知道这个原理了

#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()

    原文作者:羽一
    原文地址: https://zhuanlan.zhihu.com/p/32284407
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞