最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python實(shí)現(xiàn)kNN算法的代碼

 更新時(shí)間:2019年08月16日 15:09:49   作者:魔法少女小Q  
這篇文章主要介紹了利用Python實(shí)現(xiàn)kNN算法的代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

鄰近算法(k-NearestNeighbor) 是機(jī)器學(xué)習(xí)中的一種分類(lèi)(classification)算法,也是機(jī)器學(xué)習(xí)中最簡(jiǎn)單的算法之一了。雖然很簡(jiǎn)單,但在解決特定問(wèn)題時(shí)卻能發(fā)揮很好的效果。因此,學(xué)習(xí)kNN算法是機(jī)器學(xué)習(xí)入門(mén)的一個(gè)很好的途徑。

kNN算法的思想非常的樸素,它選取k個(gè)離測(cè)試點(diǎn)最近的樣本點(diǎn),輸出在這k個(gè)樣本點(diǎn)中數(shù)量最多的標(biāo)簽(label)。我們假設(shè)每一個(gè)樣本有m個(gè)特征值(property),則一個(gè)樣本的可以用一個(gè)m維向量表示: X =( x1,x2,... , xm ),  同樣地,測(cè)試點(diǎn)的特征值也可表示成:Y =( y1,y2,... , ym )。那我們?cè)趺炊x這兩者之間的“距離”呢?

在二維空間中,有:d2 = ( x1 - y1 )2 + ( x2 - y2 )2 ,  在三維空間中,兩點(diǎn)的距離被定義為:d2 = ( x1 - y1 )2 + ( x2 - y2 )2  + ( x3 - y3 )2 。我們可以據(jù)此推廣到m維空間中,定義m維空間的距離:d2 = ( x1 - y1 )2 + ( x2 - y2 )2  + ...... + ( xm - ym )2 。要實(shí)現(xiàn)kNN算法,我們只需要計(jì)算出每一個(gè)樣本點(diǎn)與測(cè)試點(diǎn)的距離,選取距離最近的k個(gè)樣本,獲取他們的標(biāo)簽(label) ,然后找出k個(gè)樣本中數(shù)量最多的標(biāo)簽,返回該標(biāo)簽。

在開(kāi)始實(shí)現(xiàn)算法之前,我們要考慮一個(gè)問(wèn)題,不同特征的特征值范圍可能有很大的差別,例如,我們要分辨一個(gè)人的性別,一個(gè)女生的身高是1.70m,體重是60kg,一個(gè)男生的身高是1.80m,體重是70kg,而一個(gè)未知性別的人的身高是1.81m, 體重是64kg,這個(gè)人與女生數(shù)據(jù)點(diǎn)的“距離”的平方 d2 = ( 1.70 - 1.81 )2 + ( 60 - 64 )2 = 0.0121 + 16.0 = 16.0121,而與男生數(shù)據(jù)點(diǎn)的“距離”的平方d2 = ( 1.80 - 1.81 )2 + ( 70 - 64 )2 = 0.0001 + 36.0 = 36.0001 ??梢?jiàn),在這種情況下,身高差的平方相對(duì)于體重差的平方基本可以忽略不計(jì),但是身高對(duì)于辨別性別來(lái)說(shuō)是十分重要的。為了解決這個(gè)問(wèn)題,就需要將數(shù)據(jù)標(biāo)準(zhǔn)化(normalize),把每一個(gè)特征值除以該特征的范圍,保證標(biāo)準(zhǔn)化后每一個(gè)特征值都在0~1之間。我們寫(xiě)一個(gè)normData函數(shù)來(lái)執(zhí)行標(biāo)準(zhǔn)化數(shù)據(jù)集的工作:

def normData(dataSet):
  maxVals = dataSet.max(axis=0)
  minVals = dataSet.min(axis=0)
  ranges = maxVals - minVals
  retData = (dataSet - minVals) / ranges
  return retData, ranges, minVals

 然后開(kāi)始實(shí)現(xiàn)kNN算法:

 def kNN(dataSet, labels, testData, k):
  distSquareMat = (dataSet - testData) ** 2 # 計(jì)算差值的平方
  distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和
  distances = distSquareSums ** 0.5 # 開(kāi)根號(hào),得出每個(gè)樣本到測(cè)試點(diǎn)的距離
  sortedIndices = distances.argsort() # 排序,得到排序后的下標(biāo)
  indices = sortedIndices[:k] # 取最小的k個(gè)
  labelCount = {} # 存儲(chǔ)每個(gè)label的出現(xiàn)次數(shù)
  for i in indices:
    label = labels[i]
    labelCount[label] = labelCount.get(label, 0) + 1 # 次數(shù)加一
  sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) 
  # 對(duì)label出現(xiàn)的次數(shù)從大到小進(jìn)行排序
  return sortedCount[0][0] # 返回出現(xiàn)次數(shù)最大的label

注意,在testData作為參數(shù)傳入kNN函數(shù)之前,需要經(jīng)過(guò)標(biāo)準(zhǔn)化。

我們用幾個(gè)小數(shù)據(jù)驗(yàn)證一下kNN函數(shù)是否能正常工作:

if __name__ == "__main__":
  dataSet = np.array([[2, 3], [6, 8]])
  normDataSet, ranges, minVals = normData(dataSet)
  labels = ['a', 'b']
  testData = np.array([3.9, 5.5])
  normTestData = (testData - minVals) / ranges
  result = kNN(normDataSet, labels, normTestData, 1)
  print(result)

結(jié)果輸出 a ,與預(yù)期結(jié)果一致。

完整代碼:

import numpy as np
from math import sqrt
import operator as opt

def normData(dataSet):
  maxVals = dataSet.max(axis=0)
  minVals = dataSet.min(axis=0)
  ranges = maxVals - minVals
  retData = (dataSet - minVals) / ranges
  return retData, ranges, minVals


def kNN(dataSet, labels, testData, k):
  distSquareMat = (dataSet - testData) ** 2 # 計(jì)算差值的平方
  distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和
  distances = distSquareSums ** 0.5 # 開(kāi)根號(hào),得出每個(gè)樣本到測(cè)試點(diǎn)的距離
  sortedIndices = distances.argsort() # 排序,得到排序后的下標(biāo)
  indices = sortedIndices[:k] # 取最小的k個(gè)
  labelCount = {} # 存儲(chǔ)每個(gè)label的出現(xiàn)次數(shù)
  for i in indices:
    label = labels[i]
    labelCount[label] = labelCount.get(label, 0) + 1 # 次數(shù)加一
  sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 對(duì)label出現(xiàn)的次數(shù)從大到小進(jìn)行排序
  return sortedCount[0][0] # 返回出現(xiàn)次數(shù)最大的label



if __name__ == "__main__":
  dataSet = np.array([[2, 3], [6, 8]])
  normDataSet, ranges, minVals = normData(dataSet)
  labels = ['a', 'b']
  testData = np.array([3.9, 5.5])
  normTestData = (testData - minVals) / ranges
  result = kNN(normDataSet, labels, normTestData, 1)
  print(result)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用python批量生成文件夾的實(shí)現(xiàn)方法舉例

    用python批量生成文件夾的實(shí)現(xiàn)方法舉例

    這篇文章主要介紹了使用Python腳本批量生成文件夾的方法,可以用于創(chuàng)建順序文件夾或嵌套文件夾,通過(guò)設(shè)置路徑和循環(huán),可以自動(dòng)命名并創(chuàng)建文件夾,提高工作效率,需要的朋友可以參考下
    2025-03-03
  • 如何用python爬取微博熱搜數(shù)據(jù)并保存

    如何用python爬取微博熱搜數(shù)據(jù)并保存

    這篇文章主要介紹了如何用python爬取微博熱搜數(shù)據(jù)并保存,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • tensorflow dataset.shuffle、dataset.batch、dataset.repeat順序區(qū)別詳解

    tensorflow dataset.shuffle、dataset.batch、dataset.repeat順序區(qū)別詳

    這篇文章主要介紹了tensorflow dataset.shuffle、dataset.batch、dataset.repeat順序區(qū)別詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python 中Pickle庫(kù)的使用詳解

    Python 中Pickle庫(kù)的使用詳解

    pickle是python語(yǔ)言的一個(gè)標(biāo)準(zhǔn)模塊,安裝python后已包含pickle庫(kù),不需要單獨(dú)再安裝。這篇文章主要介紹了Python 中Pickle庫(kù)的使用詳解,需要的朋友可以參考下
    2018-02-02
  • 詳解使用Selenium爬取豆瓣電影前100的愛(ài)情片相關(guān)信息

    詳解使用Selenium爬取豆瓣電影前100的愛(ài)情片相關(guān)信息

    這篇文章主要介紹了詳解使用Selenium爬取豆瓣電影前100的愛(ài)情片相關(guān)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python使用socket創(chuàng)建tcp服務(wù)器和客戶端

    python使用socket創(chuàng)建tcp服務(wù)器和客戶端

    這篇文章主要為大家詳細(xì)介紹了python使用socket創(chuàng)建tcp服務(wù)器和客戶端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python-pymysql獲取字段名稱-獲取內(nèi)容方式

    python-pymysql獲取字段名稱-獲取內(nèi)容方式

    這篇文章主要介紹了python-pymysql獲取字段名稱-獲取內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python利用tenacity庫(kù)處理超時(shí)重試機(jī)制詳解

    Python利用tenacity庫(kù)處理超時(shí)重試機(jī)制詳解

    Python?的?tenacity?庫(kù)用于實(shí)現(xiàn)重試機(jī)制,特別適合處理網(wǎng)絡(luò)不穩(wěn)定或其他意外錯(cuò)誤導(dǎo)致的函數(shù)調(diào)用失敗,下面我們就來(lái)看看它的具體使用吧
    2025-02-02
  • python實(shí)現(xiàn)圖片數(shù)據(jù)增強(qiáng)的示例詳解

    python實(shí)現(xiàn)圖片數(shù)據(jù)增強(qiáng)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片數(shù)據(jù)增強(qiáng)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • Python3+RIDE+RobotFramework自動(dòng)化測(cè)試框架搭建過(guò)程詳解

    Python3+RIDE+RobotFramework自動(dòng)化測(cè)試框架搭建過(guò)程詳解

    這篇文章主要介紹了Python3+RIDE+RobotFramework自動(dòng)化測(cè)試框架搭建過(guò)程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

百色市| 左权县| 宣化县| 新民市| 西林县| 读书| 荆门市| 莫力| 旌德县| 金沙县| 霞浦县| 本溪| 项城市| 河曲县| 阿图什市| 自治县| 磐石市| 那坡县| 贵阳市| 疏勒县| 石门县| 保山市| 二连浩特市| 丰台区| 宁化县| 石棉县| 孟连| 望江县| 库车县| 新乐市| 定安县| 竹北市| 灵寿县| 宜兰县| 乐安县| 神农架林区| 龙陵县| 武平县| 玉田县| 灵石县| 敦煌市|