欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python機器學(xué)習(xí)k-近鄰算法(K Nearest Neighbor)實例詳解

 更新時間:2018年06月25日 10:48:35   作者:Eric Chan  
這篇文章主要介紹了Python機器學(xué)習(xí)k-近鄰算法(K Nearest Neighbor),結(jié)合實例形式分析了k-近鄰算法的原理、操作步驟、相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下

本文實例講述了Python機器學(xué)習(xí)k-近鄰算法。分享給大家供大家參考,具體如下:

工作原理

存在一份訓(xùn)練樣本集,并且每個樣本都有屬于自己的標(biāo)簽,即我們知道每個樣本集中所屬于的類別。輸入沒有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應(yīng)的特征進(jìn)行比較,然后提取樣本集中與之最相近的k個樣本。觀察并統(tǒng)計這k個樣本的標(biāo)簽,選擇數(shù)量最大的標(biāo)簽作為這個新數(shù)據(jù)的標(biāo)簽。

用以下這幅圖可以很好的解釋kNN算法:

不同形狀的點,為不同標(biāo)簽的點。其中綠色點為未知標(biāo)簽的數(shù)據(jù)點?,F(xiàn)在要對綠色點進(jìn)行預(yù)測。由圖不難得出:

  • 如果k=3,那么離綠色點最近的有2個紅色三角形和1個藍(lán)色的正方形,這3個點投票,于是綠色的這個待分類點屬于紅色的三角形。
  • 如果k=5,那么離綠色點最近的有2個紅色三角形和3個藍(lán)色的正方形,這5個點投票,于是綠色的這個待分類點屬于藍(lán)色的正方形。

kNN算法實施

偽代碼

對未知屬性的數(shù)據(jù)集中的每個點執(zhí)行以下操作

1. 計算已知類型類別數(shù)據(jù)集中的點與當(dāng)前點之間的距離
2. 按照距離遞增次序排序
3. 選取與當(dāng)前點距離最小的k個點
4. 確定前k個點所在類別的出現(xiàn)頻率
5. 返回前k個點出現(xiàn)頻率最高的類別作為當(dāng)前點的預(yù)測分類

歐式距離(計算兩點之間的距離公式)

計算點x與點y之間歐式距離

python代碼實現(xiàn)

# -*- coding:utf-8 -*-
#! python2
import numpy as np
import operator
# 訓(xùn)練集
data_set = np.array([[1., 1.1],
           [1.0, 1.0],
           [0., 0.],
           [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
def classify_knn(in_vector, training_data, training_label, k):
  """
  :param in_vector: 待分類向量
  :param training_data: 訓(xùn)練集向量
  :param training_label: 訓(xùn)練集標(biāo)簽
  :param k: 選擇最近鄰居的數(shù)目
  :return: 分類器對 in_vector 分類的類別
  """
  data_size = training_data.shape[0] # .shape[0] 返回二維數(shù)組的行數(shù)
  diff_mat = np.tile(in_vector, (data_size, 1)) - data_set # np.tile(array, (3, 2)) 對 array 進(jìn)行 3×2 擴(kuò)展為二維數(shù)組
  sq_diff_mat = diff_mat ** 2
  sq_distances = sq_diff_mat.sum(axis=1) # .sum(axis=1) 矩陣以列求和
  # distances = sq_distances ** 0.5 # 主要是通過比較求最近點,所以沒有必要求平方根
  distances_sorted_index = sq_distances.argsort() # .argsort() 對array進(jìn)行排序 返回排序后對應(yīng)的索引
  class_count_dict = {} # 用于統(tǒng)計類別的個數(shù)
  for i in range(k):
    label = training_label[distances_sorted_index[i]]
    try:
      class_count_dict[label] += 1
    except KeyError:
      class_count_dict[label] = 1
  class_count_dict = sorted(class_count_dict.iteritems(), key=operator.itemgetter(1), reverse=True) # 根據(jù)字典的value值對字典進(jìn)行逆序排序
  return class_count_dict[0][0]
if __name__ == '__main__':
  vector = [0, 0] # 待分類數(shù)據(jù)集
  print classify_knn(in_vector=vector, training_data=data_set, training_label=labels, k=3)

運行結(jié)果:B

算法評價

  • 優(yōu)點:精度高、對異常值不敏感、無數(shù)據(jù)輸入假定
  • 缺點:計算復(fù)雜度高、空間復(fù)雜度高
  • 使用數(shù)據(jù)范圍:數(shù)據(jù)型和標(biāo)稱型
  • 適用:kNN方法通常用于一個更復(fù)雜分類算法的一部分。例如,我們可以用它的估計值做為一個對象的特征。有時候,一個簡單的kNN算法在良好選擇的特征上會有很出色的表現(xiàn)。

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • 如何將Python代碼轉(zhuǎn)化為可執(zhí)行的程序

    如何將Python代碼轉(zhuǎn)化為可執(zhí)行的程序

    在Python中,將代碼轉(zhuǎn)成可以執(zhí)行的程序需要安裝庫pyinstaller,如果是Windows用戶,打開Anaconda?Prompt輸入相對應(yīng)代碼,下面小編給大家詳細(xì)講解如何將Python代碼轉(zhuǎn)化為可執(zhí)行的程序,感興趣的朋友一起看看吧
    2024-03-03
  • conda下載各種包時如何避免版本不匹配問題

    conda下載各種包時如何避免版本不匹配問題

    在使用python和conda時,由于Python版本不匹配,可能會導(dǎo)致一些問題的出現(xiàn),本文主要介紹了conda下載各種包時如何避免版本不匹配問題,感興趣的可以了解一下
    2024-03-03
  • python爬蟲使用scrapy注意事項

    python爬蟲使用scrapy注意事項

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲使用scrapy注意事項的相關(guān)文章,對此有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • Python教程之類型轉(zhuǎn)換詳解

    Python教程之類型轉(zhuǎn)換詳解

    Python?定義了類型轉(zhuǎn)換函數(shù)以將一種數(shù)據(jù)類型直接轉(zhuǎn)換為另一種數(shù)據(jù)類型,這在日常和競爭性編程中很有用,本文將和大家一起詳細(xì)聊聊Python中的類型轉(zhuǎn)換
    2022-08-08
  • OpenCV2.3.1+Python2.7.3+Numpy等的配置解析

    OpenCV2.3.1+Python2.7.3+Numpy等的配置解析

    這篇文章主要介紹了OpenCV2.3.1+Python2.7.3+Numpy等的配置解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • pandas.DataFrame的for循環(huán)迭代的實現(xiàn)

    pandas.DataFrame的for循環(huán)迭代的實現(xiàn)

    本文主要介紹了pandas.DataFrame的for循環(huán)迭代的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 詳解Django中CSRF和CORS的區(qū)別

    詳解Django中CSRF和CORS的區(qū)別

    本文主要介紹了詳解Django中CSRF和CORS的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python進(jìn)階之高級用法詳細(xì)總結(jié)

    Python進(jìn)階之高級用法詳細(xì)總結(jié)

    今天帶各位小伙伴學(xué)習(xí)一下Python高級語法,主要有Lambda表達(dá)式,map函數(shù),filter函數(shù),reduce函數(shù),三大推導(dǎo)式等,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-05-05
  • python中的deque基本用法詳解

    python中的deque基本用法詳解

    Python?中的?deque是一個低級別的、高度優(yōu)化的雙端隊列,對于實現(xiàn)優(yōu)雅、高效的Pythonic隊列和堆棧很有用,這篇文章主要介紹了python中的deque基本用法的相關(guān)資料,需要的朋友可以參考下
    2017-11-11
  • python網(wǎng)絡(luò)編程之UDP通信實例(含服務(wù)器端、客戶端、UDP廣播例子)

    python網(wǎng)絡(luò)編程之UDP通信實例(含服務(wù)器端、客戶端、UDP廣播例子)

    UDP,用戶數(shù)據(jù)報傳輸協(xié)議,它位于TCP/IP協(xié)議的傳輸層,是一種無連接的協(xié)議,它發(fā)送的報文不能確定是否完整地到達(dá)了另外一端
    2014-04-04

最新評論