一个简易的KNN

#代码参考机器学习实践(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)的分类结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值