Python機器學習實戰 —— KNN算法詳解

2021-02-19 Python愛好者社區

作者:數據取經團——Monke

數據取經團(公眾號:zlx19930503)

專注R、Python數據分析挖掘、可視化、機器學習

走了很多彎路,看了很多風景,才發現,想要好好學算法,還是要一行一行敲代碼,於是有了這個系列。

這個系列按照機器學習實戰的章節來寫,由於市面上已經有很多同類的文章,一般以介紹算法,貼代碼,舉例子為主,個人讀下來,覺得對於實現的代碼還是不能有很好的理解,所有有了這個系列。要寫這個系列還有三個原因:

實戰的代碼是Python2的,有一些用法已經在python3中不支持了,以後的系列都以pyhton3完成,遇到python2不支持的坑,會進行一下對比

有一些初級的函數在初學階段是需要積累的,孤立的去記憶比較費時費力,所以一邊學算法的實現,一邊把遇到的一些函數的用法記錄下來~

遇到有趣的pythonic的表達,記錄分享出來,做知識積累。

鄰近算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類算法是數據挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。平常生活中我們都會下意識的運用到我們的判斷中,比如富人區和窮人區,判斷一個人是富人還是窮人根據他的朋友的判斷,就是運用了kNN的思想。

KNN是通過測量不同特徵值之間的距離進行分類。它的的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。K通常是不大於20的整數。KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
在KNN中,通過計算對象間距離來作為各個對象之間的非相似性指標,避免了對象之間的匹配問題,在這裡距離一般使用歐氏距離:

歐氏距離

或曼哈頓距離

曼哈頓距離

歐式距離和曼哈頓距離都是閔可夫斯基距離(Minkowski Distance)$p=2$和$p=1$的特例,定義為:

閔可夫斯基距離

本節主要參考劉建平Pinard的博文K近鄰法(KNN)原理小結,劉建平Pinard的博文對每個算法有很深刻的見解,一般在看不懂李航的《統計學習方法》的時候,去看劉大大的博客會有豁然開朗的感覺。他博文中提到scikit-learn裡只使用了蠻力實現(brute-force),KD樹實現(KDTree)和球樹(BallTree)實現,所以他的這篇文章中只討論這幾種算法的實現原理。其餘的實現方法比如BBF樹,MVP樹等沒有做討論,需要對算法有更深一步了解的童鞋,移步劉建平Pinard的文章~

這一部分主要是參考實戰,然後主要講解一些具體的實現~
下面的代碼為運行程序導入所需要的庫

from numpy import *
import operator

下面的程序主要實現了生成測試數據的功能

def createDataSet():
   group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
   labels = ['A','A','B','B']
   return group,labels
group,labels = createDataSet()

輸出:

In [2]:group
Out[2]: array([[ 1. ,  1.1],
      [ 1. ,  1. ],
      [ 0. ,  0. ],
      [ 0. ,  0.1]])

In [3]: labels
Out[3]: ['A', 'A', 'B', 'B']

下面的代碼主要實現了利用knn分類的功能

def classify0(inX,dataSet,labels,k):
   dataSetSize = dataSet.shape[0]
   #tile 擴展矩陣的函數
   diffMat = tile(inX,(dataSetSize,1))-dataSet
   sqdiffMat = diffMat**2
   sqDistances = sqdiffMat.sum(axis = 1)
   distances = sqDistances**0.5
   sortedDistIndicies = distances.argsort()
   print(sortedDistIndicies)
   classCount={}
   for i in range(k):
       voteLabels = labels[sortedDistIndicies[i]]
       #dict.get  獲取指定鍵的值,默認返回none,鍵值不存在時,不同於dict['key']直接返回error,也可以指定,下面指定為0
       classCount[voteLabels] = classCount.get(voteLabels,0)+1
   print(classCount)
   #Python3.5中:iteritems變為items(python2   classCount.iteritems())
   #items可以輸出dict中的(key,value)
   #sorted中的key參數傳入函數,operator.itemgetterr函數獲取的不是值,而是定義了一個函數,通過該函數作用到對象上才能獲取值。
   #operator.itemgetter(1) 為獲取classCount.items()中的第二個參數
   sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
   print(sortedClassCount)
   return sortedClassCount[0][0]

In [7]: classify0([0,0.2],group,labels,2)
[3 2 1 0]
{'B': 2}
[('B', 2)]
Out[6]: 'B'

argsort函數

argsort()函數是將x中的元素從小到大排列,提取其對應的index(索引),然後輸出到y。
輸出是按照從小到大的順序輸出的
例子:

import numpy as np
a = np.array([2,0,4,1,2,4,5])
a.argsort()

輸出為a從小到大排序後的index:

Out[12]: array([1, 3, 0, 4, 2, 5, 6], dtype=int64)

輸出為list的index,提取出來就是list從小到大的排序

排序解釋dict.get vs dict[『key』]

a = {'name': 'wang'}

dict[『key』]輸出

a['age']
Out[16]: KeyError: 'age'

dict.get輸出:

a.get('age')
a.get('age', 10)
Out[17]: 10

dict[『key』]只能獲取存在的值,如果不存在則觸發KeyError
而dict.get(key, default=None)則如果不存在則返回一個默認值,如果設置了則是設置的,否則就是None

Python中sort 和 sorted函數

a = [1,2,1,4,3,5]
a.sort()
aOut[18]: [1, 1, 2, 3, 4, 5]

sort函數改變了a的順序

a = [1,2,1,4,3,5]
sorted(a)
aOut[19]: [1, 2, 1, 4, 3, 5]

sorted未改變a的順序

sorted函數

list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
sorted(list1,cmp = lambda x,y: cmp(x[0],y[0]))
TypeError: 'cmp' is an invalid keyword argument for this function

sorted(list1,key = lambda list1: list1[0])
Out[23]: [('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]

list1[0]表示用list中的第一個元素排序

sorted(list1,key = lambda list1: list1[1])
Out[24]: [('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

list1[1]表示用list中的第二個元素排序

三道sorted面試題

1)key函數的運用

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]
sorted(students,key=lambda s: s[2]) #按照年齡來排序

2)多個字符的排序

『asdf234GDSdsf23』這是一個字符串排序,排序規則:小寫<大寫<奇數<偶數

s = 'asdf234GDSdsf23'  #排序:小寫-大寫-奇數-偶數
#解法1:
print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x))))
Out[25]: addffssDGS33224
#解法2:
print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isupper(),x.isdigit() and int(x) % 2 == 0,x))))
Out[26]: addffssDGS33224

解釋:

Boolean 的排序會將 False 排在前,True排在後 . 

1.x.isdigit()的作用是把數字放在後邊,字母放在前邊.

2.x.isdigit() and int(x) % 2 == 0的作用是保證奇數在前,偶數在後。

3.x.isupper()的作用是在前面基礎上,保證字母小寫在前大寫在後.

4.最後的x表示在前面基礎上,對所有類別數字或字母排序。

若不進行第四步,每個內部是未排序的,但是整體順序是按照要求排序的

print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isupper(),x.isdigit() and int(x) % 2 == 0))))
Out[27]: asdfdsfGDS33242

3) 特殊需求的排序

list1=[7, -8, 5, 4, 0, -2, -5]

要求1.正數在前負數在後 2.整數從小到大 3.負數從大到小

#解法1:
sorted(list1,key = lambda x:(x<0,x<0 and -x,x))
Out[28]:  [0, 4, 5, 7, -2, -5, -8]
解法2:
sorted(list1,key=lambda x:(x<0,abs(x)))
Out[29]: [0, 4, 5, 7, -2, -5, -8]

講完這幾個函數,對照機器學習實戰的原始碼,理解和實現kNN算法就是手到擒來了~小編也是第一次嘗試這樣的寫作風格,有任何意見和想法請及時和小編聯繫,小編會繼續努力噠~

K近鄰法(KNN)原理小結

Python中sort 和 sorted函數

李航. 統計學習方法[M]. 清華大學出版社, 2012.

周志華. 機器學習 : = Machine learning[M]. 清華大學出版社, 2016.

哈林頓李銳. 機器學習實戰 : Machine learning in action[M]. 人民郵電出版社, 2013.

Python愛好者社區歷史文章大合集

Python愛好者社區歷史文章列表(每周append更新一次)

福利:文末掃碼立刻關注公眾號,「Python愛好者社區」,開始學習Python課程:

關注後在公眾號內回復課程即可獲取:

0.小編的Python入門視頻課程!!!

1.崔老師爬蟲實戰案例免費學習視頻。

2.丘老師數據科學入門指導免費學習視頻。

3.陳老師數據分析報告製作免費學習視頻。

4.玩轉大數據分析!Spark2.X+Python 精華實戰課程免費學習視頻。

5.丘老師Python網絡爬蟲實戰免費學習視頻。

相關焦點

  • Sk-learn之KNN算法綜合實戰
    前面幾篇文章我們通過幾個小案例熟悉了在Python中使用sklearn模塊來用做機器學習項目的一般步驟,並通過機器學習中最簡單的KNN算法進行演示。本次機器學習的任務就是歸納各項檢測信息與標籤值M/B的對應關係建立模型來預測。2.
  • 機器學習第二篇:詳解KNN算法
    本篇介紹機器學習眾多算法裡面最基礎也是最「懶惰」的算法——KNN(k-nearest neighbor)。04|算法步驟:收集數據:找尋待訓練的文本數據。準備數據:利用python解析文本文件。分析數據:對數據進行一些統計分析,有個基本的認識。訓練算法:KNN沒有這一步,這也是為何被稱為最懶算法的原因。
  • 機器學習實戰之KNN算法
    本系列教程為《機器學習實戰首先,講講寫本系列教程的原因:第一,《機器學習實戰》的代碼由Python2編寫,有些代碼在Python3上運行已會報錯,本教程基於Python3進行代碼的修訂;第二:之前看了一些機器學習的書籍,沒有進行記錄,很快就忘記掉了,通過編寫教程也是一種複習的過程;第三,機器學習相對於爬蟲和數據分析而言,學習難度更大,希望通過本系列文字教程,讓讀者在學習機器學習的路上少走彎路。
  • 聚類(三):KNN算法(R語言)
    k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
  • python機器學習預測分析核心算法.pdf
    AI項目體驗地址 https://loveai.tech《Python機器學習 預測分析核心算法》內容簡介  在學習和研究機器學習的時候,面臨令人眼花繚亂的算法,機器學習新手往往會不知所措。本書從算法和Python語言實現的角度,幫助讀者認識機器學習。
  • 「人工智慧核心之機器學習(2)」——python 實現 KNN
    歡迎大家關注公眾號【哈希大數據】1、KNN算法基本介紹K-Nearest Neighbor(k最鄰近分類算法),簡稱KNN,是最簡單的一種有監督的機器學習算法。也是一種懶惰學習算法,即開始訓練僅僅是保存所有樣本集的信息,直到測試樣本到達才開始進行分類決策。
  • 【新書】python+tensorflow機器學習實戰,詳解19種機器學習經典算法
    《Python TensorFlow機器學習實戰》通過開發實例和項目案例,詳細介紹TensorFlow開發所涉及的主要內容。書中的每個知識點都通過實例進行通俗易懂的講解,便於讀者輕鬆掌握有關TensorFlow開發的內容和技巧,並能夠得心應手地使用TensorFlow進行開發。
  • R語言--鄰近算法KNN
    ❝KNN(k鄰近算法)是機器學習算法中常見的用於分類或回歸的算法。它簡單,訓練數據快,對數據分布沒有要求,使它成為機器學習中使用頻率較高的算法,並且,在深度學習大行其道的今天,傳統可解釋的簡單模型在工業大數據領域的應用更為廣泛。本文介紹KNN算法的基本原理和用R代碼實現。
  • 機器學習:基於Knn算法的用戶屬性判斷方案設計
    本文作者通過Knn算法進行了一次用戶判斷預測的流程,文章為作者根據自身經驗所做出的總結,希望通過此文能夠加深你對Knn算法的認識。knn算法簡介K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。
  • 機器學習之KNN分類算法介紹: Stata和R同步實現(附數據和代碼)
    1 KNN算法原理KNN作為機器學習中的常見算法,同時適用於分類和回歸。1.1 分類算法原理這裡x和y代表兩個樣本觀測值向量,表示x樣本的第i個特徵變量i的具體取值,表示y樣本第i個特徵變量的具體取值。KNN分類算法原理:某個對象的分類結果由其最近的N(通常是1到5)個鄰居決定,也叫「vote,投票表決」。即K個最近的鄰居中,頻數最高的類別,就認為是我們要考慮的那個對象的類別。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(6套課程) 資料庫操作(1套課程) python高級編程
  • 【白話機器學習】算法理論+實戰之AdaBoost算法
    寫在前面如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等無監督算法:聚類,降維,關聯規則, PageRank等為了詳細的理解這些原理
  • 機器學習實戰
    想快速入門機器學習領域的童鞋還等什麼?!看小編介紹的這個課程就可以啦!!
  • Python機器學習課程(代碼與教程)
    >https://github.com/machinelearningmindset/machine-learning-course目錄簡介這個項目的目的是提供一個全面但簡單的用python完成機器學習的教程。
  • 機器學習之KNN檢測惡意流量
    近年來,隨著基礎設施的完善,海量大數據的積累,機器學習方法理論越來越成熟,算力的大幅度提升,網際網路企業也越來越願意增大在AI領域的投入,AI的優勢在於處理海量數據提取捕獲其中有用信息上發揮著非常重要的作用,如OCR領域圖片鑑黃、自然語言處理方面的惡意言論捕獲、風控領域畫像、推薦系統等。
  • 25本《Python+TensorFlow機器學習實戰》免費包郵到家!
    ,依次擊破重難點很圖示:書中包括113張圖解說明,方便讀者理解很實用:囊括文本識別、語音識別、圖形識別、人臉認識等很實戰:31個實例、13個案例,詳解TensorFlow機器學習內容介紹      本書通過開發實例和項目案例,詳細介紹TensorFlow 開發所涉及的主要內容。
  • 算法基礎:五大排序算法Python實戰教程
    | George Seif翻譯 | 鄧普斯傑弗校對 | shunshun 整理 | 菠蘿妹原文連結:https://medium.com/@george.seif94/a-tour-of-the-top-5-sorting-algorithms-with-python-code
  • KNN算法中的K有多重要
    K-最近鄰(KNN)是一種有監督的機器學習算法,可用於解決分類和回歸問題。它基於一個非常簡單的想法,數據點的值由它周圍的數據點決定。考慮的數據點數量由k值確定。因此,k值是算法的核心。KNN分類器根據多數表決原則確定數據點的類別。如果k設置為5,則檢查5個最近點的類別。也可以根據多數類進行回歸預測,同樣,KNN回歸取5個最近點的平均值。
  • 機器學習實戰(15.2):Apriori算法示例
    在前一章我們了解了Apriori算法。它可以通過尋找物品的不同組合,找到頻繁項以及頻繁項之間的關聯,今天為大家帶來的是Apriori算法的實際應用示例。我們會通過一個從毒蘑菇中尋找相似特徵的示例來看Apriori算法是如何發現頻繁項以及找到他們的關聯關係的。
  • sklearn:Python語言開發的通用機器學習庫
    scikit-learn是Python語言開發的機器學習庫,一般簡稱為sklearn,目前算是通用機器學習算法庫中實現得比較完善的庫了。其完善之處不僅在於實現的算法多,還包括大量詳盡的文檔和示例。其文檔寫得通俗易懂,完全可以當成機器學習的教程來學習。如果要說sklearn文檔的重要性,個人覺得,應該可以與佛經中的《金剛經》相比。