深度学习入门之感知器(原理+代码)
感知器的原理:感知器的原理相當(dāng)簡(jiǎn)單,當(dāng)線性可分的時(shí)候就是中學(xué)的時(shí)候?qū)W過(guò)的y=kx+b,只不過(guò)中學(xué)的時(shí)候k和b都是給出的,給我們x讓我們?nèi)デ髖,看看y是在這條直線的上方還是下方。而現(xiàn)在沒(méi)有給我們k和b,給我們了一大堆(x,y),讓我們根據(jù)這一大堆x和y求一條直線,這條直線最好能把這一大堆數(shù)據(jù)劃分為兩類(lèi)(最大似然函數(shù)的思想,大學(xué)學(xué)過(guò)的p(|X)),并且要求這條直線兩邊的點(diǎn)最好離這條直線遠(yuǎn)一點(diǎn)(支持向量機(jī)就是基于此思想),因?yàn)檫@些點(diǎn)離這條直線遠(yuǎn)了,一些點(diǎn)被誤劃分的概率就會(huì)小很多。
感知器涉及到的相關(guān)公式
感知器的輸出
激活函數(shù)我們選擇階躍函數(shù)
感知器訓(xùn)練涉及到的公式即權(quán)重參數(shù)w和偏置項(xiàng)b的更新規(guī)則。
?
其中t是實(shí)際的值即label,y是我們輸入x訓(xùn)練出的值,n是學(xué)習(xí)率,用來(lái)調(diào)整學(xué)習(xí)的速率n值太大太小都不容易找到合適的w和b。
用感知器去實(shí)現(xiàn)與操作,代碼詳解
這一段我們寫(xiě)好感知器的數(shù)據(jù)讀取,權(quán)重更新規(guī)則。
class Perceptron(object):def __init__(self, input_num, activator):'''初始化感知器,設(shè)置輸入?yún)?shù)的個(gè)數(shù),以及激活函數(shù)。激活函數(shù)的類(lèi)型為double -> double'''self.activator = activator# 權(quán)重向量初始化為0self.weights = [0.0 for _ in range(input_num)]# 偏置項(xiàng)初始化為0self.bias = 0.0def __str__(self):'''打印學(xué)習(xí)到的權(quán)重、偏置項(xiàng)'''return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)def predict(self, input_vec):'''輸入向量,輸出感知器的計(jì)算結(jié)果'''# 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起# 變成[(x1,w1),(x2,w2),(x3,w3),...]# 然后利用map函數(shù)計(jì)算[x1*w1, x2*w2, x3*w3]# 最后利用reduce求和return self.activator(reduce(lambda a, b: a + b,map(lambda (x, w): x * w, zip(input_vec, self.weights)), 0.0) + self.bias)def train(self, input_vecs, labels, iteration, rate):'''輸入訓(xùn)練數(shù)據(jù):一組向量、與每個(gè)向量對(duì)應(yīng)的label;以及訓(xùn)練輪數(shù)、學(xué)習(xí)率'''for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):'''一次迭代,把所有的訓(xùn)練數(shù)據(jù)過(guò)一遍'''# 把輸入和輸出打包在一起,成為樣本的列表[(input_vec, label), ...]# 而每個(gè)訓(xùn)練樣本是(input_vec, label)samples = zip(input_vecs, labels)# 對(duì)每個(gè)樣本,按照感知器規(guī)則更新權(quán)重for (input_vec, label) in samples:# 計(jì)算感知器在當(dāng)前權(quán)重下的輸出output = self.predict(input_vec)# 更新權(quán)重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):'''按照感知器規(guī)則更新權(quán)重'''# 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起# 變成[(x1,w1),(x2,w2),(x3,w3),...]# 然后利用感知器規(guī)則更新權(quán)重delta = label - outputself.weights = map(lambda (x, w): w + rate * delta * x,zip(input_vec, self.weights))# 更新biasself.bias += rate * delta接下來(lái)我們開(kāi)始訓(xùn)練并測(cè)試
def f(x):'''定義激活函數(shù)f'''return 1 if x > 0 else 0 def get_training_dataset():'''基于and真值表構(gòu)建訓(xùn)練數(shù)據(jù)'''# 構(gòu)建訓(xùn)練數(shù)據(jù)# 輸入向量列表input_vecs = [[1,1], [0,0], [1,0], [0,1]]# 期望的輸出列表,注意要與輸入一一對(duì)應(yīng)# [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0labels = [1, 0, 0, 0]return input_vecs, labels def train_and_perceptron():'''使用and真值表訓(xùn)練感知器'''# 創(chuàng)建感知器,輸入?yún)?shù)個(gè)數(shù)為2(因?yàn)閍nd是二元函數(shù)),激活函數(shù)為fp = Perceptron(2, f)# 訓(xùn)練,迭代10輪, 學(xué)習(xí)速率為0.1input_vecs, labels = get_training_dataset()p.train(input_vecs, labels, 10, 0.1)#返回訓(xùn)練好的感知器return p if __name__ == '__main__': # 訓(xùn)練and感知器and_perception = train_and_perceptron()# 打印訓(xùn)練獲得的權(quán)重print and_perception# 測(cè)試print '1 and 1 = %d' % and_perception.predict([1, 1])print '0 and 0 = %d' % and_perception.predict([0, 0])print '1 and 0 = %d' % and_perception.predict([1, 0])print '0 and 1 = %d' % and_perception.predict([0, 1])資料參考于:https://www.zybuluo.com/hanbingtao/note/433855
?
?
?
?
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的深度学习入门之感知器(原理+代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c mysql触发器,mysql触发器
- 下一篇: c语言加法结合性,C语言 运算符 的结合