机器学习算法---kNN算法

kNN-------k-邻近算法

1.kNN是non-parametric分类器,既不做分布式假设,直接从数据估计概率密度;

2.kNN不适用于高维数据


优点:

1.无需估计参数,无需训练;

2.特别适合于多分类问题(对象具有多个标签)。


缺点:

1.当样本容量不平衡是,输入有个新样本,该样本的K个邻值中大容量样本占多数,对分类不利;

2.计算量过大,需要计算待分类文本到每个样本的距离。


改进办法:

1.实现对样本属性进行适当删减,删除对结果影响较小的属性;

2.对距离加权,采取和样本距离小的待分类文本距离权重大。


算法伪代码:

1.计算已知类别数据集中的点与当前点之间的距离;

2.按照距离递增次排序;

3.选取与当前点距离最小的k个点;

4.确定前k个点所在类别的出现频率

5.返回前k个点出现频率最高的类别作为当前点的预测分类


python代码实现KNN算法

def kNN(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]                        #shape[0]读取数组一维长度,既知道有多少个数组
    diffMat = tile(inX, (dataSetSize,1)) - dataSet        #计算欧氏距离
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()              #返回数组值从小到大的索引值
    classCount={}          
    for i in range(k):                                    #将labels对应相应的点
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)    #排序,选出k个距离最小的值
    return sortedClassCount[0][0]
inX:用于分类的输入向量。即将对其进行分类。
dataSet:训练样本集
labels:标签向量
k:k值


你可能感兴趣的:(算法,python,机器学习)