- 创建文件:kNN.py和run.py
编辑kNN.py
import numpy
import operator
import matplotlib.pyplot
导入常用库
编辑run.py
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]
- 测试分类方法
编辑run.py
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
显示
代码:
https://download.csdn.net/download/suma110/10766027
吐槽一下,上传的资源竟然不允许设置成免费下载