k-近邻算法

概述:

电影可以按照题材分类,然而题材本身又是如何定义的呢?基于不同场景在电影出现的次数,使用k-近邻算法构造程序,自动划分电影类型。


简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类。
优点:精度高,对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。


算法原理:

存在一个样本数据集合,也称为训练样本集,样本中每个数据都存在标签,即我们知道样本中每一数据与分类中的对应关系。输入没有分类的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。然后提取最相近的分类标签。

算法实施:

在kNN.py文件添加以下代码:

from numpy import *
import operator
from os import listdir

def classify0(inX, dataSet, labels, k):
#四个参数 分别为 输入向量 输入样本集 标签向量 最近相邻数目k
    dataSetSize = dataSet.shape[0] 
    #样本集的大小,即矩阵的行数。
#[见我的tile函数介绍](http://blog.csdn.net/u010956473/article/details/72834086 "tile函数")

    sqDiffMat = diffMat**2 
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()  
    #见argsort()介绍   
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

下面是我的测试代码:

from numpy import *
import operator

group=array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0.0,0.1]])
labels=['A','A','B','B']

datasetsize=group.shape[0]
print(datasetsize)

diffMat=tile([0,0], (4,1))-group
print (diffMat)
sqDiffmat=diffMat**2
print(sqDiffmat)
sqDistances=sqDiffmat.sum(axis=1)
print(sqDistances)

distances=sqDistances**0.5
print(distances)

sortedDistIndices=distances.argsort()
print(sortedDistIndices)

classcount={}
print(sortedDistIndices[0])
print(sortedDistIndices[1])
print(sortedDistIndices[2])

print(labels[2])
print(labels[3])
print(labels[1])


classcount={}

for i in range(3):
    votellabel=labels[sortedDistIndices[i]]
    classcount[votellabel]=classcount.get(votellabel,0)+1
    sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)

    print (classcount)

    print(sortedclasscount[0][0])


4
[[-1.  -1.1]
 [-1.  -1. ]
 [ 0.   0. ]
 [ 0.  -0.1]]
[[ 1.    1.21]
 [ 1.    1.  ]
 [ 0.    0.  ]
 [ 0.    0.01]]
[ 2.21  2.    0.    0.01]
[ 1.48660687  1.41421356  0.          0.1       ]
[2 3 1 0]
2
3
1
B
B
A
{'B': 1}
B
{'B': 2}
B
{'B': 2, 'A': 1}
B
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值