感知機定義
如果有一個算法,具有1個或者多個入參,但是返回值要么是0,要么是1,那么這個算法就叫做感知機,也就是說,感知機是個算法
感知機有什么用
感知機是用來表示可能性的大小的,我們可以認為假設如果返回1,那么事情下一步的方向偏向A更大一些,如果返回0,那么事情下一步的方向偏向B更大一些,現在說這些還太早,總之我們知道感知機是用來表述可能性大小的東西就可以了
亂寫一個感知機
根據定義,下面的算法是我隨便寫的,雖然沒任何用,但是它確實是一個感知機算法,很明顯,感知機算法有無窮無盡個
java語言:
public static void main(String[] args) {int result = 感知機(7, 8);System.out.println(result);
}public int 感知機(int a, int b) {if (a + b > 5) {return 1;}return 0;
}
python語言:
def perceptron(a,b): # 定義感知機算法if(a + b>5):return 1else: return 0
a,b = 7,8
result = perceptron(a,b)
print(result)
閾值與偏置:上述示例中的[5]叫做閾值,后文中我們會叫它偏置
閾值:
很明顯,上述示例中的5,是我根據我腦海中的需求,隨便寫出來的,其他人的想法肯定是和我不太一樣的,所以其他人也有可能寫成a+b>999
,那么我們就說閾值是999,如果滿足這個閾值,就返回1,不滿足這個閾值,就返回0
偏置:
在感知機的概念中,我們通常把閾值叫做偏置,既然名詞改變了,那么我們的算法也需要改變一下,變成下面這樣
if(-5 + (a + b)>0):return 1
else: return 0
這個時候,我們才可以正式的說:偏置為-5
權重
這是一個非常重要的概念,在上述算法中,我沒有體現出權重,也就是說,上面的代碼,沒有權重,或者說,上述的代碼中,權重是1
那么對于感知機來說,什么是權重?沒有權重會怎么樣
1.什么是權重:每個入參都需要乘以一個值,至于值是多少,我們先不管,那么乘以的這個值,就叫做權重,拿上述代碼來說,其實是乘以了1,就像下面這樣:
# a乘以1加上b乘以1
if(-5 + (a*1 + b*1)>0):return 1
else: return 0
2.加上權重會怎么樣?當然是會嚴重影響結果了例如,我們讓參數a的權重是0.5,參數b的權重是0.1,變成下面這樣
if(-5 + (a*0.5 + b*0.1)>0):return 1
else: return 0
# 此時如果a=7,b=8,那么該感知機算法會返回0,之前是返回1的,加了這個權重,變成0了
3.權重到底影響什么?權重影響的是參數,如果我們認為參數是現實中的某種決策的外在條件,那么權重會影響最終結果,例如,今天下雨天氣不好,我要出去玩HR,那么請問天氣不好在家
的權重大,還是出去玩HR
的權重大???如果天氣不好在家
的權重非常大,只要滴幾個小雨點或者陰天,那么我們就絕對不會出門,如果出去玩HR
的權重大,那么無論天氣多么惡劣,我們也會出去玩HR,對不對??所以說權重會影響決策,例如下面你的代碼,無論你將b設置成什么值,都不會影響結果,因為它的權重非常小
if(-5 + (a*0.5 + b*0)>0): # 我們將b的權重設置成0,相當于完全忽略b這個條件return 1
else: return 0
感知機的初步公式
我們上面介紹了入參,權重,偏置,所以得到了一個感知機公式,如下
結果0 = 偏置 + (入參1 * 入參1權重 + 入參2 * 入參2權重) <=0
結果1 = 偏置 + (入參1 * 入參1權重 + 入參2 * 入參2權重) > 0
階躍函數與激活函數
階躍函數是當結果超過了某個閾值,就輸出另一個參數,在本文的例子中,就是大于0小于0這個過程,下面代碼中的step函數,就是階躍函數,對上文的代碼進行拆分,我們拆分成兩步,如下
步驟1:
結果X = 偏置 + (入參1 * 入參1權重 + 入參2 * 入參2權重)
步驟2:
def step(a): # 定義一個階躍函數if(a>0):return 1else: return 0
結果R = step(X) # 將步驟1的結果傳遞到階躍函數中,結果R要么是0,要么是1
由于階躍函數使用起來不夠平滑,平滑指的是跳躍太大了,有點像高低電平,給一個閾值,以這個閾值為門檻,這有很多缺點,我們之后再說,總之你要記住“不夠平滑”,我們想要平滑,所以又提出了階躍函數的升級版本,也叫激活函數(注意,激活是個名詞,不是動詞)
激活函數
這里不寫了,單獨拎出一片文章吧,今天該下班回家打LOL了
感知機的缺點
感知機有一個缺點,就是這個權重的設置,在本文的代碼中,0.5,0.1,0什么的,這都是我隨便設置的,但是現實生活中,如果想讓一個算法具有智能,那么這個權重是通過大量數據總結出來的,如果想要人工總結,那么得需要大量的時間和人工成本,是否有什么辦法,能夠讓計算機自己定義這個權重呢??
當然是有的,我們常常聽到的機器學習,就是通過大量數據+一個叫做神經網絡的技術,把權重算出來,當然,如果你覺得對這個權重不滿意,也可以人工干擾,或者說我本身就知道應該設置權重多少,沒必要進行機器學習,直接寫死權重值也是可以的,不過這是后面文章的內容了
本文就到這里,介紹了一些感知機的概念