K分类算法

来源:互联网 发布:2016人工智能论坛 编辑:程序博客网 时间:2024/06/05 06:26

K - Classify


    • K - Classify
      • K 分类是个什么玩意儿
      • K 分类的过程
      • K-Classify的Python实现
      • K分类到此为止了么
        • 归一化过程
        • 归一化的Python实现

K 分类是个什么玩意儿?

很简单,K分类用四个字来概括就是物以类聚,如果要再加四个字的话就是人以群分。

K 分类的过程

  1. 导入训练样本集合(这个必须有)。每个样本拥有一个或多个已经确定好的特征并且存在一个确定的标签(Label)。

    • K-Classify算法通过完成对训练样本根据标签进行分类的过程建立一个多维坐标系(先这么理解),坐标系的维度就是样本的特征数目。样本集合中的每一个数据都会抽象为坐标系上的一个点。
  2. 导入测试样本集合(KNN已经开始啦~~),将样本集合中的每一个数据继续抽象(想象)为多维坐标系中的一个点。

  3. 对样本集合中的每一个数据,计算其与训练样本中全部数据的距离。此处使用了我们初中时学过的坐标系中两点间的距离公式:
    d=(x0y0)2+(x1y1)2+(x2y2)2+...+(xnyn)2
  4. 选择K个(没错,就是K-Classify的K)距离样本数据最近的点,读取它们的标签,根据少数服从多数原则,确定样本数据的标签(Label)。

K-Classify的Python实现

以下是K分类算法的Python代码

import numpy as np#inputMatrix: 输入的测试样本集,dataSet: 测试样本集数据(无标签),labels:测试样本集标签def K_algorithm(inputMatrix, dataSet, labels, k):    dataSetSize = dataSet.shape[0]    distanceMat = tile(inputMatrix, (dataSetSize, 1)) - dataSet    distance = (distanceMat**2.sum(axis = 1))**0.5    distancesI = np.argsort(distance, axis = 0)    count = {}    for index in range(k):        label = labels[distancesI[i]]        count[label[0]] = count.get(labels[0], 0)+1        sortedResult = sorted(count.intms(), key = operator.itemgetter(1), reverse = True)    return sortedResult[0][0]   

K分类到此为止了么?

Absolutely not,虽然现在我们已经有了K分类的结果,但是这个结果并不是最优解,由于K分类的结果基本上取决于那些在数值上较大的特征值,例如:如果一个特征值为年龄,另一个为薪水,那么年龄的值一般来说会比薪水值小很多,也就很难影响到K分类的结果。所以,我们就要对K分类数据的各个特征值进行归一化计算,从而减少由于数值大小所带来的影响。

归一化过程:

  1. 选择数据某一特征的所有可能值,并得到这些可能值中的最大和最小值。
  2. 通过计算最大最小值的差得到取值区间。
  3. 用所有的可能值与最小值的差除以取值区间,得到归一化之后的值。

归一化的Python实现

def normalization(dataSet):    min = dataSet.min(axis = 0)    max = dataSet.max(axis = 0)    range = max - min    num = dataSet.shape(0)    normData = dataSet - tile(min, (m, 1))    normData = normData/tile(range, (num,1))    return normData