1. 程式人生 > >1 k-近鄰演算法

1 k-近鄰演算法

import numpy
import operator
import matplotlib.pyplot 
import kNN
  1. 建立資料 編輯kNN.py 實現建立資料方法:DataSetForCreate 在方法中返回分類資料和資料標籤
def DataSetForCreate():
    dataset = numpy.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = [1, 1, 2, 2]
    return dataset, labels
  1. 顯示資料 編輯kNN.py 實現顯示資料方法:ShowPlotForCreate
def ShowPlotForCreate():
    dataset, labels = DataSetForCreate()
    figure = matplotlib.pyplot.figure()
    subplot = figure.add_subplot(111)
    subplot.scatter(dataset[:, 0], dataset[:, 1], 15.0 * numpy.array(labels), 15.0 * numpy.array(labels))
    matplotlib.pyplot.show()
kNN.ShowPlotForCreate()

開啟命令列,輸入:

python ./run.py

顯示: 在這裡插入圖片描述 右上角的黑色點是值為1的label,左下角的黃點是值為2的label

  1. 實現分類功能 編輯kNN.py 實現分類方法:Classify 先以虛擬碼的方式實現該方法:
def Classify(資料矩陣, 資料標籤, 輸入資料):
	1. 計算輸入資料與資料矩陣中各項資料的距離
	2. 將距離排序,獲取與輸入資料距離最近的資料矩陣資料
	3. 通過距離最近的資料矩陣資料獲取與之對應的資料標籤
	4. 整理標籤,瞭解哪個標籤下有多少條資料與輸入資料距離較近
	5. 返回與輸入資料距離較近的最多資料矩陣資料的標籤

再以真實程式碼實現該方法:

def Classify(dataset, labels, input, k):
    datasetSize = dataset.shape[0]
    # 生成輸入矩陣
    inputMatrix = numpy.tile(input, (datasetSize, 1))
    # 輸入矩陣和資料矩陣的矩陣差
    diffMatrix = inputMatrix - dataset
    # 矩陣差的乘積
    sqDiffMatrix = diffMatrix ** 2
    # 矩陣差的乘積和
    sqDistances = sqDiffMatrix.sum(axis=1)
    # 輸入矩陣和資料矩陣的距離
    distances = sqDistances ** 0.5
    # 輸入矩陣和資料矩陣的距離排序(獲取距離從小到大排序後的序列列表)
    sortDistanceIndexes = distances.argsort()
    # 根據距離排序統計最近的k個標籤的數量
    classifyCount = {}
    for i in range(k):
        index = sortDistanceIndexes[i]
        label = labels[index]
        # 標籤數量統計中若不存在標籤,則預設數量為0
        classifyCount[label] = classifyCount.get(label, 0) + 1
    # 將標籤根據數量進行排序,並將數量作為鍵名標籤作為鍵值獲取字典
    sortClassifyCount = sorted(classifyCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortClassifyCount[0][0]
dataset, labels = kNN.DataSetForCreate()
print(kNN.Classify(dataset, labels, [0.1, 0.2], 3))
print(kNN.Classify(dataset, labels, [0.8, 0.9], 3))
python ./run.py

顯示 在這裡插入圖片描述

  1. 輸入並預測分類 編輯kNN.py 實現方法:ClassifyForCreateWithInput
def ClassifyForCreateWithInput():
    # 獲取輸入的資料
    x = float(input('input x: '))
    y = float(input('input y: '))
    # 將輸入資料轉成陣列
    inputData = numpy.array([x, y])
    # 獲取訓練資料和標籤
    dataset, labels = DataSetForCreate()
    # 獲取d輸入資料的預測標籤
    label = Classify(dataset, labels, inputData, 3)
    print('input label should be: %d'%(label))
kNN.ClassifyForCreateWithInput()

執行

python ./run.py

顯示 在這裡插入圖片描述