機器學習的過程:從本質上來講,就是經過一堆的訓練數據找到一個與理想函數(f)相接近的函數。算法
在理想狀況下,對於任何適合使用機器學習的問題,在理論上都是會存在一個最優的函數讓每一個參數都有一個最合適的權重值,但在現實應用中不必定能這麼準確得找到這個函數。因此,咱們要去找與這個理想函數相接近的函數。只要是可以知足咱們的使用的函數,咱們就認爲是一個好的函數。編程
這個訓練數據的過程一般也被解釋爲:網絡
在一堆的假設函數(Hypothesis set)中,它是包含了各類各樣的假設,其中包括好的和壞的假設。框架
咱們須要作的就是:從這一堆假設函數中挑選出它認爲最好的假設函數(g)——這個假設函數是與理想函數(f)最接近的。機器學習
機器學習這個過程就像是:在數學上,咱們知道了有一個方程和一些點的座標,用這些點來求這個方程的未知項從而得出完整的方程。函數
但在機器學習上,咱們每每很難解出來這個完整的方程是什麼。因此,咱們只能經過各類手段求最接近理想狀況下的未知項取值,使得這個結果最接近本來的方程。學習
機器學習不是萬能的,並不能解決全部的問題。翻譯
經過以上機器學習的過程能夠看出來,實質上,機器學習是:經過已知經驗找到規律來進行預測。3d
銀行想知道應該發放多少貸款給某個客戶時,能夠根據過往成功放貸的數據找出每一個貸款區間的人羣特色、自身的房車資產情況等,再看看這個客戶的特色符合哪一個區間,以此去肯定應該發放多少貸款,這就是適合用機器學習去解決的問題。rest
對於適合用機器學習解決的問題,臺大的林軒田教授爲咱們總結了三個要素:
只要知足這三個條件的問題,咱們均可以挑選合適的算法去解決。
基於以上的條件,一般咱們能夠用機器學習解決三類問題:
感知機學習算法是一種二分類的線性分類算法,通常用來解決二分類(只存在兩個結果)的問題。
例如:判斷「一個同窗的考試成績合格仍是不合格?」、「銀行會不會給某個客戶發放貸款?」等。
這種只存正、負兩個結果的問題,就稱爲二分類的問題。
感知機學習算法的原理很是好理解,有點相似考試的概念:
把不少個影響因素當作每道題的得分。由於不一樣題目的權重不一樣,因此咱們每道題的得分由權重(重要程度)和這個因素的得分相乘,最後把全部題目的得分加起來看看有沒有超過60分(閾值)。若是超過了就是及格了(正結果),即對應的輸出值爲1,若是沒有超過就是不及格(負結果),對應的輸出值爲-1。
仍是以剛纔銀行貸款的例子來解釋:
一般銀行判斷在「給不給某個客戶放貸款?」時,都是已經掌握了客戶的各類信息(如:年薪、負債狀況、社保繳費、公積金等等)。
由於數據的維度不一樣,描述的單位也不一樣,咱們須要把這些數據按照各自維度的標準統一成能夠量化的評分——能夠按照年薪在5W如下得1分、5-10W得2分這樣的方式進行量化。
每一個維度的重要程度都不一樣,因此咱們在相加的時候須要考慮爲每一個值加上一個權重,再看看最後得出來的結果有沒有高過放款的閾值評分——若是高過這個分數就放款,低過這個分數就不放款。
首先看看關於感知機的數學定義:
咱們能夠轉換到幾何的方式去看這個問題:
在二維空間內,訓練的數據就變成了平面上的一個點,這些數據裏面有正樣本以及負樣本(成功放貸款的以及沒有放貸款的)。
感知機算法的學習過程就是:找到一個平面(在二維中表現爲一條線)——可以把全部的正樣本和負樣本區分開來。那麼,當在應用的時候面對新來的客戶,經過模型算出是正結果,咱們就能夠給這個客戶發放貸款;算出來是負結果,咱們就不發放貸款。
怎麼去找到這條線(超平面)呢?
感知機使用的學習策略是「梯度降低法」。
這種方法的思想是:先在平面內隨便找一條線,而後開始把樣本點放到平面內。當一個點被誤分類——即位於分類超平面錯誤的一側時,調整模型的參數(w和b),使分類超平面向該誤分類點的一側移動,以減小該誤分類點與超平面的距離,直到超平面越過該誤分類點使其被正確分類爲止。
感知機利用梯度降低法的訓練過程
這種方式對於模型的訓練很是快速,計算量相對較小。
但同時,這樣的計算方式追求最大程度正確劃分、最小化訓練數據的錯誤,效果相似下圖的直線——會致使比較容易形成過擬合的狀況,即:模型對於新數據的包容性差,會過分地把新輸入數據分紅錯誤的類別。
講邏輯迴歸以前,咱們先講講「什麼是線性迴歸?」。
在統計學中,線性迴歸是指:利用稱爲線性迴歸方程的最小平方函數,對一個或多個自變量和因變量之間關係進行建模的一種迴歸分析。
舉個直觀的例子:深圳春運時的客流量多是與過年的時間相關的——越接近過年這天人流量越大。
以下圖所示:
若是客運站想預測:明天和後天的客流量。
該這麼辦?
咱們能夠用一條線去儘可能準的擬合這些數據,若是有新的數據輸入進來,咱們就能夠找到對應的預測點:
上述例子就是一個最簡單的一元線性迴歸分析:y=ax+b。
該式子中只包括一個自變量和一個因變量,且兩者的關係可用一條直線近似表示。在收集的數據中,每個份量,就能夠看作一個特徵數據。
例如:上述例子的日期是一個特徵,咱們還能夠找到地區、節假日、其餘車站的客流量等等不一樣的因素,每一個特徵至少對應一個未知的參數。這樣就造成了一個線性模型函數。
當特徵變多時,上述線性迴歸的向量表示形式爲:
這個矩陣方程因爲計算量太大很難直接去求解,那麼咱們要怎麼樣去找到這根線的位置呢?
在這裏咱們能夠退一步,把參數求解的問題,轉化爲求最小偏差的問題,讓實際值與預測值之間的偏差變得最小,那麼咱們的預測值就十分接近實際值了。
這就是損失函數的來源。在機器學習的算法中,實際上存在大量因爲計算量巨大從而沒法求解的問題。咱們都是把這類問題轉化成求最小偏差,即:實際值與預測值之間的偏差(損失)問題,想辦法求出讓偏差最小的狀況,就能夠獲得問題的最優解。
線性迴歸方程的損失函數一般是經過最小二乘法,或者梯度降低法進行求解,在這裏咱們不展開敘述。
線性迴歸是目前運用最普遍的模型之一,在金融、經濟學、醫學等領域經常用來解決預測類問題。
經過觀測數據集擬合出一個預測模型,咱們就能夠知道:一組特定數據是否在一段時間內會增加或降低?
邏輯迴歸實際上也是一個線性迴歸模型,可是線性迴歸經常用來作預測,邏輯迴歸卻經常用來解決二分類問題。
爲何會有這麼大的差別呢?
若是對於上面的感知機算法來講,目標是爲了找到一個可以將正負樣本徹底分開的超平面的話,從另一個層面看感知機算法就至關因而一個躍階函數。
咱們只須要找到閾值,而且拿輸入的數據去對比,得出數據是大於仍是小於這個閾值,而後就能給出的就是0或1(正/負樣本)的反饋。
對應到數學模型上:咱們只須要把算出來的結果映射到這個躍階函數上看看大於0仍是小於0,就能說他是一個正樣本仍是負樣本。
感知器的模型雖然簡單直觀,但問題在於這個模型不夠光滑。
若是一個新的樣本點咱們計算出來結果等於0.01——只是比0大了一點點,就被分類爲正樣本,這樣在實際應用的時候就可能會不夠準確。同時,這個函數在0處有一個躍階致使這一點不連續,在數學上也很差處理。
那麼有沒有什麼方法可讓這個函數更光滑一點呢?
在數學上恰好存在一個sigmoid函數有這樣的特性。
這個函數的輸入範圍是「−∞→+∞」,而值域則光滑地分佈在0到1之間。
對於這個模型的解釋和感知機也稍微有些區別。
感知機:是根據輸入的條件,判斷是一個正樣本仍是負樣本。
而邏輯迴歸由於值域分佈在0到1之間的特性,因此輸出的是判斷是:一個正樣本或負樣本的機率是多少?
咱們的學習策略便是:求全部訓練樣本的條件機率之積的最大值——也能夠理解爲求機率之積儘量大,這樣模型預測的效果就會越準確。
邏輯迴歸的本質上是一個線性迴歸模型,只是在特徵到結果的映射中加入了一層函數映射——即先把特徵線性求和,而後使用函數g(z)將最爲假設函數來預測。
咱們看到的參數z,實際上也是一個線性迴歸的方程,只不過在這裏符號化表示。實際上求解的方式與線性迴歸是相同的——都是要經過損失函數的方式逼近最優解。
邏輯迴歸的目的是:將樣本分紅0或1兩類。
可是,咱們也關心樣本分類的準確性。
例如:一個腫瘤被預測出來是惡性的,咱們也會關心它是惡性的可能性有多大?
對邏輯迴歸的理解也能夠是:咱們經過幾率將樣本分紅了0和1兩類。
由於邏輯迴歸不像感知機——經過一個固定的閥值去判斷樣本數據的正負性,因此在二維平面上也再也不是經過一條直線去判斷數據。而是變得更加有包容性,能夠把一些不能線性區分的數據集區分開來。
其根本緣由就是:sigmoid函數把因變量和自變量變成了曲線的關係,使得在函數在二維平面上的表現更爲柔和。這裏面損失函數發揮了很大的做用,這裏再也不展開說明。
邏輯迴歸與感知機相比,有三方面的優點:
邏輯迴歸算法因其是如今最普遍使用的算法之一,經常用於尋找某一疾病的危險因素、我的信用評估、貸款/金融意圖預測等等領域。
同時,也能夠用來對數據作自動判別分析,好比:一條評論是正面仍是負面?一個用戶的購買路徑是男性仍是女性?預測用戶會不會購買某種商品?等等。
邏輯迴歸應用普遍仍是由於它的模型與許多現實問題相吻合,可以幫助咱們快速解決不少實際的問題。
上面咱們說到,感知機以及邏輯迴歸實際上都是一種二分類算法,非黑即白。
那,若是遇到多分類問題該如何解決呢?
有一種很是簡單的算法能夠幫助咱們快速解決這個問題——K近鄰分類算法。
K近鄰分類算法是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。
用官方的解釋來講:所謂K近鄰算法,即存在一個樣本數據(訓練樣本)集,而且樣本中每一個數據都存在標籤(類別)——也就是說樣本集中每個數據都被分到一個類別中。輸入新的數據後,將新數據的每一個特徵與樣本集中的數據對應的特徵進行比較,而後算法提取樣本集中特徵最類似的數據的分類標籤,便可覺得新輸入的數據進行分類。
在訓練數據集中找到與該實例最鄰近的K個實例, 若是這K個實例的大多數都屬於同一個分類,就把該輸入實例分類到這個類中。
通常狀況下,咱們只選擇樣本集中前K個最類似的數據,這就是K近鄰算法中k的出處(一般K是不大於20的整數)。
好比:比較3個最近的數據,那麼K=3。
最後,選擇K個最類似的數據中出現次數最多的分類,做爲新數據的分類。
這種思想實際上也很是好理解,有點像「人以類聚,物以羣分」的說法——若是你身邊的鄰居都來自同一個公司,那麼你極有可能也屬於某個公司;若是你身邊的朋友絕大多數都屬於某個學校畢業,那麼你極有可能也曾經在這個學校讀過書。
這種方式也很相似投票機制,新來的數據與舊數據相比對,多數都屬於某個類別時,採用少數服從多數的原則,給新數據歸類。
一樣,咱們轉化到幾何的方式去看這個算法,KNN能夠當作:有那麼一堆你已經知道分類的數據,而後當一個新數據進入的時候,就開始跟已知數據裏的每一個點求距離,而後挑離這個訓練數據最近的K個點看看這幾個點屬於什麼類型,就把這個新的點歸到這個同屬大多數的類別裏。
K近鄰分類算法的優缺點都很是明顯。
優勢主要有兩個方面:
缺點則是:計算複雜度比較高。
由於要算新數據與每個臨近點的距離,當維度超過二維時這就是一個空間複雜度很大的矩陣。
基於KNN算法的特色,目前主要應用在文本分類與商品推薦等場景。
在文本分類中像信息檢索、手寫字識別、機器翻譯這樣的場景均可以使用KNN算法以保證在有限的硬件資源下,提供給用戶一個高效的檢索系統。
貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理和特徵條件獨立假設爲基礎,故統稱爲貝葉斯分類。
而樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。
樸素貝葉斯的簡單之處在於:對於給出的待分類項,求解在此待分類項出現的條件下各個類別出現的機率。哪一個機率最大,就認爲此待分類項屬於哪一個類別。
這就有點像咱們走在街上,迎面走過來一個黑色皮膚的人,那咱們就猜他是非洲人,由於黑人中非洲人最多。
經過上述例子咱們能夠看到:咱們判斷一我的是非洲人基於一個很關鍵的信息,由於他是黑色皮膚的人。因此,咱們的判斷其實是發生在「擁有黑色皮膚」這件事的狀況下咱們的推斷。
這種在其餘已知事件發生的基礎上去計算某件事發生的機率叫作「條件機率」。通常咱們使用貝葉斯定理求解條件機率。
要搞懂貝葉斯定理以前,咱們首先要搞懂「什麼是正向機率?」和「什麼是反向(條件)機率?」。
在貝葉斯研究以前, 人們已經可以計算正向機率。
好比:「假設袋子裏有N個白球M個黑球,你伸手進去摸一把,摸出黑球的機率有多大?」。
然而在咱們實際生活中,平常能觀察到的只是事物表面的結果——每每咱們只知道從袋子裏取出來的球是什麼顏色,並不能看到袋子裏的實際狀況。這時候咱們就但願有一些方法能夠經過觀察這些取出來的球的顏色,能夠推測出袋子裏面黑白球的比例是什麼樣的。
咱們經過下圖簡單講一下貝葉斯定理的組成:
樸素貝葉斯分類器的核心在於訓練模型階段——須要計算每一個類別在訓練樣本中的出現頻率,以及每一個特徵屬性劃分對每一個類別的條件機率估計,並將結果記錄。
這一階段是機械性階段,根據前面討論的公式能夠由程序自動計算完成。
讓咱們經過一個貝葉斯分類器解決拼寫檢查/糾正的例子加深理解:
當一個用戶輸入了一個不在字典中的單詞時,咱們須要去猜想:這我的到底想要輸出的單詞是什麼呢?若是用戶輸出了一個theu,那麼他究竟是想輸入they仍是then?到底哪一個猜想的可能性更大?
這個問題其實是在求「已知輸入theu的狀況下,咱們猜想他想輸出they\then的機率誰更大?」
用上述符號表示即:P(B|A)。
咱們能夠很容易計算出they\then單詞的詞頻P(B),那麼要怎麼獲得P(A|B)呢?
在這裏能夠用輸入單詞與正確單詞在鍵盤上的距離來表示P(A|B)——即經過字母在鍵盤上的距離判斷:下輸入哪一個字母的可能性更高?
好比:在鍵盤上,Y和U離得更近,因此咱們會認爲要輸入Y可是不當心按成了U的機率更大一些。
經過上述的信息就能夠計算出輸出哪一個單詞的機率更大。
樸素貝葉斯分類器的如下優勢:
除了上述說到的拼寫糾正之外,貝葉斯分類器還常常被用在垃圾郵件分類、文字廣告過濾、識別惡性評論等等領域。
在許多場景下,樸素貝葉斯分類算法能夠與後續講到的決策樹、神經網絡算法相媲美,並且方法簡單、分類準確率高、速度快。但這個算法也有一些像對輸入數據的形式比較敏感、計算先驗機率時的分類決策可能存在錯誤這樣的缺點,在使用的時候仍是要根據具體的場景選擇。
以上簡單介紹了關於機器學習的一些算法,最後,感謝一下個人同行好友中翹。