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

原生python實(shí)現(xiàn)knn分類算法

 更新時(shí)間:2019年10月24日 10:27:50   作者:大俠_  
這篇文章主要介紹了原生python實(shí)現(xiàn)knn分類算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、題目要求

用原生Python實(shí)現(xiàn)knn分類算法。

二、題目分析

數(shù)據(jù)來(lái)源:鳶尾花數(shù)據(jù)集(見(jiàn)附錄Iris.txt)

數(shù)據(jù)集包含150個(gè)數(shù)據(jù)集,分為3類,分別是:Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾)和Iris Virginica(維吉尼亞鳶尾)。每類有50個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)包含四個(gè)屬性,分別是:Sepal.Length(花萼長(zhǎng)度)、Sepal.Width(花萼寬度)、Petal.Length(花瓣長(zhǎng)度)和Petal.Width(花瓣寬度)。

將得到的數(shù)據(jù)集按照7:3的比例劃分,其中7為訓(xùn)練集,3為測(cè)試集。編寫算法實(shí)現(xiàn):學(xué)習(xí)訓(xùn)練集的數(shù)據(jù)特征來(lái)預(yù)測(cè)測(cè)試集鳶尾花的種類,并且計(jì)算出預(yù)測(cè)的準(zhǔn)確性。

KNN是通過(guò)測(cè)量不同特征值之間的距離進(jìn)行分類。它的思路是:如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別,其中K通常是不大于20的整數(shù)。KNN算法中,所選擇的鄰居都是已經(jīng)正確分類的對(duì)象。該方法在定類決策上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類別來(lái)決定待分樣本所屬的類別。

三、算法設(shè)計(jì)

1)將文本文件按行分割,寫入列表datas中

def data_read(filepath): # 讀取txt文件,將讀出的內(nèi)容存入datas列表中
  fp = open(filepath, "r")
  datas = [] # 存儲(chǔ)處理后的數(shù)據(jù)
  lines = fp.readlines() # 讀取整個(gè)文件數(shù)據(jù)
  for line in lines:
    row = line.strip('\n').split(',') # 去除兩頭的換行符,按空格分割
    datas.append(row)
  fp.close()
  return datas

2)劃分?jǐn)?shù)據(jù)集與測(cè)試集,將數(shù)據(jù)集的數(shù)據(jù)存入labeldata_list列表,標(biāo)簽存入label_list列表,測(cè)試集數(shù)據(jù)存入text_list列表,標(biāo)簽存入textlabel_list列表。

3)對(duì)得到的兩個(gè)數(shù)據(jù)集的數(shù)據(jù)和標(biāo)簽列表進(jìn)行處理。將labeldata_list列表數(shù)據(jù)轉(zhuǎn)換為元組labeldata_tuple,構(gòu)造形入{labeldata_tuple: label_list}的字典mydict。這樣不僅可以去掉重復(fù)數(shù)據(jù),而且可唯一的標(biāo)識(shí)各個(gè)數(shù)據(jù)所對(duì)應(yīng)的鳶尾花種類。

for i in range(0, 105): # 數(shù)據(jù)集按照3:7的比例劃分,其中105行為訓(xùn)練集,45行為測(cè)試集
  labeldata_list.append([datas[i][0], datas[i][1], datas[i][2], datas[i][3]])
  label_list.append(datas[i][4])

for i in range(105, 150): # 測(cè)試集的數(shù)據(jù)
  text_list.append([datas[i][0], datas[i][1], datas[i][2], datas[i][3]])
  textlabel_list.append(datas[i][4])

j = 0
for i in labeldata_list:
  labeldata_tuple = tuple(i)
  mydict.update({labeldata_tuple: label_list[j]})
  j = j + 1

4)計(jì)算測(cè)試集數(shù)據(jù)與各個(gè)訓(xùn)練集數(shù)據(jù)之間的距離,得到distance_list列表,外層循環(huán)進(jìn)行一次,都會(huì)有一個(gè)該測(cè)試數(shù)據(jù)所對(duì)應(yīng)的與訓(xùn)練數(shù)據(jù)最短距離。標(biāo)記出該距離對(duì)應(yīng)的訓(xùn)練集,在一個(gè)近鄰的條件下,這個(gè)訓(xùn)練集的種類,就是該測(cè)試集的種類。
在計(jì)算距離時(shí),使用絕對(duì)距離來(lái)計(jì)算。將每個(gè)訓(xùn)練集對(duì)應(yīng)數(shù)據(jù)的屬性值相減后求和add,得到一個(gè)測(cè)試數(shù)據(jù)與每個(gè)樣本的距離,add的最小值就是距離最小值。

for i in range(len(text_list)):
  count += 1
  for j in range(len(train_list)):
    add1 = abs(float(train_list[j][0]) - float(text_list[i][0])) + abs(float(train_list[j][1])
                                      - float(text_list[i][1])) + abs(
      float(train_list[j][2]) - float(text_list[i][2])) + abs(float(train_list[j][3])
                                  - float(text_list[i][3]))
    distance_list.append(add1)
    if add > add1:
      add = add1
      index = train_list[j]
  print("預(yù)測(cè)", text_list[i], "的標(biāo)簽是:", mydict.get(index))

5)判斷預(yù)測(cè)結(jié)果的準(zhǔn)確性:將預(yù)測(cè)的測(cè)試數(shù)據(jù)種類與原始數(shù)據(jù)對(duì)比,若相同,則分子加一。

right = 0 # 分子
count = 0 # 分母
for i in range(len(text_list)):
  count += 1
  for j in range(len(train_list)):
    add1 = abs(float(train_list[j][0]) - float(text_list[i][0])) + abs(float(train_list[j][1])
                                      - float(text_list[i][1])) + abs(
      float(train_list[j][2]) - float(text_list[i][2])) + abs(float(train_list[j][3])
                                  - float(text_list[i][3]))
    distance_list.append(add1)
    if add > add1:
      add = add1
      index = train_list[j]
  print("預(yù)測(cè)", text_list[i], "的標(biāo)簽是:", mydict.get(index))
  if mydict.get(index) == textlabel_list[i]: # 當(dāng)計(jì)算出來(lái)的1個(gè)近鄰與測(cè)試集正確的標(biāo)簽相同時(shí),分子加一
    right = right + 1
print('預(yù)測(cè)準(zhǔn)確性:{:.2f}'.format(right / count))

6)舉例,繪圖

以測(cè)試集7.6,3.0,6.6,2.1,Iris-virginica為例:
首先運(yùn)用anaconda繪制出數(shù)據(jù)集的散點(diǎn)圖,其次,將需要測(cè)試的數(shù)據(jù)于數(shù)據(jù)集繪制在同一張圖上,在一個(gè)近鄰的前提下,距離測(cè)試數(shù)據(jù)最近的點(diǎn)的標(biāo)簽即為測(cè)試數(shù)據(jù)的的標(biāo)簽。如下圖,黑色的測(cè)試點(diǎn)距離紅點(diǎn)最近,所以,測(cè)試數(shù)據(jù)的標(biāo)簽就為virginica。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris  #導(dǎo)入數(shù)據(jù)集iris
 
#載入數(shù)據(jù)集 
iris = load_iris() 
#獲取花卉兩列數(shù)據(jù)集 
DD = iris.data 
X = [x[0] for x in DD] 
Y = [x[1] for x in DD] 
#plt.scatter(7.6,3.0, color='black', marker='o')
plt.scatter(X[:50], Y[:50], color='red', marker='o', label='setosa') #前50個(gè)樣本
plt.scatter(X[50:100], Y[50:100], color='blue', marker='x', label='versicolor') #中間50個(gè)
plt.scatter(X[100:], Y[100:],color='green', marker='+', label='Virginica') #后50個(gè)樣本
plt.legend(loc=2) #左上角
plt.show()

算法數(shù)據(jù)流圖:

在這里插入圖片描述

計(jì)算各個(gè)測(cè)試數(shù)據(jù)與訓(xùn)練集間距離詳細(xì)流程圖:

在這里插入圖片描述

五、測(cè)試

導(dǎo)入數(shù)據(jù)集

在這里插入圖片描述

劃分?jǐn)?shù)據(jù)集

訓(xùn)練集:

在這里插入圖片描述

測(cè)試集:

在這里插入圖片描述

對(duì)得到的兩個(gè)數(shù)據(jù)集的數(shù)據(jù)和標(biāo)簽列表進(jìn)行處理

在這里插入圖片描述

計(jì)算測(cè)試集數(shù)據(jù)與各個(gè)訓(xùn)練集數(shù)據(jù)之間的距離

在這里插入圖片描述

判斷預(yù)測(cè)結(jié)果的準(zhǔn)確性

在這里插入圖片描述

繪圖舉例

在這里插入圖片描述

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

1.對(duì)測(cè)試集所有數(shù)據(jù)進(jìn)行預(yù)測(cè),得到預(yù)測(cè)測(cè)試集的標(biāo)簽與預(yù)測(cè)準(zhǔn)確性

在這里插入圖片描述

繪出散點(diǎn)圖:7.6,3.0,6.6,2.1,Iris-virginica作為測(cè)試集的舉例

在這里插入圖片描述

六、總結(jié)

學(xué)習(xí)了關(guān)于繪圖的函數(shù)與庫(kù)
發(fā)現(xiàn)在繪圖方面anaconde比pycharm要方便的多

對(duì)向量之間的距離公式進(jìn)行了復(fù)習(xí)
除了這次作業(yè)中使用到的絕對(duì)距離之外,還有:
a)歐氏距離
兩個(gè)n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離:
在這里插入圖片描述
b)曼哈頓距離
兩個(gè)n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的曼哈頓距離
在這里插入圖片描述
c)閔可夫斯基距離
兩個(gè)n維變量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的閔可夫斯基距離定義為:
在這里插入圖片描述

對(duì)文件的讀操作進(jìn)行使用

算法缺點(diǎn):用了許多for循環(huán),會(huì)降低效率,增加算法的時(shí)間復(fù)雜度;只是一個(gè)近鄰的判斷依據(jù)

七、源代碼

def data_read(filepath): # 讀取txt文件,將讀出的內(nèi)容存入datas列表中
  fp = open(filepath, "r")
  datas = [] # 存儲(chǔ)處理后的數(shù)據(jù)
  lines = fp.readlines() # 讀取整個(gè)文件數(shù)據(jù)
  for line in lines:
    row = line.strip('\n').split(',') # 去除兩頭的換行符,按空格分割
    datas.append(row)
  fp.close()
  return datas


datas = data_read("iris .txt")

labeldata_list = [] # 訓(xùn)練集的數(shù)據(jù)
label_list = [] # 訓(xùn)練集的標(biāo)簽
text_list = [] # 測(cè)試集數(shù)據(jù)
textlabel_list = [] # 測(cè)試集標(biāo)簽
labeldata_tuple = () # 轉(zhuǎn)換列表為元組
mydict = {} # 以四維數(shù)據(jù)為鍵,以鳶尾花的特征為值。這樣便可唯一標(biāo)識(shí)

'''
劃分?jǐn)?shù)據(jù)集與測(cè)試集,將數(shù)據(jù)集的數(shù)據(jù)存入labeldata_list列表,標(biāo)簽存入label_list列表,
測(cè)試集數(shù)據(jù)存入text_list列表,標(biāo)簽存入textlabel_list列表。
'''
for i in range(0, 105): # 數(shù)據(jù)集按照3:7的比例劃分,其中105行為訓(xùn)練集,45行為測(cè)試集
  labeldata_list.append([datas[i][0], datas[i][1], datas[i][2], datas[i][3]])
  label_list.append(datas[i][4])

for i in range(105, 150): # 測(cè)試集的數(shù)據(jù)
  text_list.append([datas[i][0], datas[i][1], datas[i][2], datas[i][3]])
  textlabel_list.append(datas[i][4])

j = 0
for i in labeldata_list:
  labeldata_tuple = tuple(i)
  mydict.update({labeldata_tuple: label_list[j]})
  j = j + 1


add = 100
index = 0
distance_list = []
train_list = []
for key, value in mydict.items():
  train_list.append(key)

right = 0 # 分子
count = 0 # 分母
'''
在計(jì)算距離時(shí),使用絕對(duì)距離來(lái)計(jì)算。
將每個(gè)訓(xùn)練集對(duì)應(yīng)數(shù)據(jù)的屬性值相減后求和add,
得到一個(gè)測(cè)試數(shù)據(jù)與每個(gè)樣本的距離,add的最小值就是距離最小值。
'''
for i in range(len(text_list)):
  count += 1
  for j in range(len(train_list)):
    add1 = abs(float(train_list[j][0]) - float(text_list[i][0])) + abs(float(train_list[j][1])
                                      - float(text_list[i][1])) + abs(
      float(train_list[j][2]) - float(text_list[i][2])) + abs(float(train_list[j][3])
                                  - float(text_list[i][3]))
    distance_list.append(add1)
    if add > add1:
      add = add1
      index = train_list[j]
  print("預(yù)測(cè)", text_list[i], "的標(biāo)簽是:", mydict.get(index))
  if mydict.get(index) == textlabel_list[i]: # 當(dāng)計(jì)算出來(lái)的1個(gè)近鄰與測(cè)試集正確的標(biāo)簽相同時(shí),分子加一
    right = right + 1
print('預(yù)測(cè)準(zhǔn)確性:{:.2f}'.format(right / count))

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

相關(guān)文章

  • Python企業(yè)編碼生成系統(tǒng)之系統(tǒng)主要函數(shù)設(shè)計(jì)詳解

    Python企業(yè)編碼生成系統(tǒng)之系統(tǒng)主要函數(shù)設(shè)計(jì)詳解

    這篇文章主要介紹了Python企業(yè)編碼生成系統(tǒng)之系統(tǒng)主要函數(shù)設(shè)計(jì),涉及目錄操作、文件讀寫、驗(yàn)證判斷、編碼輸出等功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Python實(shí)現(xiàn)自動(dòng)清理電腦垃圾文件詳解

    Python實(shí)現(xiàn)自動(dòng)清理電腦垃圾文件詳解

    經(jīng)常存在在我們的電腦中的垃圾文件主要是指系統(tǒng)在運(yùn)行過(guò)程中產(chǎn)生的tmp臨時(shí)文件、日志文件、臨時(shí)備份文件等。本文將利用Python實(shí)現(xiàn)自動(dòng)清理這些垃圾文件,需要的可以參考一下
    2022-03-03
  • Python中使用Frozenset對(duì)象的案例詳解

    Python中使用Frozenset對(duì)象的案例詳解

    Frozensets提供了一種創(chuàng)建不可變的集合的方法,它們只接受唯一的元素,并且是可散列類型的對(duì)象,所以它們可以在其他只接受可散列對(duì)象作為子對(duì)象的?Python?對(duì)象中使用,這篇文章主要介紹了如何在Python中使用Frozenset對(duì)象,需要的朋友可以參考下
    2022-08-08
  • 詳解python中asyncio模塊

    詳解python中asyncio模塊

    本篇文章給大家詳細(xì)分析了python中重要的asyncio模塊相關(guān)知識(shí)點(diǎn),有興趣的朋友可以學(xué)習(xí)參考下。
    2018-03-03
  • Python中可復(fù)用函數(shù)的6種實(shí)踐

    Python中可復(fù)用函數(shù)的6種實(shí)踐

    為了實(shí)現(xiàn)可維護(hù)性,我們的Python函數(shù)應(yīng)該:小型、只做一項(xiàng)任務(wù);沒(méi)有重復(fù);有一個(gè)層次的抽象性;有一個(gè)描述性的名字和有少于四個(gè)參數(shù),下面我們就來(lái)看看這6個(gè)特性的實(shí)踐吧
    2023-08-08
  • python Dejavu庫(kù)快速識(shí)別音頻指紋實(shí)例探究

    python Dejavu庫(kù)快速識(shí)別音頻指紋實(shí)例探究

    這篇文章主要為大家介紹了python Dejavu庫(kù)快速識(shí)別音頻指紋實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 基于Python實(shí)現(xiàn)的影視數(shù)據(jù)智能分析系統(tǒng)

    基于Python實(shí)現(xiàn)的影視數(shù)據(jù)智能分析系統(tǒng)

    數(shù)據(jù)分析與可視化是當(dāng)今數(shù)據(jù)分析的發(fā)展方向,大數(shù)據(jù)時(shí)代,數(shù)據(jù)資源具有海量特征,數(shù)據(jù)分析和可視化主要通過(guò)Python數(shù)據(jù)分析來(lái)實(shí)現(xiàn),本文給大家介紹了如何基于Python實(shí)現(xiàn)的影視數(shù)據(jù)智能分析系統(tǒng),文中給出了部分詳細(xì)代碼,感興趣的朋友跟著小編一起來(lái)看看吧
    2024-01-01
  • python中start和run方法的區(qū)別

    python中start和run方法的區(qū)別

    大家好,本篇文章主要講的是python中start和run方法的區(qū)別,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Python處理日期方法詳細(xì)大全(30種方法)

    Python處理日期方法詳細(xì)大全(30種方法)

    這篇文章主要給大家介紹了關(guān)于Python處理日期方法詳細(xì)大全,文中共介紹了30種方法,Python程序能用很多方式處理日期和時(shí)間,轉(zhuǎn)換日期格式是一個(gè)常見(jiàn)的功能,Python提供了一個(gè)time和calendar模塊可以用于格式化日期和時(shí)間,需要的朋友可以參考下
    2023-12-12
  • Python實(shí)現(xiàn)身份證號(hào)碼解析

    Python實(shí)現(xiàn)身份證號(hào)碼解析

    本文給大家匯總介紹下使用Python實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證解析的幾個(gè)方法,有需要的小伙伴可以參考下。
    2015-09-09

最新評(píng)論