深度學(xué)習(xí)(1)-感知器

感知器

為了理解神經(jīng)網(wǎng)絡(luò)瘤运,我們應(yīng)該先理解神經(jīng)網(wǎng)絡(luò)的組成單元——神經(jīng)元翰撑。神經(jīng)元也叫做感知器罩旋。感知器算法在上個(gè)世紀(jì)50-70年代很流行,也成功解決了很多問題眶诈。并且涨醋,感知器算法也是非常簡單的。

感知器的定義

下圖是一個(gè)感知器:


一個(gè)感知器有如下組成部分:

  • 輸入權(quán)值 一個(gè)感知器可以接收多個(gè)輸入逝撬,每個(gè)輸入上都有一個(gè)權(quán)值w浴骂,此外還有一個(gè)偏置項(xiàng)b

  • 激活函數(shù) 感知器的激活函數(shù)可以有很多選擇,比如我們可以選擇下面這個(gè)階躍函數(shù)f來作為激活函數(shù):

  • 輸出 感知器的輸出由下面這個(gè)公式來計(jì)算


我們用一個(gè)簡單的例子來幫助理解

例子:用感知器實(shí)現(xiàn)and函數(shù)
我們設(shè)計(jì)一個(gè)感知器宪潮,讓它來實(shí)現(xiàn)and運(yùn)算溯警。程序員都知道,and是一個(gè)二元函數(shù)(帶有兩個(gè)參數(shù)X1和X2)狡相,下面是它的真值表:


我們令梯轻,而激活函數(shù)就是前面寫出來的階躍函數(shù),這時(shí)谣光,感知器就相當(dāng)于and函數(shù)檩淋。不明白芬为?我們驗(yàn)算一下:

輸入上面真值表的第一行萄金,即,那么根據(jù)公式(1)媚朦,計(jì)算輸出:


例子:用感知器實(shí)現(xiàn)or函數(shù)

同樣氧敢,我們可以用感知器來實(shí)現(xiàn)or運(yùn)算。僅僅需要把偏置項(xiàng)b的值設(shè)置為-0.3就可以了询张。我們驗(yàn)算一下孙乖,下面是or運(yùn)算的真值表:



感知器還能做什么

事實(shí)上,感知器不僅僅能實(shí)現(xiàn)簡單的布爾運(yùn)算。它可以擬合任何的線性函數(shù)唯袄,任何線性分類或線性回歸問題都可以用感知器來解決弯屈。前面的布爾運(yùn)算可以看作是二分類問題,即給定一個(gè)輸入恋拷,輸出0(屬于分類0)或1(屬于分類1)资厉。如下面所示,and運(yùn)算是一個(gè)線性分類問題蔬顾,即可以用一條直線把分類0(false宴偿,紅叉表示)和分類1(true,綠點(diǎn)表示)分開诀豁。


感知器的訓(xùn)練
現(xiàn)在窄刘,你可能困惑前面的權(quán)重項(xiàng)和偏置項(xiàng)的值是如何獲得的呢?這就要用到感知器訓(xùn)練算法:將權(quán)重項(xiàng)和偏置項(xiàng)初始化為0舷胜,然后娩践,利用下面的感知器規(guī)則迭代的修改和,直到訓(xùn)練完成逞带。

編程實(shí)戰(zhàn):實(shí)現(xiàn)感知器
完整代碼

對于程序員來說欺矫,沒有什么比親自動(dòng)手實(shí)現(xiàn)學(xué)得更快了,而且展氓,很多時(shí)候一行代碼抵得上千言萬語穆趴。接下來我們就將實(shí)現(xiàn)一個(gè)感知器。

下面是一些說明:

  • 使用python語言遇汞。python在機(jī)器學(xué)習(xí)領(lǐng)域用的很廣泛未妹,而且,寫python程序真的很輕松空入。
  • 面向?qū)ο缶幊搪缢C嫦驅(qū)ο笫翘貏e好的管理復(fù)雜度的工具,應(yīng)對復(fù)雜問題時(shí)歪赢,用面向?qū)ο笤O(shè)計(jì)方法很容易將復(fù)雜問題拆解為多個(gè)簡單問題化戳,從而解救我們的大腦。
  • 沒有使用numpy埋凯。numpy實(shí)現(xiàn)了很多基礎(chǔ)算法点楼,對于實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法來說是個(gè)必備的工具。但為了降低讀者理解的難度白对,下面的代碼只用到了基本的python(省去您去學(xué)習(xí)numpy的時(shí)間)掠廓。

下面是感知器類的實(shí)現(xiàn),非常簡單甩恼。去掉注釋只有27行蟀瞧,而且還包括為了美觀(每行不超過60個(gè)字符)而增加的很多換行沉颂。

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 19-2-14 下午4:13
# @Author  : Gavin
# @Site    : 
# @File    : perceptron.py
# @Software: PyCharm
from functools import reduce
import tqdm
class Perception(object):
    def __init__(self,input_num,activator):

        """
        :param input_num:輸入?yún)?shù)的個(gè)數(shù)
        :param activator:激活函數(shù)
        """
        self.activator = activator

        ##權(quán)重向量初始化為0
        self.weight = [0.0 for _ in range(input_num)]
        ##偏置項(xiàng)初始化為0
        self.bias = 0.0

    def __str__(self):
        """
        打印學(xué)習(xí)到的權(quán)重、偏置項(xiàng)
        :return:
        """
        return 'weights :{} bias :{}'.format(self.weight,self.bias)


    def prdict(self,input_vec):
        """
        把input_vec[x1,x2,x3...]和weights[w1,w2,w3,....]打包在一起
        變?yōu)閇(x1,w1),(x2,w2),....],然后利用map函數(shù)計(jì)算[x1*w1,x2*w2,.....],
        最后利用reduce求和
        :param input_vec:
        :return:
        """
        xw = zip(input_vec,self.weight)

        xw_map = map(lambda x:x[0]*x[1],xw)

        xw_map_sum = reduce(lambda x,y:x+y,xw_map,0.0)

        return self.activator(xw_map_sum +self.bias)

    def train(self,input_vecs,labels,iteration,rate):
        """
        輸入訓(xùn)練數(shù)據(jù):一組向量悦污、與每個(gè)向量對應(yīng)的label;以及訓(xùn)練輪數(shù)铸屉、學(xué)習(xí)率
        :param input_vecs: 一組向量
        :param labels: 每個(gè)向量對應(yīng)的label
        :param iteration: 訓(xùn)練輪數(shù)
        :param rate: 學(xué)習(xí)率
        :return:
        """

        for i in (range(iteration)):
            self._one_interation(input_vecs,labels,rate)


    def _one_interation(self,input_vecs,labels,rate):
        """
        一次迭代,把所有的訓(xùn)練數(shù)據(jù)過一遍
        :param input_vecs:
        :param labels:
        :param rate:
        :return:
        """
        # 把輸入和輸出打包在一起切端,成為樣本的列表[(input_vec,label),...]
        # 而每個(gè)訓(xùn)練樣本是(input_vec,label)
        samples = zip(input_vecs, labels)

        for (input_vec,label) in samples:
            #計(jì)算感知器在當(dāng)前權(quán)重下的輸出
            output = self.prdict(input_vec)
            #更新權(quán)重

            self._update_weights(input_vec,output,label,rate)


    def _update_weights(self,input_vec,output,label,rate):
        """
        按照感知器規(guī)則更新權(quán)重

        :param input_vec:
        :param output:
        :param label:
        :param rate:
        :return:
        """
        #把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,....]打包在一起抬探,變?yōu)閇(x1,w1),(x2,w2),(x3,w3),....]
        xw = zip(input_vec, self.weight)

        #利用感知器規(guī)則更新權(quán)重
        delta = label - output

        self.weight=list(map(lambda x:x[1] + rate * delta * x[0],xw))

        #更新bias
        self.bias += rate * delta

def fun(x):
    if x >0:
        a = 1
    else:
        a = 0
    return a


# per = Perception(input_num=3,activator=fun)
# print(per.prdict(input_vec=[0,0]))
#
# print(per)


###################and函數(shù)實(shí)現(xiàn)
def get_training_dataset():

    input_vecs = [[1,1], [0,0], [1,0], [0,1]]
    # 期望的輸出列表,注意要與輸入一一對應(yīng)
    # [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0
    labels = [1,0,0,0]

    return input_vecs,labels


def train_and_perception():
    p = Perception(2,fun)

    input_vecs,labels = get_training_dataset()
    p.train(input_vecs,labels,10,0.1)

    return p


##################or函數(shù)實(shí)現(xiàn)
def get_training_or_dataset():
    input_vecs = [[1, 1], [0, 0], [1, 0], [0, 1]]
    # 期望的輸出列表帆赢,注意要與輸入一一對應(yīng)
    # [1,1] -> 1, [0,0] -> 0, [1,0] -> 1, [0,1] -> 1
    labels = [1, 0, 1, 1]

    return input_vecs,labels


def train_or_perception():
    p = Perception(2,fun)

    input_vecs,labels = get_training_or_dataset()
    p.train(input_vecs,labels,10,0.1)

    return p

if __name__ == '__main__':
    ###################訓(xùn)練小压、測試and函數(shù)
    and_perception = train_and_perception()

    ##打印訓(xùn)練獲得的權(quán)重
    print(and_perception)

    ##測試

    print('1 and 1 ={}'.format(and_perception.prdict([1,1])))

    print('1 and 0 ={}'.format(and_perception.prdict([1,0])))
    print('0 and 1 ={}'.format(and_perception.prdict([0,1])))



    ####################訓(xùn)練、測試or函數(shù)
    or_perception = train_or_perception()

    ##打印訓(xùn)練獲得的權(quán)重
    print(or_perception)

    ##測試

    print('1 and 1 ={}'.format(or_perception.prdict([1, 1])))

    print('1 and 0 ={}'.format(or_perception.prdict([1, 0])))
    
    print('0 and 0 ={}'.format(or_perception.prdict([0, 0])))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椰于,一起剝皮案震驚了整個(gè)濱河市怠益,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘾婿,老刑警劉巖蜻牢,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偏陪,居然都是意外死亡抢呆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門笛谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抱虐,“玉大人,你說我怎么就攤上這事饥脑】已” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵灶轰,是天一觀的道長谣沸。 經(jīng)常有香客問我,道長笋颤,這世上最難降的妖魔是什么乳附? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伴澄,結(jié)果婚禮上赋除,老公的妹妹穿的比我還像新娘。我一直安慰自己秉版,他們只是感情好贤重,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布茬祷。 她就那樣靜靜地躺著清焕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秸妥,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天滚停,我揣著相機(jī)與錄音,去河邊找鬼粥惧。 笑死键畴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的突雪。 我是一名探鬼主播起惕,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咏删!你這毒婦竟也來了惹想?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤督函,失蹤者是張志新(化名)和其女友劉穎嘀粱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辰狡,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锋叨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宛篇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃磺。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叫倍,靈堂內(nèi)的尸體忽然破棺而出豌鸡,到底是詐尸還是另有隱情,我是刑警寧澤段标,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布涯冠,位于F島的核電站,受9級特大地震影響逼庞,放射性物質(zhì)發(fā)生泄漏蛇更。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一赛糟、第九天 我趴在偏房一處隱蔽的房頂上張望派任。 院中可真熱鬧,春花似錦璧南、人聲如沸掌逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豆混。三九已至篓像,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皿伺,已是汗流浹背员辩。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸵鸥,地道東北人奠滑。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像妒穴,于是被迫代替她去往敵國和親宋税。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 姚麗冰 學(xué)號:16050120089 原文鏈接 www.zybuluo.com 轉(zhuǎn)載: https://jueji...
    小犽閱讀 1,411評論 0 3
  • 無論即將到來的是大數(shù)據(jù)時(shí)代還是人工智能時(shí)代讼油,亦或是傳統(tǒng)行業(yè)使用人工智能在云上處理大數(shù)據(jù)的時(shí)代弃甥,作為一個(gè)有理想有追求...
    韓炳濤閱讀 23,032評論 9 78
  • 孩子降生于世,最初的成長依賴于父母的一言一行汁讼,每個(gè)孩子終其一生都在尋求父母的認(rèn)同淆攻,特別是年幼的孩子,他們會(huì)根據(jù)父母...
    喜悅的安然閱讀 1,205評論 0 0
  • 母親的微笑就是天使的微笑,就是圣母瑪利亞的微笑耸彪。微笑的母親是天底下最美麗的女人伞芹。嬰兒就是在母親微笑的光環(huán)中沉睡,顯...
    瘦竹齋閱讀 1,084評論 1 6
  • 外甥女要上大學(xué)了蝉娜,第一次見到她的時(shí)候還在讀小學(xué)唱较。如果以十為單位數(shù)一數(shù),數(shù)到8召川、9已是不易南缓,到了快四十歲的時(shí)候,...
    無敵流氓兔閱讀 383評論 0 2