KNN(1)

KNN--k近邻算法

训练数据,数据+标签,即已知数据及其分类

当新输入数据即测试数据时,计算与训练类的特征相似距离,作为分类结果

主要算法流程如下:

1.在特征空间中,计算测试数据点与训练数据点的距离;

2.筛选距离最小的训练数据点,对应训练数据类的点数越多,即越可能分作该类;

算法代码如下:

def classify0(inX, dataSet, labels, k):
    # 训练数据:dataSet, labels
    # 测试数据:inX
    # 邻域大小:k
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5    # 上述计算所得测试数据与训练数据各点欧式距离
    sortedDistIndices = distances.argsort()    # 距离排序
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndices[i]]    # 距离近的投票制度
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedclassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedclassCount[0][0]

当然,如果多个属性数量级相差较大,容易出现“大数吃小数”的现象,所以可以考虑归一化处理--各特征值减去最小值,再除以极差,代码如下:

def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals    # 极差
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m,1))
    normDataSet = normDataSet / tile(ranges, (m,1))    # 与最小值之差除以极差
    return normDataSet, ranges, minVals

应用举例:

问题描述--海伦交往过的男生分为:不喜欢,魅力一般,极具魅力

样本数据--男生的飞行里程数,玩视频游戏时间,每周消费的冰激凌数量

样本标签--不喜欢1,魅力一般2,极具魅力3

eg,【Jack】 (飞行/千米)1000,(游戏/小时)300,(冰激凌/个)20,(标签)1

新给出Boby男的三个特征数量,预测海伦对他的态度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值