'''這是個(gè)2—>1加一偏置為-1的或(or) perception 網(wǎng)絡(luò),每次樣本輸入四組數(shù)值,
然后對權(quán)值修改'''
''' 這是個(gè)異或(XOR)問題,
0 0 : 1 0 1 : 0 1 0 : 0 1 1 : 1 把這個(gè)問題轉(zhuǎn)換成: 0 0 1 : 1 0 1 0 : 0 1 0 0 : 0 1 1 0 : 1 這是個(gè)三維的立體,故可以畫一平面然后把0,1點(diǎn)分開 ''' from numpy import *
class pcn:
def __init__(self,inputs,targets):
#設(shè)置網(wǎng)絡(luò) 2->1 偏置為-1 的or Perception network
if ndim(inputs)>1: #返回?cái)?shù)組的維數(shù),ndim(inputs)二維
self.nIn = shape(inputs)[1] #第二維長度,輸入單元個(gè)數(shù)
else:
self.nIn = 1
if ndim(targets)>1: #返回?cái)?shù)組的維數(shù)
self.nOut = shape(targets)[1]
else:
self.nOut = 1 #輸出單元個(gè)數(shù)
self.nData = shape(inputs)[0] #第一維長度,樣本數(shù)據(jù)個(gè)數(shù):4
# 隨機(jī)化權(quán)值
self.weights = random.rand(self.nIn+1,self.nOut)*0.1-0.05
#返回一個(gè)(nIn+1)*nOut的數(shù)組(矩陣).+1 是偏置
def pcntrain(self,inputs,targets,eta,nIterations):#改變權(quán)值
# 偏置加入輸入,構(gòu)成4*3維矩陣
inputs = concatenate((inputs,-ones((self.nData,1))),axis=1)
# 訓(xùn)練
for n in range(nIterations):#迭代訓(xùn)練次數(shù)
self.outputs = self.pcnfwd(inputs); #調(diào)用前向傳播
self.weights += eta*dot(transpose(inputs),targets-self.outputs)
#修改權(quán)值
print "The training is final!\n\n"
print "Final weights:\n",self.weights
print "\nFinal outputs:\n",self.outputs
def pcnfwd(self,inputs): #前向傳播,推出輸出
outputs = dot(inputs,self.weights)#輸入*權(quán)值得輸出
# 對輸出閥值
return where(outputs>0,1,0)
inputs=array([[0,0,1],[0,1,0],[1,0,0],[1,1,0]])
targets=array([[1],[0],[0],[1]]) p=pcn(inputs,targets)
p.pcntrain(inputs,targets,0.25,15) |
|