大数据算法基础笔记
一、分類算法:對數(shù)據(jù)分類和預(yù)測
1. KNN算法即K近鄰(K Nearest Neighbour)算法,是一種基本的分類算法,其主要原理是:對于一個(gè)需要分類的數(shù)據(jù),將其和一組已經(jīng)分類標(biāo)注好的樣本集合進(jìn)行比較,得到距離最近的K個(gè)樣本,K個(gè)樣本最多歸屬的類別,就是這個(gè)需要分類數(shù)據(jù)的類別。下面是KNN算法的原理圖:
上圖中,紅藍(lán)綠三種顏色的點(diǎn)為樣本數(shù)據(jù),分屬三種類別ω1?、ω2?和ω3。對于待分類點(diǎn)Xu,計(jì)算和它距離最近的5個(gè)點(diǎn)即K為5,這5個(gè)點(diǎn)最多歸屬的類別為ω1(4個(gè)點(diǎn)歸屬ω1,1個(gè)點(diǎn)歸屬ω3?),那么Xu的類別被分類為ω1。KNN的算法流程也簡單,如下面流程圖所示:
KNN算法可用于各種分類的場景,比如新聞分類、商品分類等,甚至可用于簡單的文字識別。對于新聞分類,可以提前對若干新聞進(jìn)行人工標(biāo)注,標(biāo)好新聞?lì)悇e,計(jì)算好特征向量。對于一篇未分類的新聞,計(jì)算其特征向量后,跟所有已標(biāo)注新聞進(jìn)行距離計(jì)算,然后進(jìn)一步利用KNN算法進(jìn)行自動(dòng)分類。
2. 那如何計(jì)算數(shù)據(jù)的距離,如何獲得新聞的特征向量呢?KNN算法的關(guān)鍵是要比較需要分類的數(shù)據(jù)與樣本數(shù)據(jù)之間的距離,這在機(jī)器學(xué)習(xí)中通常的做法是:提取數(shù)據(jù)的特征值,根據(jù)特征值組成一個(gè)n維實(shí)數(shù)向量空間(該空間也稱作特征空間),然后計(jì)算向量之間的空間距離。空間之間的距離計(jì)算方法有很多種,常用的有歐氏距離、余弦距離等。對于數(shù)據(jù)xi和xj?,若其特征空間為n維實(shí)數(shù)向量空間Rn,即xi? = (xi1?, xi2?, …, xin?),xj?=( xj1?, xj2??, …, xjn??),則其歐氏距離計(jì)算公式為:
這個(gè)歐式距離公式其實(shí)初中就學(xué)過,平面幾何和立體幾何里兩個(gè)點(diǎn)之間的距離,也是用這個(gè)公式計(jì)算出來的,只是平面幾何(二維幾何)里的n=2,立體幾何(三維幾何)里的n=3,而機(jī)器學(xué)習(xí)需要面對的每個(gè)數(shù)據(jù)都可能有n維的維度,即每個(gè)數(shù)據(jù)有n個(gè)特征值。但不管特征值n是多少,兩個(gè)數(shù)據(jù)的空間距離計(jì)算公式還是這個(gè)歐氏計(jì)算公式。大多數(shù)機(jī)器學(xué)習(xí)算法都需要計(jì)算數(shù)據(jù)之間的距離,因此掌握數(shù)據(jù)的距離計(jì)算公式是掌握機(jī)器學(xué)習(xí)算法的基礎(chǔ)。
歐氏距離是最常用的數(shù)據(jù)計(jì)算公式,但是在文本數(shù)據(jù)以及用戶評價(jià)數(shù)據(jù)的機(jī)器學(xué)習(xí)中,更常用的距離計(jì)算方法是余弦相似度,如下所示:
余弦相似度的值越接近1表示其越相似,越接近0表示其差異越大,使用余弦相似度可以消除數(shù)據(jù)的某些冗余信息,某些情況下更貼近數(shù)據(jù)的本質(zhì)。比如兩篇文章的特征值都是:“大數(shù)據(jù)”、“機(jī)器學(xué)習(xí)”和“Spark”,A文章的特征向量為(3, 3, 3),即這三個(gè)詞出現(xiàn)次數(shù)都是3;B文章的特征向量為(6, 6, 6),即這三個(gè)詞出現(xiàn)次數(shù)都是6。如果光看特征向量,這兩個(gè)向量差別很大,如果用歐氏距離計(jì)算確實(shí)也很大,但是這兩篇文章其實(shí)非常相似,只是篇幅不同而已,它們的余弦相似度為1,表示非常相似。
余弦相似度其實(shí)是計(jì)算向量的夾角,而歐氏距離公式是計(jì)算空間距離。余弦相似度更關(guān)注數(shù)據(jù)的相似性,比如兩個(gè)用戶給兩件商品的打分分別是(3, 3)和(4, 4),那么兩個(gè)用戶對兩件商品的喜好是相似的,這種情況下,余弦相似度比歐氏距離更合理。
3. 機(jī)器學(xué)習(xí)的算法需要計(jì)算距離,而計(jì)算距離需要還知道數(shù)據(jù)的特征向量,因此提取數(shù)據(jù)的特征向量是機(jī)器學(xué)習(xí)工程師的重要工作。不同數(shù)據(jù)以及不同的應(yīng)用場景需要提取不同的特征值,以比較常見的文本數(shù)據(jù)為例,看如何提取文本特征向量。文本數(shù)據(jù)的特征值就是提取文本關(guān)鍵詞,TF-IDF算法是比較常用且直觀的一種文本關(guān)鍵詞提取算法。這種算法由TF和IDF兩部分構(gòu)成。TF是詞頻(Term Frequency),表示某個(gè)單詞在文檔中出現(xiàn)的頻率,一個(gè)單詞在一個(gè)文檔中出現(xiàn)的越頻繁,TF值越高。詞頻的計(jì)算方法如下所示:
TF = 某個(gè)詞在文檔中出現(xiàn)的次數(shù) ?/ 文檔總詞數(shù)
IDF是逆文檔頻率(Inverse Document Frequency),表示這個(gè)單詞在所有文檔中的稀缺程度,越少文檔出現(xiàn)這個(gè)詞,IDF值越高,計(jì)算方法如下所示:
因此,TF與IDF的乘積就是TF-IDF,計(jì)算方法如下:
TF-IDF = TF × IDF
所以如果一個(gè)詞在某一個(gè)文檔中頻繁出現(xiàn),但在所有文檔中卻很少出現(xiàn),那么這個(gè)詞很可能就是這個(gè)文檔的關(guān)鍵詞。比如一篇關(guān)于原子能的技術(shù)文章,“核裂變”、“放射性”、“半衰期”等詞匯會(huì)在這篇文檔中頻繁出現(xiàn),即TF很高;但是在所有文檔中出現(xiàn)的頻率卻比較低,即IDF也比較高,因此這幾個(gè)詞的TF-IDF值就會(huì)很高,就可能是這篇文檔的關(guān)鍵詞,也許“中國”這個(gè)詞也會(huì)頻繁出現(xiàn),即TF也很高,但是“中國”也在很多文檔中出現(xiàn),那么IDF就會(huì)比較低,最后“中國”這個(gè)詞的TF-IDF就很低,不會(huì)成為這個(gè)文檔的關(guān)鍵詞。
提取出關(guān)鍵詞以后,就可以利用關(guān)鍵詞的詞頻構(gòu)造特征向量,比如上面例子關(guān)于原子能的文章,“核裂變”、“放射性”、“半衰期”這三個(gè)詞是特征值,分別出現(xiàn)次數(shù)為12、9、4,那么這篇文章的特征向量就是(12, 9, 4),再利用前面提到的空間距離計(jì)算公式計(jì)算與其他文檔的距離,結(jié)合KNN算法就可以實(shí)現(xiàn)文檔的自動(dòng)分類。
4. 貝葉斯公式是一種基于條件概率的分類算法,如果已經(jīng)知道A和B的發(fā)生概率,并且知道了B發(fā)生情況下A發(fā)生的概率,可以用貝葉斯公式計(jì)算A發(fā)生的情況下B發(fā)生的概率,事實(shí)上可以根據(jù)A的情況即輸入數(shù)據(jù),判斷B的概率即B的可能性,進(jìn)而進(jìn)行分類。
舉個(gè)例子:假設(shè)一所學(xué)校里男生占60%,女生占40%,男生總是穿長褲,女生則一半穿長褲一半穿裙子。假設(shè)校園中迎面走來一個(gè)穿長褲的學(xué)生,能夠推斷出這個(gè)穿長褲學(xué)生是男生的概率是多少嗎?答案是75%,具體算法是:
這個(gè)算法就利用了貝葉斯公式,貝葉斯公式的寫法是:
意思是A發(fā)生的條件下B發(fā)生的概率,等于B發(fā)生的條件下A發(fā)生的概率,乘以B發(fā)生的概率,除以A發(fā)生的概率。還是上面這個(gè)例子,如果問迎面走來穿裙子的學(xué)生是女生的概率是多少,同樣帶入貝葉斯公式,可以計(jì)算出是女生的概率為100%。
貝葉斯分類的一個(gè)典型的應(yīng)用場合是垃圾郵件分類,通過對樣本郵件的統(tǒng)計(jì),知道每個(gè)詞在郵件中出現(xiàn)的概率P(Ai?),也知道正常郵件概率P(B0?)和垃圾郵件的概率P(B1?),還可以統(tǒng)計(jì)出垃圾郵件中各個(gè)詞的出現(xiàn)概率P(Ai?∣B1?),那么一封新郵件到來,就可以根據(jù)郵件中出現(xiàn)的詞計(jì)算P(B1?∣Ai?),即這些詞出現(xiàn)情況下,郵件為垃圾郵件的概率,進(jìn)而判斷郵件是否為垃圾郵件。
現(xiàn)實(shí)中,貝葉斯公式等號右邊的概率,可以通過對大數(shù)據(jù)的統(tǒng)計(jì)獲得,當(dāng)有新數(shù)據(jù)到來時(shí),就可以帶入上面的貝葉斯公式計(jì)算其概率,而如果設(shè)定概率超過某個(gè)值就認(rèn)為其會(huì)發(fā)生,那就對這個(gè)數(shù)據(jù)進(jìn)行了分類和預(yù)測,具體過程如下圖所示:
訓(xùn)練樣本就是原始數(shù)據(jù),有時(shí)候原始數(shù)據(jù)并不包含想要計(jì)算的維度數(shù)據(jù),比如想用貝葉斯公式自動(dòng)分類垃圾郵件,那么首先要對原始郵件進(jìn)行標(biāo)注,需要標(biāo)注哪些郵件是正常郵件、哪些郵件是垃圾郵件。這一類需要對數(shù)據(jù)進(jìn)行標(biāo)注才能進(jìn)行的機(jī)器學(xué)習(xí)訓(xùn)練也叫作有監(jiān)督的機(jī)器學(xué)習(xí)。
二、數(shù)據(jù)挖掘:發(fā)掘數(shù)據(jù)間的關(guān)系
5. 數(shù)據(jù)挖掘的典型應(yīng)用場景有搜索排序、關(guān)聯(lián)分析以及聚類。Hadoop大數(shù)據(jù)技術(shù)最早源于Google,而Google使用大數(shù)據(jù)技術(shù)最重要的應(yīng)用場景就是網(wǎng)頁排名。當(dāng)使用Google進(jìn)行搜索時(shí)會(huì)發(fā)現(xiàn),通常在搜索的前三個(gè)結(jié)果里就能找到自己想要的網(wǎng)頁內(nèi)容,而且大概率第一個(gè)結(jié)果就是想要的網(wǎng)頁。而排名越往后,搜索結(jié)果與期望的偏差越大。
那么Google為什么能在十幾萬的網(wǎng)頁中知道最想看的網(wǎng)頁是哪些,然后把這些頁面排到最前面呢?答案是使用了一種叫PageRank的算法,這種算法根據(jù)網(wǎng)頁的鏈接關(guān)系給網(wǎng)頁打分,如果一個(gè)網(wǎng)頁A,包含另一個(gè)網(wǎng)頁B的超鏈接,那么就認(rèn)為A網(wǎng)頁給B網(wǎng)頁投了一票,以下面四個(gè)網(wǎng)頁A、B、C、D舉例,帶箭頭的線條表示鏈接:
B網(wǎng)頁包含了A、D兩個(gè)頁面的超鏈接,相當(dāng)于B網(wǎng)頁給A、D每個(gè)頁面投了一票,初始時(shí)所有頁面都是1分,那么經(jīng)過這次投票后,B給了A和D每個(gè)頁面1/2分(B包含了A、D兩個(gè)超鏈接,所以每個(gè)投票值1/2分),自己從C頁面得到1/3分(C包含了A、B、D三個(gè)頁面的超鏈接,每個(gè)投票值1/3分)。而A頁面則從B、C、D分別得到1/2、1/3、1分,用公式表示就是如下的樣子:
等號左邊是經(jīng)過一次投票后,A頁面的PageRank分值;等號右邊每一項(xiàng)的分子是包含A頁面超鏈接的頁面的PageRank分值,分母是該頁面包含的超鏈接數(shù)目。這樣經(jīng)過一次計(jì)算后,每個(gè)頁面的PageRank分值就會(huì)重新分配,重復(fù)同樣的算法過程,經(jīng)過幾次計(jì)算后,根據(jù)每個(gè)頁面PageRank分值進(jìn)行排序,就得到一個(gè)頁面重要程度的排名表。根據(jù)這個(gè)排名表,將用戶搜索出來的網(wǎng)頁結(jié)果排序,排在前面的通常也正是用戶想要的結(jié)果。
但是這個(gè)算法還有個(gè)問題,如果某個(gè)頁面只包含指向自己的超鏈接,這樣的話其他頁面不斷給它送分,而自己一分不出,隨著計(jì)算執(zhí)行次數(shù)越多,它的分值也就越高,這顯然是不合理的。這種情況就像下圖所示,A頁面只包含指向自己的超鏈接:
Google的解決方案是,設(shè)想瀏覽一個(gè)頁面的時(shí)候,有一定概率不是點(diǎn)擊超鏈接,而是在地址欄輸入一個(gè)URL訪問其他頁面,表示在公式上就是:
上面(1?α)就是跳轉(zhuǎn)到其他任何頁面的概率,通常取經(jīng)驗(yàn)值0.15(即α為0.85),因?yàn)橛幸欢ǜ怕瘦斎氲腢RL是自己的,所以加上上面公式最后一項(xiàng),其中分母4表示所有網(wǎng)頁的總數(shù)。那么對于N個(gè)網(wǎng)頁,任何一個(gè)頁面Pi?的PageRank計(jì)算公式如下:
公式中,Pj?∈M(Pi?)表示所有包含有Pi?超鏈接的Pj?,L(Pj?)表示Pj?頁面包含的超鏈接數(shù),N表示所有的網(wǎng)頁總和。由于Google要對全世界的網(wǎng)頁進(jìn)行排名,所以這里的N可能是一個(gè)萬億級的數(shù)字,一開始將所有頁面的PageRank值設(shè)為1,帶入上面公式計(jì)算,每個(gè)頁面都得到一個(gè)新的PageRank值,再把這些新的PageRank值帶入上面的公式,繼續(xù)得到更新的PageRank值,如此迭代計(jì)算,直到所有頁面的PageRank值幾乎不再有大的變化才停止。
6. 關(guān)聯(lián)分析是大數(shù)據(jù)計(jì)算的重要場景之一。通過數(shù)據(jù)挖掘,商家發(fā)現(xiàn)尿不濕和啤酒經(jīng)常會(huì)同時(shí)被購買,所以商家就把啤酒和尿不濕擺放在一起促進(jìn)銷售。這個(gè)案例曾經(jīng)被質(zhì)疑是假的,因?yàn)闆]有人見過超市把啤酒和尿布放在一起賣。通過觀察京東上的沃爾瑪旗艦店,哈爾濱啤酒下方的六個(gè)店長推薦,兩個(gè)是兒童紙尿褲,還有兩個(gè)兒童奶粉,如下圖所示:
在傳統(tǒng)商超確實(shí)沒有見過把啤酒和紙尿褲放在一起的情況,可能是因?yàn)閭鹘y(tǒng)商超的物理貨架分區(qū)策略限制它沒有辦法這么做,而啤酒和尿不濕存在關(guān)聯(lián)關(guān)系則確實(shí)是大數(shù)據(jù)中存在的規(guī)律,在電商網(wǎng)站就可以輕易進(jìn)行關(guān)聯(lián)推薦。通過商品訂單,可以發(fā)現(xiàn)頻繁出現(xiàn)在同一個(gè)購物車?yán)锷唐烽g的關(guān)聯(lián)關(guān)系,這種大數(shù)據(jù)關(guān)聯(lián)分析也被稱作是“購物車分析”,頻繁出現(xiàn)的商品組合也被稱作是“頻繁模式”。
在深入關(guān)聯(lián)分析前需要先了解兩個(gè)基本概念,一個(gè)是支持度,一個(gè)是置信度。支持度是指一組頻繁模式的出現(xiàn)概率,比如(啤酒,尿不濕)是一組頻繁模式,它的支持度是4%,也就是說在所有訂單中,同時(shí)出現(xiàn)啤酒和尿不濕這兩件商品的概率是4%。置信度用于衡量頻繁模式內(nèi)部的關(guān)聯(lián)關(guān)系,如果出現(xiàn)尿不濕的訂單全部都包含啤酒,那么就可以說購買尿不濕后購買啤酒的置信度是100%;如果出現(xiàn)啤酒的訂單中有20%包含尿不濕,那么就可以說購買啤酒后購買尿不濕的置信度是20%。
電商網(wǎng)站的商品種類和歷史訂單數(shù)據(jù)非常龐大,雖然有大數(shù)據(jù)技術(shù)但是資源依然是有限的,那應(yīng)該從哪里考慮著手,可以使用最少計(jì)算資源找到滿足最小支持度的頻繁模式?找到這種頻繁模式經(jīng)典算法是Apriori算法,它的步驟是:
(1)設(shè)置最小支持度閾值。
(2)尋找滿足最小支持度的單件商品,也就是單件商品出現(xiàn)在所有訂單中的概率不低于最小支持度。
(3)從第2步找到的所有滿足最小支持度的單件商品中,進(jìn)行兩兩組合,尋找滿足最小支持度的兩件商品組合,也就是兩件商品出現(xiàn)在同一個(gè)訂單中概率不低于最小支持度。
(4)從第3步找到的所有滿足最小支持度的兩件商品,以及第2步找到的滿足最小支持度的單件商品進(jìn)行組合,尋找滿足最小支持度的三件商品組合。
(5)以此類推,找到所有滿足最小支持度的商品組合。
Apriori算法極大降低了需要計(jì)算的商品組合數(shù)目,這個(gè)算法的原理是,如果一個(gè)商品組合不滿足最小支持度,那么所有包含這個(gè)商品組合的其他商品組合也不滿足最小支持度。所以從最小商品組合,也就是一件商品開始計(jì)算最小支持度,逐漸迭代,進(jìn)而篩選出所有滿足最小支持度的頻繁模式。通過關(guān)聯(lián)分析,可以發(fā)現(xiàn)看似不相關(guān)商品的關(guān)聯(lián)關(guān)系,并利用這些關(guān)系進(jìn)行商品營銷。
7. 分類算法主要解決如何將一個(gè)數(shù)據(jù)分到幾個(gè)確定類別中的一類里去。分類算法通常需要樣本數(shù)據(jù)訓(xùn)練模型,再利用模型進(jìn)行數(shù)據(jù)分類,那么一堆樣本數(shù)據(jù)又如何知道各自的類別呢?樣本數(shù)據(jù)歸類一方面可以通過人工手動(dòng)打標(biāo)簽,另一方面也可以利用算法進(jìn)行自動(dòng)歸類,即所謂的“聚類”。聚類就是對一批數(shù)據(jù)進(jìn)行自動(dòng)歸類,如下圖這樣的一組數(shù)據(jù),一眼就可以看出可以分為四組:
但是如果這些數(shù)據(jù)不是畫在平面上,而是以二維坐標(biāo)的方式給出的一堆數(shù)據(jù),就不那么容易看出來了。K-means是一種在給定分組個(gè)數(shù)后,能夠?qū)?shù)據(jù)進(jìn)行自動(dòng)歸類即聚類的算法。計(jì)算過程如下圖所示:
(1)隨機(jī)在圖中取K個(gè)種子點(diǎn),圖中K=2,即圖中的實(shí)心小圓點(diǎn)。
(2)求圖中所有點(diǎn)到這K個(gè)種子點(diǎn)的距離,假如一個(gè)點(diǎn)離種子點(diǎn)X最近,那么這個(gè)點(diǎn)屬于X點(diǎn)群。在圖中可以看到A、B屬于上方的種子點(diǎn),C、D、E屬于中部的種子點(diǎn)。
(3)對已經(jīng)分好組的兩組數(shù)據(jù),分別求其中心點(diǎn)。對于圖中二維平面上的數(shù)據(jù),求中心點(diǎn)最簡單暴力的算法就是對同一個(gè)分組中所有點(diǎn)的X和Y坐標(biāo)分別求平均值,得到的<x,y>就是下一個(gè)中心點(diǎn)。
(4)重復(fù)第2步和第3步,直到每個(gè)分組的中心點(diǎn)不再移動(dòng)。這時(shí)候,距每個(gè)中心點(diǎn)最近的點(diǎn)數(shù)據(jù)聚類為同一組數(shù)據(jù)。
K-means算法原理簡單,在知道分組個(gè)數(shù)的情況下效果非常好,是聚類經(jīng)典算法。通過聚類分析可以發(fā)現(xiàn)事物的內(nèi)在規(guī)律:具有相似購買習(xí)慣的用戶群體被聚類為一組,一方面可以直接針對不同分組用戶進(jìn)行差別營銷,線下渠道還可以根據(jù)分組情況進(jìn)行市場劃分;另一方面可以進(jìn)一步分析,比如同組用戶的其他統(tǒng)計(jì)特征還有哪些,并發(fā)現(xiàn)一些有價(jià)值的模式。
上面提到的數(shù)據(jù)挖掘的幾個(gè)典型算法,PageRank算法通過挖掘鏈接關(guān)系,發(fā)現(xiàn)互聯(lián)網(wǎng)網(wǎng)頁的排名權(quán)重;Apriori算法通過購物車分析,發(fā)現(xiàn)商品的頻繁模式;K-means算法則可以進(jìn)行自動(dòng)數(shù)據(jù)聚類,這些算法不需要人工事先對數(shù)據(jù)進(jìn)行標(biāo)注,一般被稱作無監(jiān)督算法。再上面的分類算法需要樣本數(shù)據(jù),而這些樣本數(shù)據(jù)是需要人工進(jìn)行預(yù)先標(biāo)注的,因此分類算法一般都是有監(jiān)督算法。
三、推薦引擎:預(yù)測用戶的喜好
8. 在用戶對自己需求相對明確時(shí),可以用搜索引擎通過關(guān)鍵字搜索方便地找到自己需要的信息。但有些時(shí)候,搜索引擎并不能完全滿足用戶對信息發(fā)現(xiàn)的需求。一方面,用戶有時(shí)候其實(shí)對自己的需求并不明確,期望系統(tǒng)能主動(dòng)推薦一些自己感興趣的內(nèi)容或商品;另一方面,企業(yè)也希望能夠通過更多渠道向用戶推薦信息和商品,在改善用戶體驗(yàn)的同時(shí),提高成交轉(zhuǎn)化率,獲得更多營收。常用的推薦算法有:基于人口統(tǒng)計(jì)的推薦、基于商品屬性的推薦、基于用戶的協(xié)同過濾推薦、基于商品的協(xié)同過濾推薦。
基于人口統(tǒng)計(jì)的推薦是相對比較簡單的一種推薦算法,根據(jù)用戶的基本信息進(jìn)行分類,然后將商品推薦給同類用戶,如下圖所示:
從圖中可以看到,用戶A和用戶C有相近的人口統(tǒng)計(jì)信息,劃分為同類,那么用戶A喜歡(購買過)的商品D就可以推薦給用戶C。基于人口統(tǒng)計(jì)的推薦比較簡單,只要有用戶的基本信息就可以進(jìn)行分類,新注冊的用戶總可以分類到某一類別,那么立即就可以對他進(jìn)行推薦,沒有所謂的“冷啟動(dòng)”問題,也就是不會(huì)因?yàn)椴恢烙脩舻臍v史行為數(shù)據(jù),而不知道該如何向用戶推薦。而且這種推薦算法也不依賴商品的數(shù)據(jù),和要推薦的領(lǐng)域無關(guān),不管是服裝還是美食,不管是電影還是旅游目的地,都可以進(jìn)行推薦,甚至可以混雜在一起進(jìn)行推薦。
當(dāng)然也正因?yàn)檫@種推薦算法比較簡單,對于稍微精細(xì)一點(diǎn)的場景,推薦效果就比較差了。因此,在人口統(tǒng)計(jì)信息的基礎(chǔ)上,根據(jù)用戶瀏覽、購買信息和其他相關(guān)信息,進(jìn)一步細(xì)化用戶的分類信息,給用戶貼上更多的標(biāo)簽,比如家庭成員、婚姻狀況、居住地、學(xué)歷、專業(yè)、工作等,即所謂的用戶畫像,根據(jù)用戶畫像進(jìn)行更精細(xì)的推薦,并進(jìn)一步把用戶喜好當(dāng)做標(biāo)簽完善用戶畫像,再利用更完善的用戶畫像進(jìn)行推薦,如此不斷迭代優(yōu)化用戶畫像和推薦質(zhì)量。
前面一個(gè)算法是基于用戶的屬性進(jìn)行分類,然后根據(jù)同類用戶的行為進(jìn)行推薦。而基于商品屬性的推薦則是將商品的屬性進(jìn)行分類,然后根據(jù)用戶的歷史行為進(jìn)行推薦,如下圖所示:
從圖中可以看到,電影A和電影D有相似的屬性,被劃分為同類商品,如果用戶A喜歡電影A,那么就可以向用戶A推薦電影D,比如給喜歡《星球大戰(zhàn)》的用戶推薦《星際迷航》。一般來說,相對基于人口統(tǒng)計(jì)的推薦,基于商品屬性的推薦會(huì)更符合用戶的口味,推薦效果相對更好一點(diǎn)。
但是基于商品屬性的推薦需要對商品屬性進(jìn)行全面的分析和建模,難度相對也更大一點(diǎn),在實(shí)踐中一種簡單的做法是,提取商品描述的關(guān)鍵詞和商品的標(biāo)簽作為商品的屬性。此外,基于商品屬性的推薦依賴用戶的歷史行為數(shù)據(jù),如果是新用戶進(jìn)來,沒有歷史數(shù)據(jù),就沒有辦法進(jìn)行推薦了,即存在“冷啟動(dòng)”問題。
9. 而基于用戶的協(xié)同過濾推薦是根據(jù)用戶的喜好進(jìn)行用戶分類,常用的就是前面提到的KNN算法,尋找和當(dāng)前用戶喜好最相近的K個(gè)用戶,然后根據(jù)這些用戶的喜好為當(dāng)前用戶進(jìn)行推薦,如下圖所示:
從圖中可以看到,用戶A喜歡商品A、商品B和商品D,用戶C喜歡商品A和商品B,那么用戶A和用戶C就有相似的喜好,可以歸為一類,然后將用戶A喜歡的商品D推薦給用戶C。
基于用戶的協(xié)同過濾推薦和基于人口統(tǒng)計(jì)的推薦都是將用戶分類后,根據(jù)同類用戶的喜好為當(dāng)前用戶進(jìn)行推薦。不同的是,基于人口統(tǒng)計(jì)的推薦僅僅根據(jù)用戶的個(gè)人信息進(jìn)行分類,分類的粒度比較大,準(zhǔn)確性也較差;而基于用戶的協(xié)同過濾推薦則根據(jù)用戶歷史喜好進(jìn)行分類,能夠更準(zhǔn)確地反映用戶的喜好類別,推薦效果也更好一點(diǎn)。例如豆瓣推薦電影,就是基于用戶的協(xié)同過濾進(jìn)行推薦。
基于商品的協(xié)同過濾推薦是根據(jù)用戶的喜好對商品進(jìn)行分類,如果兩個(gè)商品,喜歡它們的用戶具有較高的重疊性,就認(rèn)為它們的距離相近,劃分為同類商品,然后進(jìn)行推薦,如下圖所示:
從圖中可以看到,用戶A喜歡商品A、商品B和商品D,用戶B喜歡商品B、商品C和商品D,那么商品B和商品D的距離最近,劃分為同類商品;而用戶C喜歡商品B,那么就可以為其推薦商品D。商品的分類相對用戶的分類更為穩(wěn)定,通常情況下,商品的數(shù)目也少于用戶的數(shù)目,因此使用基于商品的協(xié)同過濾推薦,計(jì)算量和復(fù)雜度小于基于用戶的協(xié)同過濾推薦。
除了上面這些推薦算法,還有基于模型的推薦,根據(jù)用戶和商品數(shù)據(jù),訓(xùn)練數(shù)學(xué)模型,然后進(jìn)行推薦。前面提到過的關(guān)聯(lián)分析,也可以進(jìn)行推薦。在實(shí)踐中,通常會(huì)混合應(yīng)用多種算法進(jìn)行推薦,特別是大型電商網(wǎng)站,推薦效果每進(jìn)步一點(diǎn),都可能會(huì)帶來巨大的營收轉(zhuǎn)化。
四、機(jī)器學(xué)習(xí)的數(shù)學(xué)原理
10. 所謂的人工智能,在技術(shù)層面很多時(shí)候就是指機(jī)器學(xué)習(xí),通過選擇特定的算法對樣本數(shù)據(jù)進(jìn)行計(jì)算,獲得一個(gè)計(jì)算模型,并利用這個(gè)模型,對以前未曾見過的數(shù)據(jù)進(jìn)行預(yù)測,如果這個(gè)預(yù)測在一定程度上和事實(shí)相符,就認(rèn)為機(jī)器像人一樣具有某種智能,即人工智能。這個(gè)過程和人類的學(xué)習(xí)成長非常類似,也是經(jīng)歷一些事情(獲得樣本數(shù)據(jù)),進(jìn)行分析總結(jié)(尋找算法),產(chǎn)生經(jīng)驗(yàn)(產(chǎn)生模型),然后利用經(jīng)驗(yàn)(模型)指導(dǎo)自己的日常行為,如下圖所示:
機(jī)器學(xué)習(xí)的完整過程也是如此,利用樣本數(shù)據(jù)經(jīng)過算法訓(xùn)練得到模型,這個(gè)模型會(huì)和預(yù)測系統(tǒng)部署在一起,當(dāng)外部需要預(yù)測的數(shù)據(jù)到達(dá)預(yù)測系統(tǒng)的時(shí)候,預(yù)測系統(tǒng)調(diào)用模型,就可以立即計(jì)算出預(yù)測結(jié)果。因此,構(gòu)建一個(gè)機(jī)器學(xué)習(xí)系統(tǒng),需要有三個(gè)關(guān)鍵要素:樣本、模型、算法。
樣本就是常說的“訓(xùn)練數(shù)據(jù)”,包括輸入和結(jié)果兩部分。比如要做一個(gè)自動(dòng)化新聞分類的機(jī)器學(xué)習(xí)系統(tǒng),對于采集的每一篇新聞,能夠自動(dòng)發(fā)送到對應(yīng)新聞分類頻道里面,比如體育、軍事、財(cái)經(jīng)等,這時(shí)候就需要批量的新聞和其對應(yīng)的分類類別作為訓(xùn)練數(shù)據(jù)。通常隨機(jī)選取一批現(xiàn)成的新聞素材就可以,但是分類需要人手工進(jìn)行標(biāo)注,也就是需要有人閱讀每篇新聞,根據(jù)其內(nèi)容打上對應(yīng)的分類標(biāo)簽。在數(shù)學(xué)上,樣本通常表示為:
其中xn?表示一個(gè)輸入,比如一篇新聞;yn?表示一個(gè)結(jié)果,比如這篇新聞對應(yīng)的類別。樣本的數(shù)量和質(zhì)量對機(jī)器學(xué)習(xí)的效果至關(guān)重要,如果樣本量太少,或者樣本分布不均衡,對訓(xùn)練出來的模型就有很大的影響。就像一個(gè)人見得世面少、讀書也少,就更容易產(chǎn)生偏見和刻板印象。
模型就是映射樣本輸入與樣本結(jié)果的函數(shù),可能是一個(gè)條件概率分布,也可能是一個(gè)決策函數(shù)。一個(gè)具體的機(jī)器學(xué)習(xí)系統(tǒng)所有可能的函數(shù)構(gòu)成了模型的假設(shè)空間,數(shù)學(xué)表示是:
其中X是樣本輸入,Y是樣本輸出,f就是建立X和Y映射關(guān)系的函數(shù)。所有f的可能結(jié)果構(gòu)成了模型的假設(shè)空間F。很多時(shí)候F的函數(shù)類型是明確的,需要計(jì)算的是函數(shù)的參數(shù),比如確定f函數(shù)為一個(gè)線性函數(shù),那么f的函數(shù)表示就可以寫為:
這時(shí)候需要計(jì)算的就是a1?和a0?兩個(gè)參數(shù)的值。這種情況下模型的假設(shè)空間的數(shù)學(xué)表示是:
其中θ為f函數(shù)的參數(shù)取值空間,一個(gè)n維歐氏空間,被稱作參數(shù)空間。
11. 算法就是要從模型的假設(shè)空間中尋找一個(gè)最優(yōu)的函數(shù),使得樣本空間的輸入X經(jīng)過該函數(shù)的映射得到的f(X),和真實(shí)的Y值之間的距離最小。這個(gè)最優(yōu)的函數(shù)通常沒辦法直接計(jì)算得到,即沒有解析解,需要用數(shù)值計(jì)算的方法不斷迭代求解。因此如何尋找到f函數(shù)的全局最優(yōu)解,以及使尋找過程盡量高效,就構(gòu)成了機(jī)器學(xué)習(xí)的算法。
如何保證f函數(shù)或者f函數(shù)的參數(shù)空間最接近最優(yōu)解,就是算法的策略。機(jī)器學(xué)習(xí)中用損失函數(shù)來評估模型是否最接近最優(yōu)解,損失函數(shù)用來計(jì)算模型預(yù)測值與真實(shí)值的差距,常用的有0-1損失函數(shù)、平方損失函數(shù)、絕對損失函數(shù)、對數(shù)損失函數(shù)等。以平方損失函數(shù)為例,損失函數(shù)如下:
對于一個(gè)給定的樣本數(shù)據(jù)集:
模型f(X)相對于真實(shí)值的平均損失為每個(gè)樣本的損失函數(shù)的求和平均值:
這個(gè)值被稱作經(jīng)驗(yàn)風(fēng)險(xiǎn),如果樣本量足夠大,那么使經(jīng)驗(yàn)風(fēng)險(xiǎn)最小的f函數(shù)就是模型的最優(yōu)解,即求:
但是相對于樣本空間的可能取值范圍,實(shí)際中使用的樣本量總是有限的,可能會(huì)出現(xiàn)使樣本經(jīng)驗(yàn)風(fēng)險(xiǎn)最小的模型f函數(shù)并不能使實(shí)際預(yù)測值的損失函數(shù)最小,這種情況被稱作過擬合,即一味追求經(jīng)驗(yàn)風(fēng)險(xiǎn)最小,而使模型f函數(shù)變得過于復(fù)雜,偏離了最優(yōu)解。這種情況下,需要引入結(jié)構(gòu)風(fēng)險(xiǎn)以防止過擬合,結(jié)構(gòu)風(fēng)險(xiǎn)表示為:
在經(jīng)驗(yàn)風(fēng)險(xiǎn)的基礎(chǔ)上加上λJ(f),其中J(f)表示模型f的復(fù)雜度,模型越復(fù)雜J(f)越大。要使結(jié)構(gòu)風(fēng)險(xiǎn)最小,就要使經(jīng)驗(yàn)風(fēng)險(xiǎn)和模型復(fù)雜度同時(shí)小,求解模型最優(yōu)解就變成求解結(jié)構(gòu)風(fēng)險(xiǎn)最小值:
上面提到的就是機(jī)器學(xué)習(xí)的數(shù)學(xué)原理:給定模型類型,也就是給定函數(shù)類型的情況下,如何尋找使結(jié)構(gòu)風(fēng)險(xiǎn)最小的函數(shù)表達(dá)式。由于函數(shù)類型已經(jīng)給定,實(shí)際上就是求函數(shù)的參數(shù),各種有樣本的機(jī)器學(xué)習(xí)算法,基本上都是在各種模型的假設(shè)空間上求解結(jié)構(gòu)風(fēng)險(xiǎn)最小值的過程,理解了這一點(diǎn)也就理解了各種機(jī)器學(xué)習(xí)算法的推導(dǎo)過程。
那么為什么機(jī)器學(xué)習(xí)要解偏微分方程?機(jī)器學(xué)習(xí)跟偏微分方程究竟是什么關(guān)系?事實(shí)上,關(guān)系很簡單。機(jī)器學(xué)習(xí)要從假設(shè)空間尋找最優(yōu)函數(shù),而最優(yōu)函數(shù)就是使樣本數(shù)據(jù)的函數(shù)結(jié)果值和真實(shí)值距離最小的那個(gè)函數(shù)。給定函數(shù)模型,求最優(yōu)函數(shù)就是求函數(shù)的參數(shù)值。給定不同參數(shù),得到不同函數(shù)值和真實(shí)值的距離,這個(gè)距離就是損失,損失函數(shù)是關(guān)于模型參數(shù)的函數(shù),距離越小,損失越小。最小損失值對應(yīng)的函數(shù)參數(shù)就是最優(yōu)函數(shù)。
而數(shù)學(xué)上求極小值就是求一階導(dǎo)數(shù),計(jì)算每個(gè)參數(shù)的一階導(dǎo)數(shù)為零的偏微分方程組,就可以算出最優(yōu)函數(shù)的參數(shù)值。這就是為什么機(jī)器學(xué)習(xí)要計(jì)算偏微分方程的原因。
五、從感知機(jī)到神經(jīng)網(wǎng)絡(luò)算法
12. 感知機(jī)是一種比較簡單的二分類模型,將輸入特征分類為+1、-1兩類,就像下圖所示,一條直線將平面上的兩類點(diǎn)分類:
二維平面上的點(diǎn)只有兩個(gè)輸入特征(橫軸坐標(biāo)和縱軸坐標(biāo)),一條直線就可以分類。如果輸入數(shù)據(jù)有更多維度的特征,那么就需要建立同樣多維度的模型,高維度上的分類模型也被稱為超平面。感知機(jī)模型如下:
其中x代表輸入的特征空間向量,輸出空間是{-1, +1},w為權(quán)值向量,b叫作偏置,sign是一個(gè)符號函數(shù),如下所示:
w?x+b=0為超平面的方程,當(dāng)感知機(jī)輸出為+1表示輸入值在超平面的上方,當(dāng)感知機(jī)輸出為-1表示輸入值在超平面的下方。訓(xùn)練感知機(jī)模型就是要計(jì)算出參數(shù)w和b的值,當(dāng)有新的數(shù)據(jù)需要分類的時(shí)候,輸入感知機(jī)模型就可以計(jì)算出+1或者-1從而進(jìn)行分類。由于輸出空間只有{-1, +1}兩個(gè)值,所以只有誤分類的時(shí)候,才會(huì)有模型計(jì)算值和樣本真實(shí)值之間的偏差,偏差之和就是感知機(jī)的損失函數(shù),如下所示:
其中M為誤分類點(diǎn)集合,誤分類點(diǎn)越少,損失函數(shù)的值越小;如果沒有誤分類點(diǎn),損失函數(shù)值為 0。求模型的參數(shù)w和b,就是求損失函數(shù)的極小值。數(shù)學(xué)上求函數(shù)的極小值就是求函數(shù)的一階導(dǎo)數(shù),但是感知機(jī)損失函數(shù)用統(tǒng)計(jì)求和函數(shù)表達(dá),沒辦法計(jì)算解析解。機(jī)器學(xué)習(xí)采用梯度下降法求損失函數(shù)極小值,實(shí)質(zhì)上就是求導(dǎo)過程的數(shù)值計(jì)算方法。對于誤分類點(diǎn)集合M,損失函數(shù)L(w,b)變化的梯度,就是某個(gè)函數(shù)變量的變化引起的函數(shù)值的變化,根據(jù)感知機(jī)損失函數(shù)可知:
使用梯度下降更新w和b,不斷迭代使損失函數(shù)L(w,b)不斷減小,直到為0也就是沒有誤分類點(diǎn)。感知機(jī)算法的實(shí)現(xiàn)過程為如下幾步:
(1)選擇初始值w0?、b0?。
(2)在樣本集合中選擇樣本數(shù)據(jù)xi?, yi?。
(3)如果yi?(w?xi? + b) < 0,表示yi?為誤分類點(diǎn),那么w = w + ηyi?xi?、b = b + ηyi?,在梯度方向校正w和b。其中η為步長,步長選擇要適當(dāng),步長太長會(huì)導(dǎo)致每次計(jì)算調(diào)整太大出現(xiàn)震蕩;步長太短又會(huì)導(dǎo)致收斂速度慢、計(jì)算時(shí)間長。
(4)跳轉(zhuǎn)回第2步,直到樣本集合中沒有誤分類點(diǎn),即全部樣本數(shù)據(jù)yi?(w?xi? + b) ≥ 0。
13. 現(xiàn)在所說的神經(jīng)網(wǎng)絡(luò),通常是指機(jī)器學(xué)習(xí)所使用的“人工神經(jīng)網(wǎng)絡(luò)”,是對人腦神經(jīng)網(wǎng)絡(luò)的一種模擬。人腦神經(jīng)網(wǎng)絡(luò)由許多神經(jīng)元構(gòu)成,每個(gè)神經(jīng)元有多個(gè)樹突,負(fù)責(zé)接收其他神經(jīng)元的輸出信號,神經(jīng)元細(xì)胞完成對輸入信號的處理,轉(zhuǎn)換成輸出信號,通過突觸傳遞給其他神經(jīng)元。神經(jīng)元細(xì)胞的輸出只有0或者1兩種輸出,但是人腦大約有140億個(gè)神經(jīng)元,這些神經(jīng)元組成一個(gè)神經(jīng)網(wǎng)絡(luò),前面的神經(jīng)元輸出作為后面的神經(jīng)元輸入進(jìn)一步處理,如下圖所示:
人腦神經(jīng)元可以通過感知機(jī)進(jìn)行模擬,每個(gè)感知機(jī)相當(dāng)于一個(gè)神經(jīng)元,使用sign函數(shù)的感知機(jī)輸出也是只有兩個(gè)值,跟人腦神經(jīng)元一樣,如下圖所示:
x1?, x2?, x3?相當(dāng)于神經(jīng)元的樹突,實(shí)現(xiàn)信號的輸入;sum() + b及sign函數(shù)相當(dāng)于神經(jīng)元細(xì)胞,完成輸入的計(jì)算;y是神經(jīng)元的輸出,上圖用數(shù)學(xué)形式表達(dá)的樣子如下所示:
它是感知機(jī)y = sign(w?x + b)的向量展開形式。將感知機(jī)組成一層或者多層網(wǎng)絡(luò)狀結(jié)構(gòu),就構(gòu)成了機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),下圖就是一個(gè)兩層神經(jīng)網(wǎng)絡(luò):
在多層神經(jīng)網(wǎng)絡(luò)中,每一層都由多個(gè)感知機(jī)組成。將輸入的特征向量x傳遞給第一層的每一個(gè)感知機(jī),運(yùn)算以后作為輸出傳遞給下一層的每一個(gè)感知機(jī),直到最后一層感知機(jī)產(chǎn)生最終的輸出結(jié)果,這就是機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)過程。以神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)手寫數(shù)字識別為例,樣本如下圖所示:
這個(gè)手寫數(shù)字樣本中的每個(gè)數(shù)字都是一個(gè)28×28像素的圖片,把每個(gè)像素當(dāng)作一個(gè)特征值,這樣每個(gè)數(shù)字就對應(yīng)784個(gè)輸入特征。因?yàn)檩敵鲂枰袆e10個(gè)數(shù)字,所以第二層(輸出層)的感知機(jī)個(gè)數(shù)就是10個(gè),每個(gè)感知機(jī)通過0或者1輸出是否為對應(yīng)的數(shù)字,如下圖所示:
使用梯度下降算法,利用樣本數(shù)據(jù),可以訓(xùn)練神經(jīng)網(wǎng)絡(luò)識別手寫數(shù)字,計(jì)算每個(gè)感知機(jī)的w和b參數(shù)值。當(dāng)所有的感知機(jī)參數(shù)都計(jì)算出來,神經(jīng)網(wǎng)絡(luò)也就訓(xùn)練出來了。這樣對于新輸入的手寫數(shù)字圖片,可以進(jìn)行自動(dòng)識別,輸出對應(yīng)的數(shù)字。
訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候采用一種反向傳播的算法,針對每個(gè)樣本,從最后一層,也就是輸出層開始,利用樣本結(jié)果使用梯度下降算法計(jì)算每個(gè)感知機(jī)的參數(shù),然后以這些參數(shù)計(jì)算出來的結(jié)果作為倒數(shù)第二層的輸出計(jì)算該層的參數(shù)。然后逐層倒推,反向傳播,計(jì)算完所有感知機(jī)的參數(shù)。當(dāng)選擇兩層神經(jīng)網(wǎng)絡(luò)的時(shí)候,原始感知機(jī)的sign函數(shù)表現(xiàn)并不太好,更常用的是sigmoid函數(shù),如下圖所示:
對于兩層以上的多層神經(jīng)網(wǎng)絡(luò),ReLU函數(shù)的效果更好一些。ReLU函數(shù)表達(dá)式非常簡單,如下所示:
y = max(x, 0)
當(dāng)x大于0則輸出x;當(dāng)x小于0則輸出0。神經(jīng)網(wǎng)絡(luò)根據(jù)組織和訓(xùn)練方式的不同有很多類型,當(dāng)神經(jīng)網(wǎng)絡(luò)層數(shù)比較多時(shí),稱它們?yōu)?strong>深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)。
14. 前兩年的的圍棋程序AlphaGo則是一種卷積神經(jīng)網(wǎng)絡(luò),對于一個(gè)19×19的圍棋棋盤,在下棋過程中每個(gè)位置有黑、白、空三種狀態(tài),將其提取為特征就是神經(jīng)網(wǎng)絡(luò)的輸入(事實(shí)上,輸入特征還需要包括氣、眼、吃等圍棋規(guī)則盤面信息),而輸出設(shè)置19×19即361個(gè)感知機(jī)產(chǎn)生對應(yīng)的落子,然后將大量人類的棋譜,即當(dāng)前盤面下的最佳落子策略作為訓(xùn)練樣本,就可以訓(xùn)練出一個(gè)智能下棋的神經(jīng)網(wǎng)絡(luò)。
但是這樣根據(jù)人類棋譜訓(xùn)練得到神經(jīng)網(wǎng)絡(luò)最多就是人類頂尖高手的水平,AlphaGo之所以能夠碾壓人類棋手還依賴一種叫蒙特卡洛搜索樹的算法,對每一次落子以后的對弈過程進(jìn)行搜索,判斷出真正的最佳落子策略。利用蒙特卡洛搜索樹結(jié)合神經(jīng)網(wǎng)絡(luò),AlphaGo還可以進(jìn)行自我對弈,不斷進(jìn)行自我強(qiáng)化,找到近乎絕對意義上的最優(yōu)落子策略。
一般說來,傳統(tǒng)機(jī)器學(xué)習(xí)算法的結(jié)果是可以解釋的,KNN算法的分類結(jié)果為什么是這樣,貝葉斯分類的結(jié)果為什么是這樣,都是可以利用樣本數(shù)據(jù)和算法來解釋的。如果分類效果不好,是樣本數(shù)據(jù)有問題,還是算法過程有問題,也都可以分析出來。但是一般認(rèn)為,神經(jīng)網(wǎng)絡(luò)計(jì)算的結(jié)果是不可解釋的,為什么神經(jīng)網(wǎng)絡(luò)會(huì)分類輸出這樣的結(jié)果,人們無法解釋;輸出結(jié)果不滿意,也無法找到原因,只能不斷嘗試。
總結(jié)
- 上一篇: 新团队团队融合研讨会_行程报告:2020
- 下一篇: 讷于言而敏于行_百度百科