什麼是 K 最近鄰? 用於分類數據的 ML 算法
已發表: 2021-07-19算法驅動機器學習世界。
他們經常因其預測能力而受到稱讚,並被稱為消耗大量數據以產生即時結果的勤奮工作者。
其中,有一種算法經常被標記為惰性。 但在對數據點進行分類時,它的表現相當出色。 它被稱為 k 近鄰算法,經常被引用為最重要的算法之一 機器學習 算法。
什麼是 k 最近鄰算法?
k最近鄰(KNN)算法是一種數據分類方法,用於根據最接近它的數據點所屬的組來估計數據點將成為一個或另一個組的成員的可能性。
k-最近鄰算法是一種 監督機器學習 用於解決分類和回歸問題的算法。 但是,它主要用於分類問題。
KNN 是一種惰性學習和非參數算法。
它被稱為惰性學習算法或惰性學習器,因為在您提供訓練數據時它不執行任何訓練。 相反,它只是在訓練期間存儲數據,不執行任何計算。 在對數據集執行查詢之前,它不會構建模型。 這使得 KNN 非常適合 數據挖掘。
你可知道? KNN 中的“K”是一個參數,用於確定要包含在投票過程中的最近鄰居的數量。
它被認為是一種非參數方法,因為它不對基礎數據分佈做出任何假設。 簡單地說,KNN 試圖通過查看數據點周圍的數據點來確定數據點屬於哪個組。
考慮有兩個組,A 和 B。
為了確定一個數據點是在 A 組還是 B 組中,算法會查看它附近的數據點的狀態。 如果大多數數據點位於 A 組中,則相關數據點很可能位於 A 組中,反之亦然。
簡而言之,KNN 涉及通過查看最近的註釋數據點(也稱為最近鄰)對數據點進行分類。
不要將 K-NN 分類與 K-means 聚類混淆。 KNN 是一種監督分類算法,它根據最近的數據點對新的數據點進行分類。 另一方面,K-means 聚類是一種 無監督 聚類算法,將數據分組到 K 個聚類中。
KNN 是如何工作的?
如上所述,KNN 算法主要用作分類器。 讓我們看看 KNN 如何對看不見的輸入數據點進行分類。
與使用人工神經網絡的分類不同,k-最近鄰分類易於理解且易於實現。 在數據點定義明確或非線性的情況下,這是理想的選擇。
本質上,KNN 執行投票機制來確定未見觀察的類別。 這意味著擁有多數票的類別將成為相關數據點的類別。
如果 K 的值等於 1,那麼我們將僅使用最近鄰來確定數據點的類別。 如果 K 的值等於 10,那麼我們將使用最近的 10 個鄰居,以此類推。
提示:使用機器學習軟件自動執行任務並做出數據驅動的決策。
為了更好地理解這一點,請考慮一個未分類的數據點 X。散點圖中有幾個具有已知類別的數據點 A 和 B。
假設數據點 X 放置在 A 組附近。
如您所知,我們通過查看最近的註釋點對數據點進行分類。 如果 K 的值等於 1,那麼我們將僅使用一個最近鄰來確定數據點的組。
在這種情況下,數據點 X 屬於組 A,因為它的最近鄰居在同一組中。 如果組 A 有超過 10 個數據點並且 K 的值等於 10,則數據點 X 仍然屬於組 A,因為它的所有最近鄰居都在同一組中。
假設另一個未分類的數據點 Y 位於組 A 和組 B 之間。如果 K 等於 10,我們選擇獲得最多票的組,這意味著我們將 Y 分類到它擁有最多鄰居的組。 例如,如果 Y 在 B 組中有 7 個鄰居,在 A 組中有 3 個鄰居,則它屬於 B 組。
無論存在多少類別,分類器分配具有最高票數的類別這一事實是正確的。
您可能想知道如何計算距離度量以確定數據點是否為鄰居。
有四種方法可以計算數據點與其最近鄰之間的距離度量:歐幾里得距離、曼哈頓距離、漢明距離和閔可夫斯基距離。 在這三個中,歐幾里得距離是最常用的距離函數或度量。
K-最近鄰算法偽代碼
Python 和 R 等編程語言用於實現 KNN 算法。 以下是 KNN 的偽代碼:
- 加載數據
- 選擇K值
- 對於數據中的每個數據點:
- 找到所有訓練數據樣本的歐幾里得距離
- 將距離存儲在有序列表中並對其進行排序
- 從排序列表中選擇前 K 個條目
- 根據所選點中存在的大多數類標記測試點
- 結尾
為了驗證 KNN 分類的準確性,一個 混淆矩陣 用來。 其他統計方法,如似然比檢驗也用於驗證。
在 KNN 回歸的情況下,大部分步驟是相同的。 不是分配具有最高票數的類,而是計算鄰居值的平均值並將其分配給未知數據點。
為什麼要使用 KNN 算法?
分類是數據科學和機器學習中的一個關鍵問題。 KNN 是用於模式分類和回歸模型的最古老但準確的算法之一。

以下是可以使用 k-最近鄰算法的一些領域:
- 信用評級: KNN 算法通過將個人與具有相似特徵的信用評級進行比較來幫助確定個人的信用評級。
- 貸款審批:與信用評級類似,k-最近鄰算法有助於通過將個人特徵與相似個人進行比較來識別更有可能拖欠貸款的個人。
- 數據預處理:數據集可能有許多缺失值。 KNN 算法用於估計缺失值的稱為缺失數據插補的過程。
- 模式識別: KNN 算法識別模式的能力創造了廣泛的應用。 例如,它有助於檢測信用卡使用模式並發現異常模式。 模式檢測在識別客戶購買行為模式方面也很有用。
- 股票價格預測:由於 KNN 算法具有預測未知實體價值的能力,因此可用於根據歷史數據預測股票的未來價值。
- 推薦系統:由於 KNN 可以幫助找到具有相似特徵的用戶,因此可以在推薦系統中使用。 例如,它可以用於在線視頻流媒體平台,通過分析相似用戶觀看的內容來建議用戶更有可能觀看的內容。
- 計算機視覺: KNN算法用於圖像分類。 由於它能夠對相似的數據點進行分組,例如,將貓分組在一起,將狗分組在不同的類別中,因此它在幾個方面很有用 計算機視覺 應用程序。
如何選擇K的最優值
沒有確定最佳 K 值的特定方法——換句話說——KNN 中的鄰居數。 這意味著在決定繼續使用哪個值之前,您可能必須嘗試一些值。
一種方法是考慮(或假裝)訓練樣本的一部分是“未知的”。 然後,您可以使用 k 近鄰算法對測試集中的未知數據進行分類,並通過將其與您在訓練數據中已有的信息進行比較來分析新分類的效果。
在處理二分類問題時,最好為 K 選擇一個奇數值。否則,可能會出現每個類中的鄰居數量相同的情況。 此外,K 的值不能是當前類數的倍數。
選擇 K 的最佳值的另一種方法是計算 sqrt(N),其中 N 表示訓練數據集中的樣本數。
但是,具有較低值的 K(例如 K=1 或 K=2)可能會產生噪聲並受到異常值的影響。 在這種情況下,過擬合的可能性也很高。
另一方面,在大多數情況下,具有較大值的 K 會產生更平滑的決策邊界,但不應太大。 否則,具有較少數據點的組將始終被其他組投票。 此外,更大的 K 將在計算上變得昂貴。
KNN的優缺點
使用 KNN 算法最顯著的優勢之一是無需構建模型或調整多個參數。 由於它是惰性學習算法而不是渴望學習者,因此無需訓練模型; 相反,所有數據點都在預測時使用。
當然,這在計算上是昂貴且耗時的。 但是,如果您擁有所需的計算資源,則可以使用 KNN 來解決回歸和分類問題。 儘管有幾種更快的算法可以產生準確的預測。
以下是使用 k-最近鄰算法的一些優點:
- 易於理解且易於實施
- 它可以用於分類和回歸問題
- 它是非線性數據的理想選擇,因為沒有關於基礎數據的假設
- 自然能處理多類案件
- 它可以在具有足夠代表性數據的情況下表現良好
當然,KNN 並不是一個完美的機器學習算法。 由於 KNN 預測器從頭開始計算所有內容,因此它可能不適合大型數據集。
以下是使用 k 近鄰算法的一些缺點:
- 相關的計算成本很高,因為它存儲了所有的訓練數據
- 需要高內存存儲
- 需要確定K的值
- 如果 N 的值很高,則預測很慢
- 對不相關的特徵敏感
KNN 和維度災難
當您手頭有大量數據時,從中提取快速直接的信息可能會非常具有挑戰性。 為此,我們可以使用降維算法,從本質上講,使數據“直截了當”。
“維度的詛咒”一詞可能給人一種直接來自科幻電影的印象。 但這意味著數據的特徵太多了。
如果數據的特徵太多,那麼模型過度擬合的風險很高,導致模型不准確。 太多的維度也使得數據分組變得更加困難,因為數據集中的每個數據樣本看起來彼此之間的距離是等距的。
由於維度災難,k-最近鄰算法極易受到過度擬合的影響。 不過這個問題可以通過 蠻力實施 KNN算法。 但這對於大型數據集是不切實際的。
如果特徵太多,KNN 就不能很好地工作。 因此,必須在數據準備階段執行降維技術,如主成分分析 (PCA)和特徵選擇。
KNN:贏得人心的惰性算法
儘管是算法中最懶惰的,但 KNN 已經建立了令人印象深刻的聲譽,並且是解決多個分類和回歸問題的首選算法。 當然,由於它的惰性,對於涉及大數據集的情況,它可能不是最佳選擇。 但它是最古老、最簡單、最準確的算法之一。
用有限的數據訓練和驗證算法可能是一項艱鉅的任務。 但是有一種方法可以有效地做到這一點。 這稱為交叉驗證,涉及保留一部分訓練數據作為測試數據集。
