编写感知器算法程序,求下列模式分类的解向量。编程实现,编程语言不限。
ω1: {(0 0 0) t,(1 0 0) t,(1 0 1 ) t,(1 1 0) t}
ω2: {(0 0 1) t, (0 1 1) t,(0 1 0) t, (1 1 1) t}
设w(1)=(-1 -2 -2 0) t.
感知器是一种神经网络模型,是20世纪50年代中期到60年代初人们对模拟人脑学习能力的一种分类学习机模型的称呼。当时有些研究者认为它是一种学习机的强有力模型,后来发现估计过高,由于无法实现非线性分类,到60年代中期,从事感知器研究的实验室纷纷下马,但在发展感知器时所获得的一些数学概念,如“赏罚分明”今天仍在模式识别中起着很大的作用。
import numpy as np
vector = np.array(
[
[0, 1, 1, 1, 0, 0, 0, -1],
[0, 0, 0, 1, 0, -1, -1, -1],
[0, 0, 1, 0, -1, -1, 0, -1],
[1, 1, 1, 1, -1, -1, -1, -1]
]
)
w = np.array([[-1, -2, -2, 0]])
c = 1 #矫正增量系数
top = 0 #迭代次数
num = 0 #判断循环结束标记
ans = 0 #当前增广向量的下标
while True:
temp = vector[:,ans].reshape(4,1)
res = np.matmul(w, temp)[0][0]
if res <= 0:
temp = temp.reshape(1,4)
w = w + c * temp
num += 1
ans += 1
if num == 0 and ans >= 8:
top += 1
break
if ans >= 8:
ans = 0
num = 0
top += 1
print("it has %d loop" % top)
print("the w vector is " + str(w[0]))
it has 4 loop
the w vector is [ 3 -2 -3 1]
经过四次循环迭代,最终w的向量值为[3,-2,-3,1]
import numpy as np
vector = np.array(
[
[0, 1, 1, 1, 0, 0, 0, -1],
[0, 0, 0, 1, 0, -1, -1, -1],
[0, 0, 1, 0, -1, -1, 0, -1],
[1, 1, 1, 1, -1, -1, -1, -1]
]
)
for c in range(2,6):
w = np.array([[-1, -2, -2, 0]])
# c = 1 #矫正增量系数
top = 0 #迭代次数
num = 0 #判断循环结束标记
ans = 0 #当前增广向量的下标
while True:
temp = vector[:,ans].reshape(4,1)
res = np.matmul(w, temp)[0][0]
if res <= 0:
temp = temp.reshape(1,4)
w = w + c * temp
num += 1
ans += 1
if num == 0 and ans >= 8:
top += 1
break
if ans >= 8:
ans = 0
num = 0
top += 1
print("it has %d loop" % top)
print("the w vector is " + str(w[0]))
it has 4 loop
the w vector is [ 3 -4 -4 2]
it has 4 loop
the w vector is [ 5 -5 -5 3]
it has 4 loop
the w vector is [ 3 -6 -6 4]
it has 4 loop
the w vector is [ 4 -7 -7 5]
进程已结束,退出代码 0
可见当校正增量系数c取值不同时,结果可能不一样,所以感知器算法的解并不是单值的。