KNN-iris數據集實現


前言:

上篇介紹了knn的實現過程,這次我們使用庫里自帶的數據集來進行knn的實現。

正文:

import numpy as np
#datasets里面自帶數據集
#本次使用的鳶尾花的數據就包含在其中
#里面還有乳腺癌,波士頓房價等數據可供使用
from sklearn import datasets
#train_test_split函數將你傳入的數據自動分為訓練集和測試集
from sklearn.model_selection import train_test_split
#report用於計算f1等指標的值
#confusion_matrix指混淆矩陣,行相加為真實值,列相加為分類值
#具體可百度,空間有限不過多闡述
from sklearn.metrics import classification_report,confusion_matrix
#operaator里封裝了一些數學函數供使用
import operator
import random
def knn(x_test,x_data,y_data,k):
    #計算樣本數量
    #准確來講計算的是行數
    x_data_size = x_data.shape[0]
    #復制x_test
    np.tile(x_test,(x_data_size,1))
    #計算x_test與每一個樣本的差值
    #這里tile函數之類的如果看不懂可以看我上一篇博客,寫的很詳細
    diffMat = np.tile(x_test,(x_data_size,1))-x_data
    #計算差值的平方
    sqDiffMat = diffMat**2
    #求和
    sqDistances = sqDiffMat.sum(axis=1)
    #開方
    distances = sqDistances**0.5
    #從大到小排序
    sortedDistances = distances.argsort()
    classCount = {}
    for i in range(k):
        #獲取標簽
        votelabel = y_data[sortedDistances[i]]
        #統計標簽數量
        classCount[votelabel] = classCount.get(votelabel,0)+1
    #根據operator.itemgetter(1)-第一個值對classCount排序,然后再取倒序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #獲取數量最多的標簽
    return sortedClassCount[0][0]
#載入數據
iris = datasets.load_iris()
#x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2)
#上面意思是分割數據0.2為測試數據,0.8為訓練數據

#以下方法均是自主打亂數據的方法
#打亂數據
data_size = iris.data.shape[0]
#生成一個列表List
index = [i for i in range(data_size)]
#把列表傳進去之后shuffle函數自動幫我們打亂它
random.shuffle(index)
iris.data = iris.data[index]
iris.target = iris.target[index]

#切分數據集
test_size = 40
x_train = iris.data[test_size:]
x_test = iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]

predictions=[]
for i in range(x_test.shape[0]):
    predictions.append(knn(x_test[i],x_train,y_train,5))

print(classification_report(y_test,predictions))

各類參數如下:

         precision    recall  f1-score   support

      0       1.00      1.00      1.00        20
      1       1.00      0.83      0.91        12
      2       0.80      1.00      0.89         8

avg / total 0.96 0.95 0.95 40

print(confusion_matrix(y_test,predictions))
#可以看出第二行有兩個數據分類錯了,knn算法的預測較為准確
#這里多闡述一下
#正確的預測結果都在對角線上,所以從混淆矩陣中可以很方便直觀的看出哪里有錯誤,因為他們呈現在對角線外面。

[[20 0 0]
[ 0 10 2]
[ 0 0 8]]

總結:

這個算法挺有意思的,可以幫你解決一些分類問題,效率也還不錯。
具體實現流程看上一篇博客會詳細些。
公式依舊是歐式距離。
想開學啊,想吃火鍋了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM