原生python實現knn分類演算法,用鳶尾花資料集

2021-09-28 15:37:47 字數 4112 閱讀 9785

1.作業題目

原生python實現knn分類演算法,用鳶尾花資料集

2.演算法設計

knn演算法設計思路:

演算法涉及3個主要因素:

訓練資料集

距離或相似度的計算衡量

k的大小

對於確定未知類別:

1.計算已知類別資料集中的點與當前點的距離(距離的計算一般使用歐氏距離或曼哈頓距離)

2.按照距離依次排序

3.選取與當前點距離最小的k個點

4.確定前k個點所在類別的出現概率

5.返回前k個點出現頻率最高的類別作為當前點**分類

3.有注釋的源**

資料分類.py:

#!/usr/bin/env python 

# -*- coding:utf-8 -*-

import numpy as np

def train_test_split(x,y,test_ratio=0.2,seed=none):

"""將資料 x 和 y 按照test_ratio分割成x_train, x_test, y_train, y_test"""

assert x.shape[0]==y.shape[0]

assert 0.0<=test_ratio<=1.0

if seed:

np.random.seed(seed)

shuffle_indexes = np.random.permutation(len(x))

test_size = int(len(x)*test_ratio)

test_indexes = shuffle_indexes[:test_size]

train_indexes = shuffle_indexes[test_size:]

x_train = x[train_indexes]

y_train = y[train_indexes]

x_test = x[test_indexes]

y_test = y[test_indexes]

return x_train,x_test,y_train,y_test

鳶尾花knn演算法實現:

#!/usr/bin/env python 

# -*- coding:utf-8 -*-

import numpy as py

import operator

from 資料分類 import train_test_split

import pandas as pd

from sklearn import datasets

'''載入鳶尾花資料集'''

iris = pd.read_csv('iris.data', header=none)

x = iris.iloc[0:150, 0:4].values

y = iris.iloc[0:150, 4].values

x_train, x_test, y_train, y_test = train_test_split(x,y)

#knn演算法

def knn(trainset,label,testset,k):

# 求差的平方和---注意:陣列可以做加減,此處均為陣列

distance=(trainset-testset)**2

# 對陣列的每一行求和,axis=1為對行求和,axis=0為對每列求和

distanceline=distance.sum(axis=1)

finaldistance=distanceline**0.5

# 獲得排序後原始下角標

sortedindex=finaldistance.argsort()

# 獲得距離最小的前k個下角標

index=sortedindex[:k]

# 字典 key為標籤,value為標籤出現的次數

labelcount={}

for i in index:

templabel=label[i]

labelcount[templabel]=labelcount.get(templabel,0)+1

# operator.itemgetter(1)意思是按照value值排序,即按照歐氏距離排序

sortedcount=sorted(list(labelcount.items()),key=operator.itemgetter(1),reverse=true)

return sortedcount[0][0]#輸出標籤出現最多的那個

#**正確率

def predict(trainset,trainlabel,testset,k):

total=len(testset)

truecount=0

for i in range(len(testset)):

label=knn(trainset,trainlabel,testset[i],k)

if label in testlabel[i]:

truecount=truecount+1

return "**準確率為:{}".format(float(truecount)/float(total))

if __name__=='__main__':

trainset,trainlabel=x_train, y_train#訓練資料以及標籤

testset, testlabel = x_test, y_test #測試資料以及標籤

print((predict(trainset,trainlabel,testset,3)))

4.測試用例設計及除錯過程截圖

測試用例設計:

輸入資料:

鳶尾花資料集(『iris.data』,儲存在python工程中,可直接執行)中每個樣本x包含了花萼長度(sepal length)、花萼寬度(sepal width)、花瓣長度(petal length)、花瓣寬度(petal width)四個特徵。樣本標籤y共有三類,分別是setosa,versicolor和virginica。iris資料集總共包含150個樣本,每個類別由50個樣本,整體構成乙個150行5列的二維表,80%為訓練集,20%為測試集。

預期結果:90%以上。

除錯過程:

設定斷點,只用訓練資料進行訓練和測試,結果為1即100%。

設定斷點,用訓練資料做訓練集,測試資料做測試集,此時結果發生變化,準確率降低。

鳶尾花knn演算法**執行結果:

準確率約為96.67%,說明訓練模型比較可信。

5.總結

這次的作業總的來說完成度還可以,將鳶尾花資料集放在python工程中,然後在運用時通過檔名進行直接呼叫,沒有利用庫中原本就有的函式,但遺憾的是參考了網上的部分**,然後進行理解,對knn演算法也有了一定程度的理解,在執行過程中發現執行速度較慢,鳶尾花資料集為150個資料,執行時間約為0.00398922s。其中,遇到的問題是怎麼將鳶尾花的資料分為訓練集和測試集,將資料分類擷取,一部分作為訓練集,一部分作為測試集,這裡佔比為80%和20%,然後再結合knn演算法的思路完善程式。

knn的特點:

優點(1)監督學習:可以看到,knn演算法首先需要乙個訓練樣本集,這個集合中含有分類資訊,因此它屬於監督學習。

(2)通過計算距離來衡量樣本之間相似度,演算法簡單,易於理解和實現。

缺點(1)需要設定k值,結果會受到k值的影響,通過上面的例子可以看到,不同的k值,最後得到的分類結果不盡相同。k一般不超過20。

(2)計算量大,需要計算樣本集中每個樣本的距離,才能得到k個最近的資料樣本。

(3)訓練樣本集不平衡導致結果不準確問題。當樣本集中主要是某個分類,該分類數量太大,導致近鄰的k個樣本總是該類,而不接近目標分類。

6.參考文獻:

原生Python實現KNN分類演算法

原生python實現knn分類演算法,用鳶尾花資料集。knn是一種聚類演算法,用於對新的資料點進行分類。對於乙個只知道特徵的資料點,首先計算它和已知訓練集所有點的距離,然後選擇最近的k個點進行 投票表決 來決定所屬型別。因為訓練集的標籤是已知的,所以根據 投票 結果,判定該點的型別為 票數 最多的類...

原生python實現knn分類演算法

一 題目 原生python實現knn分類演算法 二 演算法設計 k 近鄰 k nearset neighbor,簡稱 knn 學習是一種常用的監督學習方法,其工作機制非常簡單 給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的 k 個訓練樣本,然後基於這 k 個 鄰居 的資訊來進行觀測。通常,在...

原生python實現knn演算法

1 knn演算法的思想 就是在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料 現次數最多的那個分類。2 演算法設計 根據knn演算法的思想可以得到knn演算法的步驟為 1 計算測...