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

python實(shí)現(xiàn)KNN分類(lèi)算法

 更新時(shí)間:2019年10月16日 10:31:54   作者:王念晨  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)KNN分類(lèi)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、KNN算法簡(jiǎn)介

鄰近算法,或者說(shuō)K最近鄰(kNN,k-NearestNeighbor)分類(lèi)算法是數(shù)據(jù)挖掘分類(lèi)技術(shù)中最簡(jiǎn)單的方法之一。所謂K最近鄰,就是k個(gè)最近的鄰居的意思,說(shuō)的是每個(gè)樣本都可以用它最接近的k個(gè)鄰居來(lái)代表。

kNN算法的核心思想是如果一個(gè)樣本在特征空間中的k個(gè)最相鄰的樣本中的大多數(shù)屬于某一個(gè)類(lèi)別,則該樣本也屬于這個(gè)類(lèi)別,并具有這個(gè)類(lèi)別上樣本的特性。該方法在確定分類(lèi)決策上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類(lèi)別來(lái)決定待分樣本所屬的類(lèi)別。 kNN方法在類(lèi)別決策時(shí),只與極少量的相鄰樣本有關(guān)。由于kNN方法主要靠周?chē)邢薜泥徑臉颖?,而不是靠判別類(lèi)域的方法來(lái)確定所屬類(lèi)別的,因此對(duì)于類(lèi)域的交叉或重疊較多的待分樣本集來(lái)說(shuō),kNN方法較其他方法更為適合。

二、算法過(guò)程

1.讀取數(shù)據(jù)集

2.處理數(shù)據(jù)集數(shù)據(jù) 清洗,采用留出法hold-out拆分?jǐn)?shù)據(jù)集:訓(xùn)練集、測(cè)試集

3.實(shí)現(xiàn)KNN算法類(lèi):

   1)遍歷訓(xùn)練數(shù)據(jù)集,離差平方和計(jì)算各點(diǎn)之間的距離

   2)對(duì)各點(diǎn)的距離數(shù)組進(jìn)行排序,根據(jù)輸入的k值取對(duì)應(yīng)的k個(gè)點(diǎn)

   3)k個(gè)點(diǎn)中,統(tǒng)計(jì)每個(gè)點(diǎn)出現(xiàn)的次數(shù),權(quán)重為距離的導(dǎo)數(shù),得到最大的值,該值的索引就是我們計(jì)算出的判定類(lèi)別

三、代碼實(shí)現(xiàn)及數(shù)據(jù)分析

import numpy as np
import pandas as pd
 
# 讀取鳶尾花數(shù)據(jù)集,header參數(shù)來(lái)指定標(biāo)題的行。默認(rèn)為0。如果沒(méi)有標(biāo)題,則使用None。
data = pd.read_csv("你的目錄/Iris.csv",header=0)
# 顯示前n行記錄。默認(rèn)n的值為5。
#data.head()
# 顯示末尾的n行記錄。默認(rèn)n的值為5。
#data.tail()
# 隨機(jī)抽取樣本。默認(rèn)抽取一條,我們可以通過(guò)參數(shù)進(jìn)行指定抽取樣本的數(shù)量。
# data.sample(10)
# 將類(lèi)別文本映射成為數(shù)值類(lèi)型
 
data["Species"] = data["Species"].map({"Iris-virginica": 0, "Iris-setosa": 1, "Iris-versicolor": 2})
# 刪除不需要的Id列。
data.drop("Id", axis=1, inplace=True )
data.drop_duplicates(inplace=True)
## 查看各個(gè)類(lèi)別的鳶尾花具有多少條記錄。
data["Species"].value_counts()

分析:首先讀取數(shù)據(jù)集,如下圖

最后一列為數(shù)據(jù)集的分類(lèi)名稱(chēng),但是在程序中,我們更傾向于使用如0、1、2數(shù)字來(lái)表示分類(lèi),所以對(duì)數(shù)據(jù)集進(jìn)行處理,處理后的數(shù)據(jù)集如下:

然后采用留出法對(duì)數(shù)據(jù)集進(jìn)行拆分,一部分用作訓(xùn)練,一部分用作測(cè)試,如下圖:

#構(gòu)建訓(xùn)練集與測(cè)試集,用于對(duì)模型進(jìn)行訓(xùn)練與測(cè)試。
# 提取出每個(gè)類(lèi)比的鳶尾花數(shù)據(jù)
t0 = data[data["Species"] == 0]
t1 = data[data["Species"] == 1]
t2 = data[data["Species"] == 2]
# 對(duì)每個(gè)類(lèi)別數(shù)據(jù)進(jìn)行洗牌 random_state 每次以相同的方式洗牌 保證訓(xùn)練集與測(cè)試集數(shù)據(jù)取樣方式相同
t0 = t0.sample(len(t0), random_state=0)
t1 = t1.sample(len(t1), random_state=0)
t2 = t2.sample(len(t2), random_state=0)
# 構(gòu)建訓(xùn)練集與測(cè)試集。
train_X = pd.concat([t0.iloc[:40, :-1], t1.iloc[:40, :-1], t2.iloc[:40, :-1]] , axis=0)#截取前40行,除最后列外的列,因?yàn)樽詈笠涣惺莥
train_y = pd.concat([t0.iloc[:40, -1], t1.iloc[:40, -1], t2.iloc[:40, -1]], axis=0)
test_X = pd.concat([t0.iloc[40:, :-1], t1.iloc[40:, :-1], t2.iloc[40:, :-1]], axis=0)
test_y = pd.concat([t0.iloc[40:, -1], t1.iloc[40:, -1], t2.iloc[40:, -1]], axis=0)

實(shí)現(xiàn)KNN算法類(lèi):

#定義KNN類(lèi),用于分類(lèi),類(lèi)中定義兩個(gè)預(yù)測(cè)方法,分為考慮權(quán)重不考慮權(quán)重兩種情況
class KNN:
 ''' 使用Python語(yǔ)言實(shí)現(xiàn)K近鄰算法。(實(shí)現(xiàn)分類(lèi)) '''
 def __init__(self, k):
  '''初始化方法 
   Parameters
   -----
   k:int 鄰居的個(gè)數(shù)
  '''
  self.k = k
 
 def fit(self,X,y):
  '''訓(xùn)練方法
   Parameters
   ----
   X : 類(lèi)數(shù)組類(lèi)型,形狀為:[樣本數(shù)量, 特征數(shù)量]
   待訓(xùn)練的樣本特征(屬性)
  
  y : 類(lèi)數(shù)組類(lèi)型,形狀為: [樣本數(shù)量]
   每個(gè)樣本的目標(biāo)值(標(biāo)簽)。
  '''
  #將X轉(zhuǎn)換成ndarray數(shù)組
  self.X = np.asarray(X)
  self.y = np.asarray(y)
  
 def predict(self,X):
  """根據(jù)參數(shù)傳遞的樣本,對(duì)樣本數(shù)據(jù)進(jìn)行預(yù)測(cè)。
  
  Parameters
  -----
  X : 類(lèi)數(shù)組類(lèi)型,形狀為:[樣本數(shù)量, 特征數(shù)量]
   待訓(xùn)練的樣本特征(屬性) 
  
  Returns
  -----
  result : 數(shù)組類(lèi)型
   預(yù)測(cè)的結(jié)果。
  """
  X = np.asarray(X)
  result = []
  # 對(duì)ndarray數(shù)組進(jìn)行遍歷,每次取數(shù)組中的一行。
  for x in X:
   # 對(duì)于測(cè)試集中的每一個(gè)樣本,依次與訓(xùn)練集中的所有樣本求距離。
   dis = np.sqrt(np.sum((x - self.X) ** 2, axis=1))
   ## 返回?cái)?shù)組排序后,每個(gè)元素在原數(shù)組(排序之前的數(shù)組)中的索引。
   index = dis.argsort()
   # 進(jìn)行截?cái)?,只取前k個(gè)元素?!救【嚯x最近的k個(gè)元素的索引】
   index = index[:self.k]
   # 返回?cái)?shù)組中每個(gè)元素出現(xiàn)的次數(shù)。元素必須是非負(fù)的整數(shù)。【使用weights考慮權(quán)重,權(quán)重為距離的倒數(shù)?!?
   count = np.bincount(self.y[index], weights= 1 / dis[index])
   # 返回ndarray數(shù)組中,值最大的元素對(duì)應(yīng)的索引。該索引就是我們判定的類(lèi)別。
   # 最大元素索引,就是出現(xiàn)次數(shù)最多的元素。
   result.append(count.argmax())
  return np.asarray(result)
#創(chuàng)建KNN對(duì)象,進(jìn)行訓(xùn)練與測(cè)試。
knn = KNN(k=3)
#進(jìn)行訓(xùn)練
knn.fit(train_X,train_y)
#進(jìn)行測(cè)試
result = knn.predict(test_X)
# display(result)
# display(test_y)
display(np.sum(result == test_y))
display(np.sum(result == test_y)/ len(result))

得出計(jì)算結(jié)果:

26
0.9629629629629629

得出該模型計(jì)算的結(jié)果中,有26條記錄與測(cè)試集相等,準(zhǔn)確率為96%

接下來(lái)繪制散點(diǎn)圖:

#導(dǎo)入可視化所必須的庫(kù)。
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
 
#繪制散點(diǎn)圖。為了能夠更方便的進(jìn)行可視化,這里只選擇了兩個(gè)維度(分別是花萼長(zhǎng)度與花瓣長(zhǎng)度)。
# {"Iris-virginica": 0, "Iris-setosa": 1, "Iris-versicolor": 2})
# 設(shè)置畫(huà)布的大小
plt.figure(figsize=(10, 10))
# 繪制訓(xùn)練集數(shù)據(jù)
plt.scatter(x=t0["SepalLengthCm"][:40], y=t0["PetalLengthCm"][:40], color="r", label="Iris-virginica")
plt.scatter(x=t1["SepalLengthCm"][:40], y=t1["PetalLengthCm"][:40], color="g", label="Iris-setosa")
plt.scatter(x=t2["SepalLengthCm"][:40], y=t2["PetalLengthCm"][:40], color="b", label="Iris-versicolor")
# 繪制測(cè)試集數(shù)據(jù)
right = test_X[result == test_y]
wrong = test_X[result != test_y]
plt.scatter(x=right["SepalLengthCm"], y=right["PetalLengthCm"], color="c", marker="x", label="right")
plt.scatter(x=wrong["SepalLengthCm"], y=wrong["PetalLengthCm"], color="m", marker=">", label="wrong")
plt.xlabel("花萼長(zhǎng)度")
plt.ylabel("花瓣長(zhǎng)度")
plt.title("KNN分類(lèi)結(jié)果顯示")
plt.legend(loc="best")
plt.show()

程序運(yùn)行結(jié)果如下:

四、思考與優(yōu)化

①?lài)L試去改變鄰居的數(shù)量。

②在考慮權(quán)重的情況下,修改鄰居的數(shù)量。

③對(duì)比查看結(jié)果上的差異。

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

相關(guān)文章

  • 懶人必備Python代碼之自動(dòng)發(fā)送郵件

    懶人必備Python代碼之自動(dòng)發(fā)送郵件

    在傳統(tǒng)的工作中,發(fā)送會(huì)議紀(jì)要是一個(gè)比較繁瑣的任務(wù),需要手動(dòng)輸入郵件內(nèi)容、收件人、抄送人等信息,每次發(fā)送都需要重復(fù)操作,不僅費(fèi)時(shí)費(fèi)力,而且容易出現(xiàn)疏漏和錯(cuò)誤。本文就來(lái)用Python代碼實(shí)現(xiàn)這一功能吧
    2023-05-05
  • Python通過(guò)for循環(huán)理解迭代器和生成器實(shí)例詳解

    Python通過(guò)for循環(huán)理解迭代器和生成器實(shí)例詳解

    這篇文章主要介紹了Python通過(guò)for循環(huán)理解迭代器和生成器,結(jié)合實(shí)例形式詳細(xì)分析了迭代器和生成器的概念、原理、使用方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • 解決Python httpx 運(yùn)行過(guò)程中無(wú)限阻塞的問(wèn)題

    解決Python httpx 運(yùn)行過(guò)程中無(wú)限阻塞的問(wèn)題

    這篇文章主要介紹了解決Python httpx 運(yùn)行過(guò)程中無(wú)限阻塞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 使用Python第三方庫(kù)pygame寫(xiě)個(gè)貪吃蛇小游戲

    使用Python第三方庫(kù)pygame寫(xiě)個(gè)貪吃蛇小游戲

    這篇文章主要介紹了使用Python第三方庫(kù)pygame寫(xiě)個(gè)貪吃蛇小游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • TensorFlow用expand_dim()來(lái)增加維度的方法

    TensorFlow用expand_dim()來(lái)增加維度的方法

    今天小編就為大家分享一篇TensorFlow用expand_dim()來(lái)增加維度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • TensorFlow實(shí)現(xiàn)MLP多層感知機(jī)模型

    TensorFlow實(shí)現(xiàn)MLP多層感知機(jī)模型

    這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)MLP多層感知機(jī)模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 基于python實(shí)現(xiàn)刪除指定文件類(lèi)型

    基于python實(shí)現(xiàn)刪除指定文件類(lèi)型

    這篇文章主要介紹了基于python實(shí)現(xiàn)刪除指定文件類(lèi)型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python 文件操作的詳解及實(shí)例

    Python 文件操作的詳解及實(shí)例

    這篇文章主要介紹了Python 文件操作的詳解及實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠理解掌握Python 文件操作的知識(shí),需要的朋友可以參考下
    2017-09-09
  • 利用Python實(shí)現(xiàn)微信找房機(jī)器人實(shí)例教程

    利用Python實(shí)現(xiàn)微信找房機(jī)器人實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于如何利用Python實(shí)現(xiàn)微信找房機(jī)器人的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Django中間件工作流程及寫(xiě)法實(shí)例代碼

    Django中間件工作流程及寫(xiě)法實(shí)例代碼

    這篇文章主要介紹了Django中間件工作流程及寫(xiě)法實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論