python开机号_感知机(python实现)
感知機(jī)(perceptron)是二分類的線性分類模型,輸入為實(shí)例的特征向量,輸出為實(shí)例的類別(取+1和-1)。感知機(jī)對(duì)應(yīng)于輸入空間中將實(shí)例劃分為兩類的分離超平面。感知機(jī)旨在求出該超平面,為求得超平面導(dǎo)入了基于誤分類的損失函數(shù),利用梯度下降法 對(duì)損失函數(shù)進(jìn)行最優(yōu)化(最優(yōu)化)。感知機(jī)的學(xué)習(xí)算法具有簡(jiǎn)單而易于實(shí)現(xiàn)的優(yōu)點(diǎn),分為原始形式和對(duì)偶形式。感知機(jī)預(yù)測(cè)是用學(xué)習(xí)得到的感知機(jī)模型對(duì)新的實(shí)例進(jìn)行預(yù)測(cè)的,因此屬于判別模型。感知機(jī)由Rosenblatt于1957年提出的,是神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)的基礎(chǔ)。
行文脈絡(luò)
感知機(jī)模型
感知機(jī)學(xué)習(xí)策略
感知機(jī)學(xué)習(xí)算法
原始形式
對(duì)偶形式
4. Github地址
1. 感知機(jī)模型
定義
假設(shè)輸入空間(特征向量)為X?Rn,輸出空間為Y={-1, +1}。輸入x∈X表示實(shí)例的特征向量,對(duì)應(yīng)于輸入空間的點(diǎn);輸出y∈Y表示示例的類別。由輸入空間到輸出空間的函數(shù)為
f(x)=sign(w·x + b)(1)
稱為感知機(jī)。其中,參數(shù)w叫做權(quán)值向量,b稱為偏置。w·x表示w和x的內(nèi)積。sign為符號(hào)函數(shù),即
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)
幾何解釋
感知機(jī)模型是線性分類模型,感知機(jī)模型的假設(shè)空間是定義在特征空間中的所有線性分類模型,即函數(shù)集合{f|f(x)=w·x+b}。線性方程 w·x+b=0對(duì)應(yīng)于特征空間Rn中的一個(gè)超平面S,其中w是超平面的法向量,b是超平面的截踞。這個(gè)超平面把特征空間劃分為兩部分。位于兩側(cè)的點(diǎn)分別為正負(fù)兩類。超平面S稱為分離超平面,如下圖:
學(xué)習(xí)與預(yù)測(cè)
感知機(jī)學(xué)習(xí)即由訓(xùn)練數(shù)據(jù)集T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N)求得感知機(jī)模型(1),即求得參數(shù)w,b;感知機(jī)預(yù)測(cè)即根據(jù)得到的感知機(jī)模型(1),對(duì)新的輸入實(shí)例給出對(duì)應(yīng)的類型。
2. 感知機(jī)學(xué)習(xí)策略
假設(shè)訓(xùn)練數(shù)據(jù)集是線性可分的,感知機(jī)學(xué)習(xí)的目標(biāo)是求得一個(gè)能夠?qū)⒂?xùn)練數(shù)據(jù)的正負(fù)實(shí)例點(diǎn)完全分開的分離超平面,即最終求得參數(shù)w、b。這需要一個(gè)學(xué)習(xí)策略,即定義(經(jīng)驗(yàn))損失函數(shù)并將損失函數(shù)最小化。
損失函數(shù)的一個(gè)自然的選擇是誤分類的點(diǎn)的總數(shù)。但是這樣得到的損失函數(shù)不是參數(shù)w、b的連續(xù)可導(dǎo)函數(shù),不宜優(yōu)化。損失函數(shù)的另一個(gè)選擇是誤分類點(diǎn)到分里面的距離之和。
首先,對(duì)于任意一點(diǎn)xo到超平面的距離為
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)
其次,對(duì)于誤分類點(diǎn)(xi,yi)來說 -yi(w·xi+b)>0
這樣,假設(shè)超平面S的總的誤分類點(diǎn)集合為M,那么所有誤分類點(diǎn)到S的距離之和為
? ? ? ? ? ? ? ? ? ? ? ? ? ?(4)
不考慮1/||w||,就得到了感知機(jī)學(xué)習(xí)的損失函數(shù)。
經(jīng)驗(yàn)風(fēng)險(xiǎn)函數(shù)
給定數(shù)據(jù)集T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N),感知機(jī)sign(w·x+b)學(xué)習(xí)的損失函數(shù)定義為
? ? ? ? ? ? ? ? ? ? ?(5)
其中M為誤分類點(diǎn)的集合,這個(gè)損失函數(shù)就是感知機(jī)學(xué)習(xí)的經(jīng)驗(yàn)風(fēng)險(xiǎn)函數(shù)。
顯然,損失函數(shù)L(w,b)是非負(fù)的。如果沒有誤分類點(diǎn),那么L(w,b)為0,誤分類點(diǎn)數(shù)越少,L(w,b)值越小。一個(gè)特定的損失函數(shù):在誤分類時(shí)是參數(shù)w,b的線性函數(shù),在正確分類時(shí),是0.因此,給定訓(xùn)練數(shù)據(jù)集T,損失函數(shù)L(w,b)是w,b的連續(xù)可導(dǎo)函數(shù)。
3. 感知機(jī)學(xué)習(xí)算法
最優(yōu)化問題:給定數(shù)據(jù)集T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N),求參數(shù)w,b,使其成為損失函數(shù)的解(M為誤分類的集合):
? ? ? ? ? ? ? ? ?(6)
3.1 感知機(jī)學(xué)習(xí)的原始形式
感知機(jī)學(xué)習(xí)是誤分類驅(qū)動(dòng)的,具體采用隨機(jī)梯度下降法。首先,任意選定w0、b0,然后用梯度下降法不斷極小化目標(biāo)函數(shù)(6),極小化的過程不知一次性的把M中的所有誤分類點(diǎn)梯度下降,而是一次隨機(jī)選取一個(gè)誤分類點(diǎn)使其梯度下降。
假設(shè)誤分類集合M是固定的,那么損失函數(shù)L(w,b)的梯度由(7)(8)給出
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (7)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (8)
隨機(jī)選取一個(gè)誤分類點(diǎn)(xi,yi),對(duì)w,b進(jìn)行更新:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (10)
式中η(0≤η≤1)是步長(zhǎng),在統(tǒng)計(jì)學(xué)是中成為學(xué)習(xí)速率。步長(zhǎng)越大,梯度下降的速度越快,更能接近極小點(diǎn)。如果步長(zhǎng)過大,有可能導(dǎo)致跨過極小點(diǎn),導(dǎo)致函數(shù)發(fā)散;如果步長(zhǎng)過小,有可能會(huì)耗很長(zhǎng)時(shí)間才能達(dá)到極小點(diǎn)。
算法(感知機(jī)學(xué)習(xí)算法的原始形式)
輸入:T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N,學(xué)習(xí)速率為η)
輸出:w, b;感知機(jī)模型f(x)=sign(w·x+b)
(1) 初始化w0,b0
(2) 在訓(xùn)練數(shù)據(jù)集中選取(xi, yi)
(3) 如果yi(w xi+b)≤0w= w +ηyixi
b= b +ηyi
(4) 轉(zhuǎn)至(2)
直觀解釋:當(dāng)一個(gè)實(shí)例點(diǎn)被誤分類時(shí),調(diào)整w,b,使分離超平面向該誤分類點(diǎn)的一側(cè)移動(dòng),以減少該誤分類點(diǎn)與超平面的距離,直至超越該點(diǎn)被正確分類。
例1
對(duì)于訓(xùn)練數(shù)據(jù)集,其中正例點(diǎn)是x1=(3,3)T,x2=(4,3)T,負(fù)例點(diǎn)為x3=(1,1)T,用感知機(jī)學(xué)習(xí)算法的原始形式求感知機(jī)模型f(x)=w·x+b。這里w=(w(1),w(2))T,x=(x(1),x(2))T
解:構(gòu)建最優(yōu)化問題:
按照算法求解w, b。η=1
(1)取初值w0=0, b0=0
(2)對(duì)于(3,3):-(0+0)+0=0未被正確分類。更新w,b
w1=w0+1*y1·x1 = (0,0)T+1(3,3)T=(3,3)T
b1=b0+y1=1
得到線性模型w1x+b1 = 3x(1)+3x(2)+1
(3)返回(2)繼續(xù)尋找yi(w·xi+b)≤0的點(diǎn),更新w,b。直到對(duì)于所有的點(diǎn)yi(w·xi+b)>0,沒有誤分類點(diǎn),損失函數(shù)達(dá)到最小。
分離超平面為x(1)+x(2)-3=0
感知機(jī)模型為 f(x)=sign(x(1)+x(2)-3)
在迭代過程中,出現(xiàn)w·xi+b=-2,此時(shí),取任意一個(gè)點(diǎn),都會(huì)是其小于0,不同的取值順序會(huì)導(dǎo)致最終的結(jié)果不同,因此解并不是唯一的。為了得到唯一的超平面,需要對(duì)分離超平面增加約束條件,這就是支持向量機(jī)的想法。
實(shí)現(xiàn)代碼
importosimportsys#An example in that book, the training set and parameters' sizes are fixed
training_set =[]
w=[]
b=0
lens=0
n=0#update parameters using stochastic gradient descent
defupdate(item):globalw, b, lens, nfor i inrange(lens):
w[i]= w[i] + n * item[1] *item[0][i]
b= b + n * item[1]print w, b #you can uncomment this line to check the process of stochastic gradient descent
#calculate the functional distance between 'item' an the dicision surface
defcal(item):globalw, b
res=0for i inrange(len(item[0])):
res+= item[0][i] *w[i]
res+=b
res*= item[1]returnres#check if the hyperplane can classify the examples correctly
defcheck():
flag=Falsefor item intraining_set:if cal(item) <=0:
flag=True
update(item)if not flag: #False
print "RESULT: w:" + str(w) + "b:"+str(b)
tmp= ''
for keys inw:
tmp+= str(keys) + ' 'tmp=tmp.strip()
modelFile.write(tmp+ '\n')
modelFile.write(str(b)+ '\n')
modelFile.write(str(lens)+ '\n')
modelFile.write(str(n)+ '\n')
modelFile.close()
os._exit(0)
flag=Falseif __name__=="__main__":if len(sys.argv) != 4:print "Usage: python perceptron.py n trainFile modelFile"exit(0)
n= float(sys.argv[1])
trainFile= file(sys.argv[2])
modelFile= file(sys.argv[3], 'w')
lens=0for line intrainFile:
chunk= line.strip().split(' ')
lens= len(chunk) - 1tmp_all=[]
tmp=[]for i in range(1, lens+1):
tmp.append(int(chunk[i]))
tmp_all.append(tmp)
tmp_all.append(int(chunk[0]))
training_set.append(tmp_all)
trainFile.close()for i inrange(lens):
w.append(0)for i in range(1000):
check()print "The training_set is not linear separable."
View Code
3.2 感知機(jī)學(xué)習(xí)的對(duì)偶形式
對(duì)偶形式的基本想法是,將w,b表示成為實(shí)例xi和標(biāo)記yi的線性組合的形式,通過求解其系數(shù)而得到w和b。不失一般性,將初始值w0,b0設(shè)為0.對(duì)誤分類點(diǎn)(xi,yi)通過
w = w + ηyixi
b = b + ηyi
的轉(zhuǎn)換逐步修該w,b,設(shè)修改了n次,則w,b關(guān)于(xi,yi)的增量分別為aiyixi和aiyi,這里ai=niη最終學(xué)習(xí)到的w,b可以表示為
實(shí)例點(diǎn)更新次數(shù)越多,意味著它距離分離超平面越近,也就越難正確分類。換句話說,這樣的實(shí)例對(duì)學(xué)習(xí)結(jié)果影響很大。
算法(感知機(jī)學(xué)習(xí)算法的對(duì)偶形式)
輸入:T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N,學(xué)習(xí)速率為η)
輸出:a,b;感知機(jī)模型f(x)=sign(w·x+b)
(1) 初始化w0,b0
(2) 在訓(xùn)練數(shù)據(jù)集中選取(xi, yi)
(3) 如果
ai = ai + η
b = b + ηyi(4) 轉(zhuǎn)至(2)
對(duì)偶形式中訓(xùn)練數(shù)據(jù)僅以內(nèi)積的形式出現(xiàn),為了方便可以預(yù)先把訓(xùn)練數(shù)據(jù)間內(nèi)積計(jì)算出來并以矩陣的形式存儲(chǔ)起來,這個(gè)矩陣就是所謂的Gram矩陣。
實(shí)現(xiàn)代碼
importosimportsys#An example in that book, the training set and parameters' sizes are fixed
training_set =[]
w=[]
a=[]
b=0
lens=0
n=0
Gram=[]defcalInnerProduct(i, j):globallens
res=0for p inrange(lens):
res+= training_set[i][0][p] *training_set[j][0][p]returnresdefAddVector(vec1, vec2):for i inrange(len(vec1)):
vec1[i]= vec1[i] +vec2[i]returnvec1defNumProduct(num, vec):for i inrange(len(vec)):
vec[i]*=numreturnvecdefcreateGram():globallensfor i inrange(len(training_set)):
tmp=[]for j inrange(0, len(training_set)):
tmp.append(calInnerProduct(i, j))
Gram.append(tmp)#update parameters using stochastic gradient descent
defupdate(k):globala, b, n
a[k]+=n
b= b + n * training_set[k][1]print a, b #you can uncomment this line to check the process of stochastic gradient descent
#calculate the functional distance between 'item' an the dicision surface
defcal(k):globala, b
res=0for i inrange(len(training_set)):
res+= a[i] * int(training_set[i][1]) *Gram[i][k]
res+=b
res*= training_set[k][1]returnres#check if the hyperplane can classify the examples correctly
defcheck():globalw, a
flag=Falsefor i inrange(len(training_set)):if cal(i) <=0:
flag=True
update(i)if not flag: #False
for i inrange(len(training_set)):
w= AddVector(w, NumProduct(a[i] * int(training_set[i][1]), training_set[i][0]))print "RESULT: w:", w, "b:", b
tmp= ''
for keys inw:
tmp+= str(keys) + ' 'tmp=tmp.strip()
modelFile.write(tmp+ '\n')
modelFile.write(str(b)+ '\n')
modelFile.write(str(lens)+ '\n')
modelFile.write(str(n)+ '\n')
modelFile.close()
os._exit(0)
flag=Falseif __name__=="__main__":if len(sys.argv) != 4:print "Usage: python perceptron_duality.py n trainFile modelFile"exit(0)
n= float(sys.argv[1])
trainFile= file(sys.argv[2])
modelFile= file(sys.argv[3], 'w')
lens=0for line intrainFile:
chunk= line.strip().split(' ')
lens= len(chunk) - 1tmp_all=[]
tmp=[]for i in range(1, lens+1):
tmp.append(int(chunk[i]))
tmp_all.append(tmp)
tmp_all.append(int(chunk[0]))
training_set.append(tmp_all)
trainFile.close()
createGram()for i inrange(len(training_set)):
a.append(0)for i inrange(lens):
w.append(0)for i in range(1000):
check()print "The training_set is not linear separable."
View Code
4. GitHub地址
總結(jié)
以上是生活随笔為你收集整理的python开机号_感知机(python实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画樱桃小丸子_每天坚持画画|
- 下一篇: python怎么执行程序_小鹅通视频怎么