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

python KNN算法實(shí)現(xiàn)鳶尾花數(shù)據(jù)集分類

 更新時(shí)間:2019年10月24日 10:18:21   作者:Elf.蘇洛曦  
這篇文章主要介紹了python KNN算法實(shí)現(xiàn)鳶尾花數(shù)據(jù)集分類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、knn算法描述

1.基本概述

knn算法,又叫k-近鄰算法。屬于一個(gè)分類算法,主要思想如下:
一個(gè)樣本在特征空間中的k個(gè)最近鄰的樣本中的大多數(shù)都屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別。其中k表示最近鄰居的個(gè)數(shù)。

用二維的圖例,說明knn算法,如下:

二維空間下數(shù)據(jù)之間的距離計(jì)算:

在n維空間兩個(gè)數(shù)據(jù)之間:

2.具體步驟:
(1)計(jì)算待測(cè)試數(shù)據(jù)與各訓(xùn)練數(shù)據(jù)的距離
(2)將計(jì)算的距離進(jìn)行由小到大排序
(3)找出距離最小的k個(gè)值
(4)計(jì)算找出的值中每個(gè)類別的頻次
(5)返回頻次最高的類別

二、鳶尾花數(shù)據(jù)集

Iris 鳶尾花數(shù)據(jù)集內(nèi)包含 3 類分別為山鳶尾(Iris-setosa)、變色鳶尾(Iris-versicolor)和維吉尼亞鳶尾(Iris-virginica),共 150 條記錄,每類各 50 個(gè)數(shù)據(jù),每條記錄都有 4 項(xiàng)特征:花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度、花瓣寬度,可以通過這4個(gè)特征預(yù)測(cè)鳶尾花卉屬于哪一品種。

iris數(shù)據(jù)集包含在sklearn庫(kù)當(dāng)中,具體在sklearn\datasets\data文件夾下,文件名為iris.csv。以本機(jī)為例。其路徑如下:
D:\python\lib\site-packages\sklearn\datasets\data\iris.csv

其中數(shù)據(jù)如下格式:

第一行數(shù)據(jù)意義如下:
150:數(shù)據(jù)集中數(shù)據(jù)的總條數(shù)
4:特征值的類別數(shù),即花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度、花瓣寬度。
setosa、versicolor、virginica:三種鳶尾花名

從第二行開始:
第一列為花萼長(zhǎng)度值
第二列為花萼寬度值
第三列為花瓣長(zhǎng)度值
第四列為花瓣寬度值
第五列對(duì)應(yīng)是種類(三類鳶尾花分別用0,1,2表示)

三、算法實(shí)現(xiàn)

1.算法流程圖:

從以上流程圖可以看出,knn算法包含后四步操作,所以將整個(gè)程序分為三個(gè)模塊。

2.具體實(shí)現(xiàn)

(1)方法一
①利用slearn庫(kù)中的load_iris()導(dǎo)入iris數(shù)據(jù)集 
②使用train_test_split()對(duì)數(shù)據(jù)集進(jìn)行劃分
③KNeighborsClassifier()設(shè)置鄰居數(shù)
④利用fit()構(gòu)建基于訓(xùn)練集的模型
⑤使用predict()進(jìn)行預(yù)測(cè)
⑥使用score()進(jìn)行模型評(píng)估
說明:本代碼來源于《Python機(jī)器學(xué)習(xí)基礎(chǔ)教程》在此僅供學(xué)習(xí)使用。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

# 載入數(shù)據(jù)集
iris_dataset = load_iris()

# 數(shù)據(jù)劃分
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)

# 設(shè)置鄰居數(shù)
knn = KNeighborsClassifier(n_neighbors=1)

# 構(gòu)建基于訓(xùn)練集的模型
knn.fit(X_train, y_train)


# 一條測(cè)試數(shù)據(jù)
X_new = np.array([[5, 2.9, 1, 0.2]])

# 對(duì)X_new預(yù)測(cè)結(jié)果
prediction = knn.predict(X_new)
print("預(yù)測(cè)值%d" % prediction)

# 得出測(cè)試集X_test測(cè)試集的分?jǐn)?shù)
print("score:{:.2f}".format(knn.score(X_test,y_test)))

(2)方法二
①使用讀取文件的方式,使用open、以及csv中的相關(guān)方法載入數(shù)據(jù)
②輸入測(cè)試集和訓(xùn)練集的比率,對(duì)載入的數(shù)據(jù)使用shuffle()打亂后,計(jì)算訓(xùn)練集及測(cè)試集個(gè)數(shù)對(duì)特征值數(shù)據(jù)和對(duì)應(yīng)的標(biāo)簽數(shù)據(jù)進(jìn)行分割。
③將分割后的數(shù)據(jù),計(jì)算測(cè)試集數(shù)據(jù)與每一個(gè)訓(xùn)練集的距離,使用norm()函數(shù)直接求二范數(shù),或者載入數(shù)據(jù)使用np.sqrt(sum((test - train) ** 2))求得距離,使用argsort()將距離進(jìn)行排序,并返回索引值,
④取出值最小的k個(gè),獲得其標(biāo)簽值,存進(jìn)一個(gè)字典,標(biāo)簽值為鍵,出現(xiàn)次數(shù)為值,對(duì)字典進(jìn)行按值的大小遞減排序,將字典第一個(gè)鍵的值存入預(yù)測(cè)結(jié)果的列表中,計(jì)算完所有測(cè)試集數(shù)據(jù)后,返回一個(gè)列表。
⑤將預(yù)測(cè)結(jié)果與測(cè)試集本身的標(biāo)簽進(jìn)行對(duì)比,得出分?jǐn)?shù)。

import csv
import random
import numpy as np
import operator


def openfile(filename):

  """
  打開數(shù)據(jù)集,進(jìn)行數(shù)據(jù)處理
  :param filename: 數(shù)據(jù)集的路徑
  :return: 返回?cái)?shù)據(jù)集的數(shù)據(jù),標(biāo)簽,以及標(biāo)簽名
  """

  with open(filename) as csv_file:
    data_file = csv.reader(csv_file)
    temp = next(data_file)

    # 數(shù)據(jù)集中數(shù)據(jù)的總數(shù)量
    n_samples = int(temp[0])

    # 數(shù)據(jù)集中特征值的種類個(gè)數(shù)
    n_features = int(temp[1])

    # 標(biāo)簽名
    target_names = np.array(temp[2:])

    # empty()函數(shù)構(gòu)造一個(gè)未初始化的矩陣,行數(shù)為數(shù)據(jù)集數(shù)量,列數(shù)為特征值的種類個(gè)數(shù)
    data = np.empty((n_samples, n_features))

    # empty()函數(shù)構(gòu)造一個(gè)未初始化的矩陣,行數(shù)為數(shù)據(jù)集數(shù)量,1列,數(shù)據(jù)格式為int
    target = np.empty((n_samples,), dtype=np.int)

    for i, j in enumerate(data_file):

      # 將數(shù)據(jù)集中的將數(shù)據(jù)轉(zhuǎn)化為矩陣,數(shù)據(jù)格式為float
      # 將數(shù)據(jù)中從第一列到倒數(shù)第二列中的數(shù)據(jù)保存在data中
      data[i] = np.asarray(j[:-1], dtype=np.float64)

      # 將數(shù)據(jù)集中的將數(shù)據(jù)轉(zhuǎn)化為矩陣,數(shù)據(jù)格式為int
      # 將數(shù)據(jù)集中倒數(shù)第一列中的數(shù)據(jù)保存在target中
      target[i] = np.asarray(j[-1], dtype=np.int)

  # 返回 數(shù)據(jù),標(biāo)簽 和標(biāo)簽名
  return data, target, target_names


def random_number(data_size):
  """
  該函數(shù)使用shuffle()打亂一個(gè)包含從0到數(shù)據(jù)集大小的整數(shù)列表。因此每次運(yùn)行程序劃分不同,導(dǎo)致結(jié)果不同

  改進(jìn):
  可使用random設(shè)置隨機(jī)種子,隨機(jī)一個(gè)包含從0到數(shù)據(jù)集大小的整數(shù)列表,保證每次的劃分結(jié)果相同。

  :param data_size: 數(shù)據(jù)集大小
  :return: 返回一個(gè)列表
  """

  number_set = []
  for i in range(data_size):
    number_set.append(i)

  random.shuffle(number_set)

  return number_set


def split_data_set(data_set, target_data, rate=0.25):
  """
  說明:分割數(shù)據(jù)集,默認(rèn)數(shù)據(jù)集的25%是測(cè)試集

  :param data_set: 數(shù)據(jù)集
  :param target_data: 標(biāo)簽數(shù)據(jù)
  :param rate: 測(cè)試集所占的比率
  :return: 返回訓(xùn)練集數(shù)據(jù)、訓(xùn)練集標(biāo)簽、訓(xùn)練集數(shù)據(jù)、訓(xùn)練集標(biāo)簽
  """

  # 計(jì)算訓(xùn)練集的數(shù)據(jù)個(gè)數(shù)
  train_size = int((1-rate) * len(data_set))

  # 獲得數(shù)據(jù)
  data_index = random_number(len(data_set))

  # 分割數(shù)據(jù)集(X表示數(shù)據(jù),y表示標(biāo)簽),以返回的index為下標(biāo)
  x_train = data_set[data_index[:train_size]]

  x_test = data_set[data_index[train_size:]]

  y_train = target_data[data_index[:train_size]]

  y_test = target_data[data_index[train_size:]]
  return x_train, x_test, y_train, y_test


def data_diatance(x_test, x_train):
  """
  :param x_test: 測(cè)試集
  :param x_train: 訓(xùn)練集
  :return: 返回計(jì)算的距離
  """

  # sqrt_x = np.linalg.norm(test-train) # 使用norm求二范數(shù)(距離)
  distances = np.sqrt(sum((x_test - x_train) ** 2))
  return distances


def knn(x_test, x_train, y_train, k):
  """
  :param x_test: 測(cè)試集數(shù)據(jù)
  :param x_train: 訓(xùn)練集數(shù)據(jù)
  :param y_train: 測(cè)試集標(biāo)簽
  :param k: 鄰居數(shù)
  :return: 返回一個(gè)列表包含預(yù)測(cè)結(jié)果
  """

  # 預(yù)測(cè)結(jié)果列表,用于存儲(chǔ)測(cè)試集預(yù)測(cè)出來的結(jié)果
  predict_result_set=[]

  # 訓(xùn)練集的長(zhǎng)度
  train_set_size = len(x_train)

  # 創(chuàng)建一個(gè)全零的矩陣,長(zhǎng)度為訓(xùn)練集的長(zhǎng)度
  distances = np.array(np.zeros(train_set_size))

  # 計(jì)算每一個(gè)測(cè)試集與每一個(gè)訓(xùn)練集的距離
  for i in x_test:
    for indx in range(train_set_size):

      # 計(jì)算數(shù)據(jù)之間的距離
      distances[indx] = data_diatance(i, x_train[indx])

    # 排序后的距離的下標(biāo)
    sorted_dist = np.argsort(distances)

    class_count = {}

    # 取出k個(gè)最短距離
    for i in range(k):

      # 獲得下標(biāo)所對(duì)應(yīng)的標(biāo)簽值
      sort_label = y_train[sorted_dist[i]]

      # 將標(biāo)簽存入字典之中并存入個(gè)數(shù)
      class_count[sort_label]=class_count.get(sort_label, 0) + 1

    # 對(duì)標(biāo)簽進(jìn)行排序
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)

    # 將出現(xiàn)頻次最高的放入預(yù)測(cè)結(jié)果列表
    predict_result_set.append(sorted_class_count[0][0])

  # 返回預(yù)測(cè)結(jié)果列表
  return predict_result_set


def score(predict_result_set, y_test):
  """

  :param predict_result_set: 預(yù)測(cè)結(jié)果列表
  :param y_test: 測(cè)試集標(biāo)簽
  :return: 返回測(cè)試集精度
  """
  count = 0
  for i in range(0, len(predict_result_set)):
    if predict_result_set[i] == y_test[i]:
      count += 1

  score = count / len(predict_result_set)

  return score


if __name__ == "__main__":

  iris_dataset = openfile('iris.csv')
  # x_new = np.array([[5, 2.9, 1, 0.2]])
  x_train, x_test, y_train, y_test = split_data_set(iris_dataset[0], iris_dataset[1])
  result = knn(x_test,x_train, y_train, 6)
  print("原有標(biāo)簽:", y_test)

  # 為了方便對(duì)比查看,此處將預(yù)測(cè)結(jié)果轉(zhuǎn)化為array,可直接打印結(jié)果
  print("預(yù)測(cè)結(jié)果:", np.array(result))
  score = score(result, y_test)
  print("測(cè)試集的精度:%.2f" % score)

四、運(yùn)行結(jié)果

結(jié)果不同,因?yàn)槊看蝿澐值挠?xùn)練集和測(cè)試集不同,具體見random_number()方法。

五、總結(jié)

在本次使用python實(shí)現(xiàn)knn算法時(shí),遇到了很多困難,如數(shù)據(jù)集的加載,數(shù)據(jù)的格式不能滿足后續(xù)需要,因此閱讀了sklearn庫(kù)中的一部分代碼,有選擇性的進(jìn)行了復(fù)用。數(shù)據(jù)與標(biāo)簽無法分離,或是數(shù)據(jù)與標(biāo)簽排序后后無法對(duì)應(yīng)的情況,查詢?cè)S多資料后使用argsort()完美解決該問題。出現(xiàn)了n多錯(cuò)誤,通過多次調(diào)試之后最終完成。

附:本次實(shí)驗(yàn)參考 :

①*鄭捷《機(jī)器學(xué)習(xí)算法原理與編程實(shí)踐》
②《Python機(jī)器學(xué)習(xí)基礎(chǔ)教程》

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

相關(guān)文章

  • Python基于PycURL自動(dòng)處理cookie的方法

    Python基于PycURL自動(dòng)處理cookie的方法

    這篇文章主要介紹了Python基于PycURL自動(dòng)處理cookie的方法,實(shí)例分析了Python基于curl操作cookie的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • python 刪除指定時(shí)間間隔之前的文件實(shí)例

    python 刪除指定時(shí)間間隔之前的文件實(shí)例

    下面小編就為大家分享一篇python 刪除指定時(shí)間間隔之前的文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python mysql項(xiàng)目實(shí)戰(zhàn)及框架搭建過程

    python mysql項(xiàng)目實(shí)戰(zhàn)及框架搭建過程

    本文給大家分享python mysql項(xiàng)目實(shí)戰(zhàn)框架搭建過程,通過實(shí)例代碼給大家講解python mysql項(xiàng)目實(shí)戰(zhàn)的相關(guān)知識(shí),需要的朋友參考下吧
    2021-06-06
  • python openpyxl方法 zip函數(shù)用法及說明

    python openpyxl方法 zip函數(shù)用法及說明

    這篇文章主要介紹了python openpyxl方法 zip函數(shù)用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python英文詞頻統(tǒng)計(jì)(哈姆雷特)程序示例代碼

    Python英文詞頻統(tǒng)計(jì)(哈姆雷特)程序示例代碼

    在文本處理方面,Python也有著得天獨(dú)厚的優(yōu)勢(shì),不僅提供了多種字符串操作函數(shù),而且還可以使用各種開源庫(kù)來處理文本,下面這篇文章主要給大家介紹了關(guān)于Python英文詞頻統(tǒng)計(jì)(哈姆雷特)程序示例的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Python實(shí)現(xiàn)的繪制三維雙螺旋線圖形功能示例

    Python實(shí)現(xiàn)的繪制三維雙螺旋線圖形功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的繪制三維雙螺旋線圖形功能,結(jié)合實(shí)例形式分析了Python使用matplotlib、numpy模塊進(jìn)行數(shù)值運(yùn)算及圖形繪制相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Python3.x版本中新的字符串格式化方法

    Python3.x版本中新的字符串格式化方法

    這篇文章主要介紹了Python3.x版本中新的字符串格式化方法,本文對(duì)比給出了Python2.x和Python3.x中字符串格式化方法實(shí)例代碼,需要的朋友可以參考下
    2015-04-04
  • pandas中DataFrame的merge操作的實(shí)現(xiàn)

    pandas中DataFrame的merge操作的實(shí)現(xiàn)

    本文主要介紹了pandas中DataFrame的merge操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 變長(zhǎng)雙向rnn的正確使用姿勢(shì)教學(xué)

    變長(zhǎng)雙向rnn的正確使用姿勢(shì)教學(xué)

    這篇文章主要介紹了變長(zhǎng)雙向rnn的正確使用姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例

    python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例

    這篇文章主要為大家介紹了python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論