#代码参考机器学习实践(Machine Learning in Action)
from numpy import *
import operator #运算符模块
import matplotlib.pyplot as plt
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
def plotDataset(x,y):
#绘制dataset的图像
plt.scatter(x[:,0],x[:,1])
for i in range(len(x)):
plt.annotate(y[i], xy = (x[:,0][i], x[:,1][i]), xytext = (x[:,0][i]+0.01, x[:,1][i]+0.01))
# 这里xy是需要标记的坐标,xytext是对应的标签坐标
plt.show()
def classify0(inX, dataset, labels, k):
#k临近算法(KNN)
#inX:用于分类的输入向量(需要被分类的向量)
#dataset:输入的训练样本集
#labels:输入的标签向量,行数和dataset相同(每个dataset中的数据都要有一个标签)
#k:选择最近邻居的数目
#######
#1. 计算已知类别数据集中的点与当前点之间的距离(欧式距离)
dataSize = dataset.shape[0]
extend = tile(inX, (dataSize, 1))#将inX纵向铺展开,避免了循环,加快计算速度
#计算欧氏距离
diffMat = extend - dataset
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
euclidean_metric = sqDistance**0.5
#2. 按照距离递增次序排序
sortedDistIndicies = euclidean_metric.argsort()#返回数组值从小到大的索引值
#3. 选择距离最近的k个点#4. 确定前k个点标签出现的频率
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#5. 返回前k个点中标签频率出现最高的类别作为当前点的预测分类
sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)#对classCount排序,降序。itemgetter()函数,是获取对象指定域中的值
return sortedClassCount[0][0]
if __name__ == "__main__":
group, labels = createDataset()
plotDataset(group, labels)
print("group",group)
print("classify",classify0([1,2],group,labels,3))
结果:
dataset:
坐标(1,2)的分类结果: