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

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

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

一、題目要求

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

二、題目分析

數(shù)據(jù)來源:鳶尾花數(shù)據(jù)集(見附錄Iris.txt)

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

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

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

三、算法設(shè)計

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

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

2)劃分數(shù)據(jù)集與測試集,將數(shù)據(jù)集的數(shù)據(jù)存入labeldata_list列表,標簽存入label_list列表,測試集數(shù)據(jù)存入text_list列表,標簽存入textlabel_list列表。

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

for i in range(0, 105): # 數(shù)據(jù)集按照3:7的比例劃分,其中105行為訓練集,45行為測試集
  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): # 測試集的數(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)計算測試集數(shù)據(jù)與各個訓練集數(shù)據(jù)之間的距離,得到distance_list列表,外層循環(huán)進行一次,都會有一個該測試數(shù)據(jù)所對應的與訓練數(shù)據(jù)最短距離。標記出該距離對應的訓練集,在一個近鄰的條件下,這個訓練集的種類,就是該測試集的種類。
在計算距離時,使用絕對距離來計算。將每個訓練集對應數(shù)據(jù)的屬性值相減后求和add,得到一個測試數(shù)據(jù)與每個樣本的距離,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("預測", text_list[i], "的標簽是:", mydict.get(index))

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

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("預測", text_list[i], "的標簽是:", mydict.get(index))
  if mydict.get(index) == textlabel_list[i]: # 當計算出來的1個近鄰與測試集正確的標簽相同時,分子加一
    right = right + 1
print('預測準確性:{:.2f}'.format(right / count))

6)舉例,繪圖

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

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris  #導入數(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個樣本
plt.scatter(X[50:100], Y[50:100], color='blue', marker='x', label='versicolor') #中間50個
plt.scatter(X[100:], Y[100:],color='green', marker='+', label='Virginica') #后50個樣本
plt.legend(loc=2) #左上角
plt.show()

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

在這里插入圖片描述

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

在這里插入圖片描述

五、測試

導入數(shù)據(jù)集

在這里插入圖片描述

劃分數(shù)據(jù)集

訓練集:

在這里插入圖片描述

測試集:

在這里插入圖片描述

對得到的兩個數(shù)據(jù)集的數(shù)據(jù)和標簽列表進行處理

在這里插入圖片描述

計算測試集數(shù)據(jù)與各個訓練集數(shù)據(jù)之間的距離

在這里插入圖片描述

判斷預測結(jié)果的準確性

在這里插入圖片描述

繪圖舉例

在這里插入圖片描述

五、運行結(jié)果

1.對測試集所有數(shù)據(jù)進行預測,得到預測測試集的標簽與預測準確性

在這里插入圖片描述

繪出散點圖:7.6,3.0,6.6,2.1,Iris-virginica作為測試集的舉例

在這里插入圖片描述

六、總結(jié)

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

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

對文件的讀操作進行使用

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

七、源代碼

def data_read(filepath): # 讀取txt文件,將讀出的內(nèi)容存入datas列表中
  fp = open(filepath, "r")
  datas = [] # 存儲處理后的數(shù)據(jù)
  lines = fp.readlines() # 讀取整個文件數(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 = [] # 訓練集的數(shù)據(jù)
label_list = [] # 訓練集的標簽
text_list = [] # 測試集數(shù)據(jù)
textlabel_list = [] # 測試集標簽
labeldata_tuple = () # 轉(zhuǎn)換列表為元組
mydict = {} # 以四維數(shù)據(jù)為鍵,以鳶尾花的特征為值。這樣便可唯一標識

'''
劃分數(shù)據(jù)集與測試集,將數(shù)據(jù)集的數(shù)據(jù)存入labeldata_list列表,標簽存入label_list列表,
測試集數(shù)據(jù)存入text_list列表,標簽存入textlabel_list列表。
'''
for i in range(0, 105): # 數(shù)據(jù)集按照3:7的比例劃分,其中105行為訓練集,45行為測試集
  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): # 測試集的數(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 # 分母
'''
在計算距離時,使用絕對距離來計算。
將每個訓練集對應數(shù)據(jù)的屬性值相減后求和add,
得到一個測試數(shù)據(jù)與每個樣本的距離,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("預測", text_list[i], "的標簽是:", mydict.get(index))
  if mydict.get(index) == textlabel_list[i]: # 當計算出來的1個近鄰與測試集正確的標簽相同時,分子加一
    right = right + 1
print('預測準確性:{:.2f}'.format(right / count))

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實現(xiàn)從本地攝像頭和網(wǎng)絡(luò)攝像頭截取圖片功能

    python實現(xiàn)從本地攝像頭和網(wǎng)絡(luò)攝像頭截取圖片功能

    這篇文章主要介紹了python實現(xiàn)從本地攝像頭和網(wǎng)絡(luò)攝像頭截取圖片功能 ,文中給大家提到了python , opencv 打開網(wǎng)絡(luò)攝像頭讀取圖像的實現(xiàn)代碼,需要的朋友可以參考下
    2019-07-07
  • 深入淺析Python2.x和3.x版本的主要區(qū)別

    深入淺析Python2.x和3.x版本的主要區(qū)別

    這篇文章主要介紹了Python2.x和3.x版本的主要區(qū)別,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • python Windows最新版本安裝教程

    python Windows最新版本安裝教程

    這篇文章主要介紹了python Windows最新版本安裝教程,是python的詳細安裝教程和環(huán)境變量的配置,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • 基于python(urlparse)模板的使用方法總結(jié)

    基于python(urlparse)模板的使用方法總結(jié)

    下面小編就為大家?guī)硪黄趐ython(urlparse)模板的使用方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 對python中基于tcp協(xié)議的通信(數(shù)據(jù)傳輸)實例講解

    對python中基于tcp協(xié)議的通信(數(shù)據(jù)傳輸)實例講解

    今天小編就為大家分享一篇對python中基于tcp協(xié)議的通信(數(shù)據(jù)傳輸)實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python使用Pandas處理測試數(shù)據(jù)的方法

    Python使用Pandas處理測試數(shù)據(jù)的方法

    Pandas是一個功能極其強大的數(shù)據(jù)分析庫,可以高效地操作各種數(shù)據(jù)集,這篇文章主要介紹了Python自動化測試-使用Pandas來高效處理測試數(shù)據(jù),需要的朋友可以參考下
    2023-02-02
  • 如何使用Python判斷應用是否處于已打包狀態(tài)

    如何使用Python判斷應用是否處于已打包狀態(tài)

    在使用 PyInstaller 打包 Python 應用時,有時需要在代碼中判斷程序是否處于“打包狀態(tài)”,本文將介紹幾種方法來判斷是否處于打包狀態(tài),感興趣的可以了解下
    2025-03-03
  • Python數(shù)據(jù)分析之PMI數(shù)據(jù)圖形展示

    Python數(shù)據(jù)分析之PMI數(shù)據(jù)圖形展示

    這篇文章主要介紹了Python數(shù)據(jù)分析之PMI數(shù)據(jù)圖形展示,文章介紹了簡單的python爬蟲,并使用numpy進行了簡單的數(shù)據(jù)處理,最終使用?matplotlib?進行圖形繪制,實現(xiàn)了直觀的方式展示制造業(yè)和非制造業(yè)指數(shù)圖形,需要的朋友可以參考一下
    2022-05-05
  • python?pycharm中使用opencv時沒有代碼自動補全提示的解決方案

    python?pycharm中使用opencv時沒有代碼自動補全提示的解決方案

    我們在使用pycharm的時候總是很喜歡其強大的代碼提示功能,下面這篇文章主要給大家介紹了關(guān)于python?pycharm中使用opencv時沒有代碼自動補全提示的解決方案,需要的朋友可以參考下
    2022-09-09
  • python單例模式實例解析

    python單例模式實例解析

    這篇文章主要為大家詳細介紹了python單例模式實例的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論

镇雄县| 泾川县| 辽宁省| 荔浦县| 尤溪县| 措勤县| 东乡族自治县| 新丰县| 固安县| 汽车| 图们市| 夏津县| 垫江县| 柘荣县| 闽侯县| 综艺| 绍兴县| 达尔| 彭阳县| 玉树县| 环江| 黔东| 焦作市| 铁岭县| 河北省| 普安县| 大连市| 陆丰市| 郸城县| 泰来县| 赞皇县| 义马市| 高陵县| 浦江县| 临高县| 历史| 临泉县| 平定县| 阳山县| 聂拉木县| 富裕县|