從零開始:用Python實現KNN算法

2021-02-20 Python程式設計師

Python部落(python.freelycode.com)組織翻譯,歡迎轉發,禁止轉載

k-Nearest Neighbors算法(簡稱KNN算法)的邏輯很簡單,它易於理解和實現,是你可以使用的有力工具。

通過學習這個教程,你將能夠用Python從0開始實現一個KNN算法。這個實現主要用來處理分類問題,我們將使用鳶尾花分類問題來演示這個例子。

這個教程的學習要求是你能夠使用Python編碼,並且對實現一個KNN算法感興趣。



什麼是k-Nearest Neighbors?

KNN的模型是整個訓練數據集。當我們需要預測一個新實例的某個屬性A時,KNN算法會搜索訓練數據集找到K個最相似的實例。這些相似實例的A屬性會被總結歸納,作為新實例A屬性的預測。

如何判斷實例之間的相似程度,這需要具體看數據的類型。對於實數數據,我們可以使用歐式距離。對於分類或者二進位數據,我們可以使用漢明距離。

對於回歸問題,可以使用預測值的平均值。對於分類問題,可以返回最普遍的一類。

KNN算法是如何工作的?

KNN算法屬於基於實例的、競爭學習與懶惰學習算法。

基於實例的算法是算法模型使用數據實例(或者說數據行),並依據這些實例做出預測的算法。KNN算法是基於實例算法中的一個極端例子,因為所有的訓練數據都成了算法模型的一部分。

它是一個競爭學習邏輯,因為它內部使用模型元素(數據實例)之間的競爭來作出預測。數據實例之間的相似性計算導致每一個數據實例都競爭去「贏」,或者說競爭去和需要預測的元素相似,再或者說競爭為預測結果做貢獻。

說它是懶惰學習算法是因為一直到需要進行預測操作了,它才會建立一個預測模型,它總是最後需要出結果的時候才開始幹活。

它的優勢是只有跟需要預測元素相似的數據實例才會其作用,可以稱之為一個局部模型。劣勢是計算成本很高,因為它在一個很大的訓練集上重複做著相似的搜索。

最後,KNN很有用,因為它不對數據做任何的假設,同時使用一致的規則在任意兩個數據實例之間計算距離。也因為如此,它被稱作非參數,或者非線性算法,因為它沒有假設一個模型函數。

使用測量來分類花朵

本教程使用的練習問題是分類鳶尾花。

已有的數據集由對3個不同品種的鳶尾花的150組觀察數據組成。對於這些花有4個測量維度:萼片長度、萼片寬度、花瓣長度、花瓣寬度,所有的數值都以釐米為單位。需要預測的屬性是品種,品種的可能值有:清風藤、雲芝、錦葵。

我們有一個標準數據集,在這個數據集中品種是已知的。我們可以把這個數據集切分成訓練數據集和測試數據集,然後用測試結果來評估算法的準確程度。在這個問題上,好的分類算法應該有大於90%的正確率,通常都會達到96%甚至更高。

你可以從https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data 免費下載這個數據集,在資源那一段有更多的說明。


如何用Python實現KNN

這個教程把實現步驟分為如下6布。

處理數據:從CSV中讀取數據,並把它們分割成訓練數據集和測試數據集。

相似度:計算兩個數據實例之間的距離。

臨近:確定最相近的N個實例。

結果:從這些實力中生成預測結果。

準確度:總結預測的準確度。

主程序:把這些串起來

1、處理數據

我們要做的第一件事是加載我們的數據文件。數據文件是CSV格式的,並且沒有標題行和備註。我們可以使用open方法打開文件,並用csv模塊讀取數據:


接下來我們要把數據集切分成用來做預測的訓練數據集和用來評估準確度的測試數據集。

首先,我們要把加載進來的特徵數據從字符串轉換成整數。然後我們隨機地切分訓練數據集和測試數據集。訓練數據集數據量/測試數據集數據量的比值取67/33是一個常用的慣例。

把這些邏輯放在一起,我們得到下面這個函數loadDataset:


把鳶尾花的CSV數據文件下載到本地文件夾,我們就可以測試一下我們的函數了,測試代碼如下:


2、相似度

為了作出預測,我們需要計算兩個數據實例之間的相似度。有了計算相似度的函數,我們後面才能獲取最相似的N個實例來做出預測。

因為有關花的四個測量維度的數據都是數字形式的,並且具有相同的單位。我們可以直接使用歐式距離來測量。歐式距離就是兩列數中對應數做差的平方和,之後再開方。(類似於二維平面的距離公式,擴展到多維)。

另外,我們要確定哪些維度參與計算。在這個問題裡,我們只需要包含測量好的4個維度,這4個維度放在數組的前幾個位置。限制維度的一個辦法就是增加一個參數,告訴函數前幾個維度需要處理,忽略後面的維度。

把這些邏輯放在一起,得到計算歐式距離的函數:


我們可以用一些假數據來測試這個函數,像這樣:


3、鄰近元素

現在我們有了相似度計算的方法,我們可以獲取跟需要預測數據最接近的N個數據實例了。

最直接的方法就是計算待預測數據到所有數據實例的距離,取其中距離最小的N個。

這個邏輯可以由下面函數表示:


我們可以像下面這樣測試這個函數


4、結果

接下來的任務就是基於最近的幾個實例來得到預測結果了。

我們可以讓這些近鄰元素來對預測屬性投票,得票最多的選項作為預測結果。

下面這個函數實現了投票的邏輯,它假設需預測的屬性放在數據實例(數組)的最後。


我們可以用一些測試數據測試一下:


如果投票結果是平局,這個函數還是返回了一個預測結果。不過你可以有你自己的處理方式,比如平局時返回None,或者平局時隨機選擇一個結果。

5、準確度

做預測的部分已經都寫完了,接下來是評估這個算法的準確度。

一個簡單的評估方法是,計算在測試數據集中算法正確預測的比例,這個比例叫分類準確度。

下面這個函數可以計算分類準確度。


我們可以用下面這個例子來測試它:


6、主程序

好了,我們已經有了這個算法需要的所有函數,剩的就是把它們串起來了。

下面是完整的代碼:



運行這個程序,你就會看到每個預測數據和實際數據的對比。在程序的最後,你能看到這個預測模型的準確度。在這個例子中,準確度略高於98%。

有關擴展的想法

這一部分我們講講一些對本教程給出的Python代碼的做擴展的想法。

回歸:你可以調整代碼,讓這個算法能夠處理一些回歸問題(預測一個實數屬性)。比如總結近鄰實例的時候,採用預測屬性的平均值或者中值。

歸一化:當不同屬性之間單位不同時,某些屬性在決定距離時可能會獲得很大的權重。對於這類問題,你可能需要在計算之前把各個屬性的值都縮放到0-1之間(這個過程叫歸一化)。你可以改進這個算法讓它支持數據歸一化。

可更換距離計算方法:其實有很多其他的距離計算方法,你甚至可以自己開發一個距離計算方法。實現一個替換的距離計算方法,比如曼哈頓距離,或者向量的點積。

你可以發掘更多擴展的邏輯。比如投票的時候不同距離的實例有不同的權重,或者你可以用一個樹形結構來進行最近實例的搜索。

英文原文:http://machinelearningmastery.com/tutorial-to-implement-k-nearest-neighbors-in-python-from-scratch/

譯者:詩書塞外


了解野狗,請點擊閱讀原文。

相關焦點

  • 「人工智慧核心之機器學習(2)」——python 實現 KNN
    歡迎大家關注公眾號【哈希大數據】1、KNN算法基本介紹K-Nearest Neighbor(k最鄰近分類算法),簡稱KNN,是最簡單的一種有監督的機器學習算法。也是一種懶惰學習算法,即開始訓練僅僅是保存所有樣本集的信息,直到測試樣本到達才開始進行分類決策。
  • 從零開始用Python實現k近鄰算法(附代碼、數據集)
    這些分析有很強的洞察力,並且直接關係到實現路徑。在本文中,我們將討論另一種被廣泛使用的分類技術,稱為k近鄰(KNN)。本文的重點主要集中在算法的工作原理以及輸入參數如何影響輸出/預測。目錄什麼情況下使用KNN算法?KNN算法如何工作?如何選擇因子K?
  • KNN算法(三)-sklearn實現
    上篇講到KNN算法的實例。在python中sklearn庫可直接實現KNN算法。本篇介紹運用sklearn庫實現KNN算法。
  • 聚類(三):KNN算法(R語言)
    k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
  • Sk-learn之KNN算法綜合實戰
    前面幾篇文章我們通過幾個小案例熟悉了在Python中使用sklearn模塊來用做機器學習項目的一般步驟,並通過機器學習中最簡單的KNN算法進行演示。   好了,我們開始本次的學習。這一次我們用一個癌症預測的數據集來做一個完整的項目。1. 導入數據並查看import numpy as npimport pandas as pddf = pd.read_csv('.
  • 小白學數據:教你用Python實現簡單監督學習算法
    監督學習算法會從數據集中學習得出訓練樣本和其目標變量之間的關係,然後將學習到的關係對新樣本(未被標記的樣本)進行分類。為了闡明監督學習的工作原理,我們用根據學生學習時間預測其考試成績的例子來說明。為了獲得更高的精度,最好的方法是測試多個不同的算法,同時,對每個算法嘗試不同的參數。可以通過交互檢驗選擇最好的算法和參數。對於給定問題,在選取算法時,算法的精度、訓練時間、線性、參數數目以及特殊情況都要考慮在內。
  • Python機器學習實戰 —— KNN算法詳解
    這個系列按照機器學習實戰的章節來寫,由於市面上已經有很多同類的文章,一般以介紹算法,貼代碼,舉例子為主,個人讀下來,覺得對於實現的代碼還是不能有很好的理解,所有有了這個系列。要寫這個系列還有三個原因:實戰的代碼是Python2的,有一些用法已經在python3中不支持了,以後的系列都以pyhton3完成,遇到python2不支持的坑,會進行一下對比有一些初級的函數在初學階段是需要積累的,孤立的去記憶比較費時費力,所以一邊學算法的實現,一邊把遇到的一些函數的用法記錄下來~遇到有趣的pythonic的表達,記錄分享出來,做知識積累。
  • R語言實現K最近鄰算法(KNN)
    例如西紅柿和四季豆之間的距離為:d(西紅柿,四季豆)=√(6−3)2+(4−7)2=4.2d(西紅柿,四季豆)=(6−3)2+(4−7)2=4.2根據以上算法,我們分別計算了西紅柿和葡萄、四季豆、堅果、橙子之間的距離,分別是2.2、4.2、3.6、1.4。我們發現西紅柿和橙子之間的距離最短,那麼我們據此認為西紅柿是一種水果。
  • 標籤傳播算法(Label Propagation)及Python實現
    那F裡面有個YU,它一開始是不知道的,那最開始的值是多少?無所謂,隨便設置一個值就可以了。千呼萬喚始出來,簡單的LP算法如下:1)執行傳播:F=PF2)重置F中labeled樣本的標籤:FL=YL3)重複步驟1)和2)直到F收斂。步驟1)就是將矩陣P和矩陣F相乘,這一步,每個節點都將自己的label以P確定的概率傳播給其他節點。
  • 送你一份Python算法的打怪升級路線圖 | 用 Python 實現各種常用算法
    對程式設計師來說,算法的重要性不言而喻,算法基礎是否紮實,間接決定了你是月薪5000,還是月薪50000。實驗樓上線了一門免費的Python算法入門課——【用 Python 實現各種常用算法】,主要包括兩部分內容:一是各種算法的基本原理講解,二是各種算法的代碼實現,內容由淺入深,非常適合剛入門Python的同學學習。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    4最基礎的分類算法-k近鄰算法 knn 5線性回歸法 6梯度下降法 7PCA與梯度上升法 8多項式回歸與模型泛化 9邏輯回歸 10評價分類結果 11支撐向量機 svm 12決策樹 13集成學習與隨機森林 14更多機器學習算法 2
  • 圖像識別之KNN算法的理解與應用
    本文首先講解KNN算法的原理,接著講解Opencv中的KNN算法模塊,然後再使用Opencv中的KNN算法模塊對手寫數字圖像進行識別。KNN算法主要包含以下幾個要素:1. 訓練樣本。訓練樣本就是預先準備好的數據集,該數據集必須包含所有可能的數據類別,而且數據集中的每個數據都有一個唯一的標籤,用來標識該數據所屬的類別。
  • 機器學習第二篇:詳解KNN算法
    我們在k值選擇的時候也可以用交叉驗證這種方法。2、距離的度量我們在評判人與人之間的關係遠近的時候沒有一個量化的關係,只會用一些詞去形容兩個人之間關係的遠近,比如閨蜜(發小)》舍友》同學。但在統計學習中我們評判兩者的遠近關係的時候是有一個可以量化的東西,這裡我們用的是歐式距離。歐式距離又稱歐幾裡得距離,是指在m維空間中,兩個點之間的真實距離。
  • 機器學習(二)-------KNN算法的sklearn KNN實踐
    上次介紹了KNN的基本原理,以及KNN的幾個竅門,這次就來用sklearn實踐一下KNN算法。
  • R語言--鄰近算法KNN
    ❝KNN(k鄰近算法)是機器學習算法中常見的用於分類或回歸的算法。它簡單,訓練數據快,對數據分布沒有要求,使它成為機器學習中使用頻率較高的算法,並且,在深度學習大行其道的今天,傳統可解釋的簡單模型在工業大數據領域的應用更為廣泛。本文介紹KNN算法的基本原理和用R代碼實現。
  • KNN算法中的K有多重要
    K-最近鄰(KNN)是一種有監督的機器學習算法,可用於解決分類和回歸問題。它基於一個非常簡單的想法,數據點的值由它周圍的數據點決定。考慮的數據點數量由k值確定。因此,k值是算法的核心。KNN分類器根據多數表決原則確定數據點的類別。如果k設置為5,則檢查5個最近點的類別。也可以根據多數類進行回歸預測,同樣,KNN回歸取5個最近點的平均值。
  • 如何從零開始學Python
    如何從零開始學python?書聲琅琅教育番茄老師介紹,零基礎的朋友學python相對來講難度要大,但是很多python大牛都是從零基礎上來的,對於這些python大牛來講,參加合理的培訓指導和有一套python學習路線是分不開的,有目標有計劃的學習才能更加高效。
  • 數據驅動優化:如何利用 KNN 算法驅動產品優化?
    在網際網路行業中常常有利用數據分析或者數據挖掘的結論來應用到產品中,驅動產品的優化,提升產品的各項KPI 指標, 在數據挖掘和數據分析的背後會涉及到一些數據挖掘或者機器學習的算法。本文主要是knn算法原理的介紹,以及在它在網際網路行業中的具體應用,後續會介紹這個算法的具體實現(R 語言和python 語言)。
  • Python 算法基礎班 | 從零開始學Python!
    從零學習Python,算法和數據結構轉專業找CS工作的小夥伴有一些編程基礎,但算法基礎薄弱的同學想要從事人工智慧的同學國內TOP1名校畢業,資深Java工程師,5年Java與Android開發經驗,現在從事人工智慧,有豐富深度學習項目開發經驗。如何從零基礎開始在最短的時間內拿到offer?
  • 常見面試算法:k-近鄰算法原理與python案例實現
    k 近鄰算法的輸入為實例的特徵向量,對應於特徵空間的點;輸出為實例的類別,可以取多類。k 近鄰算法假設給定一個訓練數據集,其中的實例類別已定。分類時,對新的實例,根據其 k 個最近鄰的訓練實例的類別,通過多數表決等方式進行預測。因此,k近鄰算法不具有顯式的學習過程。k 近鄰算法實際上利用訓練數據集對特徵向量空間進行劃分,並作為其分類的「模型」。