03_K近鄰算法

  今天是2020年2月1日星期六,疫情延續,如今確診人數達到了11821例,艱難困苦,玉汝於成,相信國家的力量!你們齊心合力幹一件事,疫情會盡早結束的,武漢加油。前幾天整理感知機算法的內容,發現寫博客這件事情,的確是有利於學習啊,把知識點寫出來,本身內心得對內容十分清楚。動手去作這件事情真的是過重要了,知道作不到等於不知道啊。如今記錄的算是初稿,先把三分之一的內容整理出來,開學再詳細整理,再確認幾遍後,再發表到博客上。反反覆覆的這幾遍,至關於反反覆覆的理解知識點,書讀百遍其義自見,知識點想不明白也該明白了。爭取開學前把監督學習部分的原理講解部分弄完,開學一個月左右的時間完成二次學習整理,堅持下來的話,暑假前完成該書的學習。理想很豐滿~加油~git


 GitHub:https://github.com/wangzycloud/statistical-learning-methodgithub


 K近鄰算法算法

引入學習

  首先K近鄰算法是一種基本的分類與迴歸方法,這裏只討論分類問題中的K近鄰法。顧名思義,近鄰算法要根據某實例點附近的狀況,判斷該實例點的類別,也就是找到該實例點附近的幾個實例,看看它們都屬於什麼類別,而後肯定該實例點所屬的類別。spa

  這是具備實際意義的,舉個感冒病人是否須要輸液的例子,病情嚴重的病人,發熱乏力咳嗽的症狀是嚴重的,病情嚴重的羣體,你們發熱乏力咳嗽的症狀是相似的,具備體溫高的症狀,或者具備流鼻涕的症狀,或者具備咳嗽的症狀,這部分羣體具備類似的特徵;一樣,沒有病情的羣體,各項症狀是正常的,不會有體溫高、咳嗽、乏力這些症狀(在這裏不考慮其它疾病是否致使這些症狀)。那麼,對於一個新的來診人員B,若具備了上述症狀,體溫和須要輸液的患者A同樣高,和患者A一樣具備咳嗽、乏力等症狀。在特徵的表現上,B和A具備了很是高的類似性,那麼,咱們就能夠根據這些類似的症狀,判斷B須要輸液了。對於新的來診人員C,若C不具備體溫高、咳嗽乏力等症狀,和患者A的類似性差距很大,那麼就沒有理由判斷C是一個感冒病人。咱們能夠經過C具備的病症特徵(和哪些病人狀況類似),判斷C患有什麼疾病,屬於什麼分類。3d

  如何衡量「附近」?如何衡量類似性?這叫距離度量。須要找到多少症狀類似的患者?這叫K值的選擇。找到了K個症狀類似的患者,如何判斷新患者的疾病?根據K個病人的症狀判斷新患者的疾病,這叫分類決策規則。blog

  K近鄰法假設給定一個訓練數據集,其中的實例類別已經肯定,將輸入空間的實例點映射到特徵空間,用特徵向量做爲輸入,輸出實例的類別。分類時,根據k個最近鄰的訓練實例的類別,經過多數表決等方式進行預測。遞歸

  能夠看到,K近鄰法不具備顯式的學習過程,其實是對特徵空間的劃分,利用訓練數據,將特徵向量空間劃分爲不一樣子區域,新的實例點根據類似性找到所屬區域,做爲分類的「模型」。接下來將按照書中講述的次序,學習K近鄰算法、模型、三要素及kd樹。get

K近鄰算法博客

  K近鄰算法簡單、直觀。給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例,這K個實例的多數屬於哪一個類,就把該輸入實例劃分到這個類中。

  算法流程圖:

  K=1時,稱爲最近鄰算法,對於輸入的實例點x,將訓練集中最近鄰點的類別做爲x的類別。

K近鄰模型

  上文提到,K近鄰模型實際上對應於特徵空間的劃分,由三個基本要素構成,距離度量、K值的選擇和分類決策規則。K近鄰模型對於一個新的輸入實例,它所屬的類別被惟一的肯定,這至關於根據該實例的特徵表現,將特徵空間劃分爲一些子空間,肯定子空間中每一個實例點所屬的類別。

  在現實場景中,對於要分類的數據,數據與數據之間具備類似性是被分類的依據,物以類聚是指一樣的東西才能聚在一塊兒,相互關聯關係比較近,才能夠被歸爲一類。先把輸入實例映射到特徵空間,找到能夠表徵實例的特徵向量,對每一個訓練實例點x,距離該點比其它點更近的全部點組成一個區域,叫作單元,每一個訓練實例點屬於一個單元,全部單元將特徵空間劃分爲各個子部分,每一個單元中實例點的類別都是肯定的。

1)距離度量

  特徵空間中兩個實例點的距離是兩個實例點類似程度的反映,在特徵空間中,每一個實例點經過特徵向量來表示。好比用二維向量(39.9,5)來表示患者A體溫39.9°,其它症狀明顯,或者四維向量(39.9,是,是,是)來表示患者B體溫39.9°,咳嗽、乏力且打噴嚏。通常狀況下,是須要把輸入空間的數據轉換到特徵空間中,用特徵向量來表示數據。書中提到了Lp距離,這裏咱們經過公式能夠看到,實例點xi與實例點xj之間的LP距離,實際上就是兩個特徵向量,各個份量差的絕對值P次方進行求和,再開P次根。

  接下來看一下書中的距離度量。

  能夠從公式中直觀的看出來,歐氏距離將各個份量差別平方以後求和,再開方,至關於把各個份量差別進行混合,雜糅在一塊兒,將各個份量獨立的差別,經過開根方整合到一塊兒,偏向「和緩」的考慮兩個特徵向量總體的差別;曼哈頓距離則直接將各個份量的差別進行求和,各份量的差別「野蠻」的直接加在一塊兒做爲兩個特徵向量之間的距離;當P等於無窮大時,取各個份量差別的最大值,來表示兩個特徵向量之間的距離。該距離用份量差別最大值表明兩特徵向量距離的方法,提供給咱們度量距離的一種思路:不管歐氏距離仍是曼哈頓距離,各個份量的重要性是同樣的,在現實場景中,不一樣的因素是具備不一樣重要性的。就是說,不一樣份量的差別,在特徵向量距離度量的表示上,應該給不一樣的份量差別賦予不一樣的權重,這樣獲得的兩個實例之間的距離更符合現實場景。例如體溫太高和其它症狀的表現,在衡量兩個患者是否類似的距離上,體溫高這個特徵份量應該比其它症狀更重要一些。

  在圖3.2中,能夠看到p=1的菱形直線上,橫軸到原點的距離加縱軸到原點的距離,始終爲1;在p=2的圓形上,能夠發現半徑r=1,其實就是橫軸縱軸勾股定理的斜邊;在p=∞的正方形直線上,要取到橫軸、縱軸差別的最大值,與原點距離爲1就要選擇最外的正方形。書中的例3.1說明了由不一樣的距離度量所肯定的最近鄰點是不一樣的。

2)K值的選擇

  K值的選擇會對近鄰法的結果產生重大影響,書中解釋的很詳細。表面上來講,K值的大小決定了多數表決時選取的最近鄰個數,K值小,須要選取的鄰居少,預測實例點僅與少數距離最近的實例點有關,這就會致使預測結果對近鄰的實例點很是敏感,若是鄰近的實例點恰巧是噪點,預測就會出錯,致使過擬合。K=1時爲最鄰近法,只取最鄰近的一個實例點進行判斷,預測的結果只取決於一個相近實例點(全部雞蛋都放在了一個籃子裏),判斷出錯的概率很是大。

  K值大,就至關於從更多的近鄰實例點中進行多數表決,這就避免了全部雞蛋放在同一個籃子裏,減小了噪點對預測的影響,預測結果須要從多個實例中得出。可是,距離較遠差距大的實例點也會對預測起做用,這會間接致使判斷出錯。K=N時,不管輸入實例是什麼,都將簡單的預測它屬於訓練集中實例最多的類。

  在實際應用中,K值的選擇一般經過交叉驗證法來選取最優的K值,通常是一個比較小的數值。

3)分類決策規則

  K近鄰法中的分類決策規則每每是多數表決,即由K個近鄰的訓練實例中的多數類決定輸入實例的類別,也就是說最近鄰10個患者中,須要輸液的有7我的,3我的不須要輸液,那麼新的來診人員判斷爲須要輸液(取多數的類別)。書中對多數表決規則作了簡單的數學解釋,用來講明多數表決規則等價於經驗風險最小化。

  這裏以0-1損失爲例,經過第三個公式,咱們能夠看出,咱們要想讓誤分類率減少,就要選擇多數實例的類做爲預測,在公式右端,若選擇少數實例的類別,該值小,左端誤分類率將增大。

K近鄰法的實現:kd樹

  經過上述的學習,咱們能夠發現K近鄰法主要考慮的問題,是如何在訓練數據集中找到距離新實例點最近的K個鄰近實例點,訓練數據量越多,特徵向量的維度越大,尋找最近的K個鄰近點就越複雜。最簡單的方法是進行線性掃描,這時要計算每一個訓練數據點與輸入實例的距離,數據量大時,計算很是耗時。爲了提升K近鄰的搜索效率,能夠考慮採用特殊的結構來存儲訓練數據,從而減小計算量,好比說kd樹算法。

  Kd樹是一種對n維空間進行劃分,並將分割超平面上的實例點進行存儲,以便對其進行快速檢索的二叉樹。構造kd樹至關於不斷的用垂直於座標軸的超平面將n維空間切分,構成一系列包含每一個結點的n維超矩形區域。

  Kd樹的構造能夠結合二叉搜索樹的知識點去理解,既然結合二叉樹的存儲結構,那麼就應該是採用二分的思想來方便查找過程。一維的狀況下,二叉搜索樹的思想是首先構造根節點,它是近鄰法查找時的第一個實例點,應該具備必定的表明性,在數據的分佈上,儘可能居中,以根節點爲中心分爲左右兩個子空間,遞歸進行構造。從二叉搜索樹中,咱們知道,整個二叉搜索樹方便查找的關鍵是根節點的選取,也就是中間切分點的選擇很是重要。

  在kd樹的構造中,一樣是經過遞歸的方法,不斷的選取合適的根節點,用超平面將n維空間劃分爲左右子空間,區別在於根節點的選取,根節點除了中位數的要求外,還要考慮不一樣維度的信息,本書中的算法,是將各個維度按順序循環考慮,如有兩個維度,在二叉樹的第一層上,先用第一個維度上各個數值的中位點做爲根節點劃分爲左右子空間;在遞歸的過程當中,二叉樹的第二層,是選取左右子樹的根節點,這時的根節點是從第二個維度的各個數值中選取中位點;二叉樹的第三層根節點,按維度順序循環從第一個維度上選取子樹數據集的中位點;二叉樹的第四層根節點,按維度順序循環再次從第二個維度上選取,接下來的各層根節點依此類推。

  特徵空間爲二維時,是用直線將特徵空間劃分爲矩形子區域,特徵空間爲三維及高維時,用超平面將特徵空間劃分爲超矩形區域,遞歸進行劃分,直到子區域內沒有實例時終止。在算法3.2中,有兩個地方能夠改進:第一點,經過中位點選取切分點構造的kd樹是平衡的,但搜索效率未必是最優的;第二點,按維度順序循環選取切分點進行劃分未必是最優的,能夠依據不一樣維度上數據的分佈規律來決定當前層選取切分點採用哪一個維度?可深刻

  算法流程圖:

  書中以二維特徵向量舉例,也就是特徵空間是一個二維平面,用直線將各個子空間劃分開,劃分的過程獲得存儲實例點的二叉樹結構,二叉樹的每層根節點,按照維度順序循環做爲切分點的選取來源。

搜索kd樹

  Kd樹能夠省去對大部分數據點的搜索,從而減小搜索的計算量,以最近鄰舉例加以描述。給定一個目標點,搜索其最近的鄰居,首先依次選取維度,按照二分查找的思想找到包含目標點的葉節點;而後從該葉節點出發,逆序退回父節點;在退回路徑上,不斷查找與目標點最鄰近的節點,回退到根節點肯定不可能存在更近的節點時終止。

  在kd樹搜索算法中,若是實例點是隨機分佈的,kd樹搜索的平均計算複雜度爲O(logN),N是訓練實例數,kd樹適用於訓練實例數遠大於空間維數時的k近鄰搜索,當特徵向量維度大,也就是特徵空間維數接近訓練實例數時,效率迅速降低。

  算法流程圖:

 

  示例:

  從示例圖中能夠看出,包含目標點的葉節點對應包含目標點的矩形區域,以此爲葉節點的實例點做爲當前最近點,目標點的最近鄰必定在以目標點爲中心並經過當前最近點的圓形內部。回退到當前節點的父節點,若是父節點的另外一子節點的矩形區域與該圓形相交,那麼須要在相交的區域內再次尋找與目標點更近的實例點,若是在相交區域內找到了更近的實例點,則將此點做爲新的當前最近點;算法繼續向更上一級父節點回退,繼續上述過程,直到找到最近的實例點;若是父節點的另外一節點的矩形區域與該圓形不相交,那該矩形區域內,確定不存在更近的實例點;算法回退到根節點,直到不存在比當前最近點更近的實例點時,中止搜索。

相關文章
相關標籤/搜索