KNN(最近邻规则分类)

874 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

KNN算法比较适用于样本容量比较大的类域的自动分类。 KNN算法的核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。

一、实现思路

1、计算未知类别实例与所有已知类别实例的距离

2、设定参数k,选择k个里未知类别实例最近的已知类别实例

3、统计k个已知类别实例中各个类别的数量,数量最多的类别,即为当前未知类别实例的类别

(一)距离的计算公式

KNN算法中一个重要的问题是计算样本之间的距离, 两个实例点之间的距离表达了两者之间的相似程度。 在实际应用中,我们需要根据实际应用场景和数据本身的特点选择相似度度量的方法。

这里距离的计算我之前的文章常用相似度度量方法

(二)k值的选择

一般而言,k将设置为基数(防止k个实例中,不同类别的数量相同),从k=1开始,随着的逐渐增大,K近邻算法的分类效果会逐渐提升;在增大到某个值后,随着的进一步增大,K近邻算法的分类效果会逐渐下降。

image.png

二、KNN算法实现(欧式距离)

(一)输入

  • 未知样本的特征
  • 已知样本的特征
  • 已知样本的标签
  • k值
def knn(x_test, x_data, y_data, k):
		# TO DO
		return sortedClassCount[0][0]

(二)输出

  • 输出:未知样本的标签

(三)算法流程

1、计算未知样本与每个已知样本之间的距离(欧氏距离)

 x_data_size = x_data.shape[0]
 np.tile(x_test, (x_data_size,1))
 diffMat = np.tile(x_test, (x_data_size,1)) - x_data
 sqDiffMat = diffMat**2
 sqDistances = sqDiffMat.sum(axis=1)
 distances = sqDistances**0.5

2、对距离进行排序,取出k个最小的距离的已知样本

sortedDistances = distances.argsort()

3、统计k个样本的标签数量

 for i in range(k):
        # 获取标签
        votelabel = y_data[sortedDistances[i]]
        # 统计标签数量
        classCount[votelabel] = classCount.get(votelabel,0) + 1

4、返回数量最多的标签

    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]