K-近邻算法的一般流程:
(1)收集数据:比如问卷法,观察法等等。
(2)准备数据:距离计算所需的数值,最好是结构化的数据格式。
(3)分析数据:聚类分析、因子分析、相关分析、对应分析、回归分析、方差分析等。
(4)训练算法:在k-近邻中一般不用。
(5)测试算法:计算错误率。
(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据
分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
我们来实施kNN算法,为每组数据分类,先给出其实现思路如下:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的每个点与当前点之间的距离:
(2)按照距离递增次序排序;
(3)选取与当前距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
实现代码如下:
# !/usr/bin/env python # -*-coding:utf-8-*- # Author:TG # Python实现K-NN算法 from numpy import * import operator def createDataSet(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = ['A', 'A', 'B', 'B'] return group, labels group, labels = createDataSet() # 用Pyton实现K-NN(邻近)算法 def classify(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] print dataSetSize # 输出DataSetSize diffMat = tile(inX, (dataSetSize, 1)) - dataSet print tile(inX, (dataSetSize, 1)) print "=================================" print diffMat sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) distance = sqDistances ** 0.5 # ================================== sortedDisIndicies = distance.argsort() print sortedDisIndicies classCount = {} print "=================================" for i in range(k): votellable = labels[sortedDisIndicies[i]] print i print sortedDisIndicies[i], votellable classCount[votellable] = classCount.get(votellable, 0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) print (sortedClassCount) return sortedClassCount[0][0] # 调用测试数据 classify([0, 0.2], group, labels, 3)