日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

感知机(python实现)

發(fā)布時間:2024/4/17 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 感知机(python实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ?感知機(jī)(perceptron)是二分類的線性分類模型,輸入為實(shí)例的特征向量,輸出為實(shí)例的類別(取+1和-1)。感知機(jī)對應(yīng)于輸入空間中將實(shí)例劃分為兩類的分離超平面。感知機(jī)旨在求出該超平面,為求得超平面導(dǎo)入了基于誤分類的損失函數(shù),利用梯度下降法 對損失函數(shù)進(jìn)行最優(yōu)化(最優(yōu)化)。感知機(jī)的學(xué)習(xí)算法具有簡單而易于實(shí)現(xiàn)的優(yōu)點(diǎn),分為原始形式和對偶形式。感知機(jī)預(yù)測是用學(xué)習(xí)得到的感知機(jī)模型對新的實(shí)例進(jìn)行預(yù)測的,因此屬于判別模型。感知機(jī)由Rosenblatt于1957年提出的,是神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)的基礎(chǔ)。

行文脈絡(luò)

  • 感知機(jī)模型
  • 感知機(jī)學(xué)習(xí)策略
  • 感知機(jī)學(xué)習(xí)算法
      • 原始形式
      • 對偶形式

    ????? 4. Github地址

    1. 感知機(jī)模型

    定義

    假設(shè)輸入空間(特征向量)為X?Rn,輸出空間為Y={-1, +1}。輸入x∈X表示實(shí)例的特征向量,對應(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為符號函數(shù),即

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)

    ?

    ?

    幾何解釋 ? ?

    感知機(jī)模型是線性分類模型,感知機(jī)模型的假設(shè)空間是定義在特征空間中的所有線性分類模型,即函數(shù)集合{f|f(x)=w·x+b}。線性方程 w·x+b=0對應(yīng)于特征空間Rn中的一個超平面S,其中w是超平面的法向量,b是超平面的截踞。這個超平面把特征空間劃分為兩部分。位于兩側(cè)的點(diǎn)分別為正負(fù)兩類。超平面S稱為分離超平面,如下圖:

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    ?

    ?

    學(xué)習(xí)與預(yù)測

    感知機(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ù)測即根據(jù)得到的感知機(jī)模型(1),對新的輸入實(shí)例給出對應(yīng)的類型。

    ?

    2. 感知機(jī)學(xué)習(xí)策略

    ? ? 假設(shè)訓(xùn)練數(shù)據(jù)集是線性可分的,感知機(jī)學(xué)習(xí)的目標(biāo)是求得一個能夠?qū)⒂?xùn)練數(shù)據(jù)的正負(fù)實(shí)例點(diǎn)完全分開的分離超平面,即最終求得參數(shù)w、b。這需要一個學(xué)習(xí)策略,即定義(經(jīng)驗(yàn))損失函數(shù)并將損失函數(shù)最小化。

    ? ? 損失函數(shù)的一個自然的選擇是誤分類的點(diǎn)的總數(shù)。但是這樣得到的損失函數(shù)不是參數(shù)w、b的連續(xù)可導(dǎo)函數(shù),不宜優(yōu)化。損失函數(shù)的另一個選擇是誤分類點(diǎn)到分里面的距離之和。

    ? ? 首先,對于任意一點(diǎn)xo到超平面的距離為

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)

    ? ? 其次,對于誤分類點(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)險函數(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)的集合,這個損失函數(shù)就是感知機(jī)學(xué)習(xí)的經(jīng)驗(yàn)風(fēng)險函數(shù)。 ? ? ? ? ? ? ? ? ? ? ? ? ??

    ? ? 顯然,損失函數(shù)L(w,b)是非負(fù)的。如果沒有誤分類點(diǎn),那么L(w,b)為0,誤分類點(diǎn)數(shù)越少,L(w,b)值越小。一個特定的損失函數(shù):在誤分類時是參數(shù)w,b的線性函數(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ū)動的,具體采用隨機(jī)梯度下降法。首先,任意選定w0、b0,然后用梯度下降法不斷極小化目標(biāo)函數(shù)(6),極小化的過程不知一次性的把M中的所有誤分類點(diǎn)梯度下降,而是一次隨機(jī)選取一個誤分類點(diǎn)使其梯度下降。

    ? ? 假設(shè)誤分類集合M是固定的,那么損失函數(shù)L(w,b)的梯度由(7)(8)給出

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (7)

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (8)

    隨機(jī)選取一個誤分類點(diǎn)(xi,yi),對w,b進(jìn)行更新:

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (9)

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (10)

    式中η(0≤η≤1)是步長,在統(tǒng)計學(xué)是中成為學(xué)習(xí)速率。步長越大,梯度下降的速度越快,更能接近極小點(diǎn)。如果步長過大,有可能導(dǎo)致跨過極小點(diǎn),導(dǎo)致函數(shù)發(fā)散;如果步長過小,有可能會耗很長時間才能達(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 + ηyixib = b + ηyi (4) 轉(zhuǎn)至(2

    直觀解釋:當(dāng)一個實(shí)例點(diǎn)被誤分類時,調(diào)整w,b,使分離超平面向該誤分類點(diǎn)的一側(cè)移動,以減少該誤分類點(diǎn)與超平面的距離,直至超越該點(diǎn)被正確分類。

    例1

    對于訓(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)對于(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。直到對于所有的點(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,此時,取任意一個點(diǎn),都會是其小于0,不同的取值順序會導(dǎo)致最終的結(jié)果不同,因此解并不是唯一的。為了得到唯一的超平面,需要對分離超平面增加約束條件,這就是支持向量機(jī)的想法。

    實(shí)現(xiàn)代碼

    import os import sys# 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 def update(item):global w, b, lens, nfor i in range(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 def cal(item):global w, bres = 0for i in range(len(item[0])):res += item[0][i] * w[i]res += bres *= item[1]return res# check if the hyperplane can classify the examples correctly def check():flag = Falsefor item in training_set:if cal(item) <= 0:flag = Trueupdate(item)if not flag: #Falseprint "RESULT: w: " + str(w) + " b: "+ str(b)tmp = ''for keys in w: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 in trainFile: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 in range(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í)的對偶形式

    對偶形式的基本想法是,將w,b表示成為實(shí)例xi和標(biāo)記yi的線性組合的形式,通過求解其系數(shù)而得到w和b。不失一般性,將初始值w0,b0設(shè)為0.對誤分類點(diǎn)(xi,yi)通過

    w = w + ηyixib = 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í)例對學(xué)習(xí)結(jié)果影響很大。

    算法(感知機(jī)學(xué)習(xí)算法的對偶形式)

    輸入: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)

    對偶形式中訓(xùn)練數(shù)據(jù)僅以內(nèi)積的形式出現(xiàn),為了方便可以預(yù)先把訓(xùn)練數(shù)據(jù)間內(nèi)積計算出來并以矩陣的形式存儲起來,這個矩陣就是所謂的Gram矩陣。

    實(shí)現(xiàn)代碼

    import os import sys# An example in that book, the training set and parameters' sizes are fixed training_set = []w = [] a = [] b = 0 lens = 0 n = 0 Gram = []def calInnerProduct(i, j):global lensres = 0for p in range(lens):res += training_set[i][0][p] * training_set[j][0][p]return resdef AddVector(vec1, vec2):for i in range(len(vec1)):vec1[i] = vec1[i] + vec2[i]return vec1def NumProduct(num, vec):for i in range(len(vec)):vec[i] *= numreturn vec def createGram():global lensfor i in range(len(training_set)):tmp = []for j in range(0, len(training_set)):tmp.append(calInnerProduct(i, j))Gram.append(tmp)# update parameters using stochastic gradient descent def update(k):global a, b, na[k] += nb = 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 def cal(k):global a, bres = 0for i in range(len(training_set)):res += a[i] * int(training_set[i][1]) * Gram[i][k]res += bres *= training_set[k][1]return res# check if the hyperplane can classify the examples correctly def check():global w, aflag = Falsefor i in range(len(training_set)):if cal(i) <= 0:flag = Trueupdate(i)if not flag: #Falsefor i in range(len(training_set)):w = AddVector(w, NumProduct(a[i] * int(training_set[i][1]), training_set[i][0]))print "RESULT: w: ", w, " b: ", btmp = ''for keys in w: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 in trainFile: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 in range(len(training_set)):a.append(0)for i in range(lens):w.append(0)for i in range(1000):check()print "The training_set is not linear separable. " View Code

    ?

    4. GitHub地址

    https://github.com/jihite/Perceptron-python-

    轉(zhuǎn)載于:https://www.cnblogs.com/kaituorensheng/p/3561091.html

    總結(jié)

    以上是生活随笔為你收集整理的感知机(python实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。