KNN python 简单实现

  • 缺点

      时间复杂度高

      但这是最简单的机器学习了,基本上有编程能力的,看一眼伪代码就可以写出来

  • 伪代码
  1. 计算已知类别数据集中的点与点之间的距离
  2. 按照距离递增次序排列
  3. 选取与当前距离最小的k个点
  4. 确定前k个点所在类别的出现频率
  5. 返回前k个点出现频率最高的类别作为预测分类

  • python代码实现

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))   #element wise divide

    return normDataSet, ranges, minVals


def file2matrix(filename): #用于将txt文件内的数据转换成矩阵
    fr = open(filename)
    numberOfLines = len(fr.readlines())         #获得文件的行数
    returnMat = zeros((numberOfLines,3))        #准备要返回的numpy矩阵
    classLabelVector = []                       #准备labels   
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index += 1

    return returnMat,classLabelVector

def classify0(inX, dataSet, labels, k): #用于分类  [ 分类的向量,训练集,labels标签,k表示选择邻居的数目 ]
    dataSetSize = dataSet.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):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #选择距离最小的k个点
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]

  • 数据集样例
40920   8.326976     0.953952      largeDoses
14488  7.153469     1.673904      smallDoses
26052  1.441871     0.805124      didntLike
75136  13.147394     0.428964      didntLike

猜你喜欢

转载自blog.csdn.net/qq_36336522/article/details/79492558
今日推荐