1 k-近鄰演算法
阿新 • • 發佈:2018-12-19
import numpy
import operator
import matplotlib.pyplot
import kNN
- 建立資料 編輯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
- 顯示資料 編輯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
- 實現分類功能 編輯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
顯示
- 輸入並預測分類 編輯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
顯示