K-近鄰分類算法的python實現-鳶尾花數據集

import numpy as np
import operator as opt
import matplotlib.pyplot as plt
import collections as clt
from sklearn import datasets

# K-近鄰算法 鳶尾花數據測試

# KNN分類算法
# 算法描述:
# 1.參數說明:待分類向量x、訓練數據集(特徵向量組)A、標籤向量、參數(k)
# 2.計算x與A中所有向量的距離,並返回排序索引數組
# 3.標籤向量使用2中的索引數組,取出前k個標籤名,出現次數最多的就是x的標籤


def KNN(x, dataSet, lable, k):
    
    assert 1 <= k <= dataSet.shape[0] ," k must be valid "
    assert dataSet.shape[0]==lable.shape[0],"數據集和標籤集不對等"
    assert x.shape[0] == dataSet.shape[1],"待測數據與數據集特徵數不相等"

    # 計算距離
    # 計算測試數據集rows(數據量)
    dataSetSize = dataSet.shape[0]
    # 將x擴展爲dataSet同大小的矩陣,
    # 使用numpy中的universal function對矩陣元素分別進行計算的原則,避免使用循環
    X = np.tile(x, (dataSetSize, 1))  # 複製dataSetSize-1個x向量
    # 計算距離
    distances = (((X-dataSet)**2).sum(axis=1))**0.5
    # 根據距離進行排序,並返回索引數組
    index_SortByDistance = distances.argsort()
    # 獲取距離最近的三個標籤
    hyperLables = []
    for i in range(k):
        hyperLables.append(lable[index_SortByDistance[i]])
    # 獲取出現次數最多的標籤
    return clt.Counter(hyperLables).most_common(1)[0][0]


# 獲取鳶尾花數據集
iris = datasets.load_iris()
# 訓練數據:每種花選取25個數據,注意標籤要和數據一一對應
datasets = np.vstack(
    (iris.data[0:25, ...], iris.data[50:75, ...], iris.data[100:125, ...]))
lable = np.hstack(
    (iris.target[0:25], iris.target[50:75], iris.target[100:125]))

# 遍歷剩下的待分類數據

a = [i for i in range(150) if ((i >= 25) and (i < 50)) or (
    (i >= 75) and (i < 100)) or ((i >= 125) and (i < 150))]
success_num = 0
fail_num = 0
for i in a:
    x = iris.data[i, ...]
    xtarget = KNN(x, datasets, lable, 1)
    if(iris.target_names[xtarget] == iris.target_names[iris.target[i]]):
        # print("分類成功")
        success_num += 1
    else:
        # print("分類失敗")
        fail_num += 1

print("分類完成:成功({});失敗({})".format(success_num, fail_num))

使用sklearn封裝好的KNN算法

import numpy as np 
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn import datasets

# 獲取鳶尾花數據集
iris = datasets.load_iris()
# 訓練數據:每種花選取25個數據,注意標籤要和數據一一對應
dataSet = np.vstack((iris.data[0:25, ...], iris.data[50:75, ...], iris.data[100:125, ...]))
lable = np.hstack((iris.target[0:25], iris.target[50:75], iris.target[100:125]))

# 創建KNN分類器
# 1.sklearn 中的算法都被包裝成面向對象風格,因此使用算法時,要先實例化
KNN_classifier = KNN(n_neighbors=6) #規定 k = 6
# 2.fit 爲訓練模型的過程,由於KNN本質上無模型,但是爲了和別的算法統一,將訓練數據集當作模型
KNN_classifier.fit(dataSet,lable)
# 3.進行預測(分類)
X = np.vstack((iris.data[25:50, ...], iris.data[75:100, ...], iris.data[125:150, ...]))
result = KNN_classifier.predict(X)
print(result)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章