机器学习——K-近邻算法
发布时间
阅读量:
阅读量
(一)K-近邻算法概述
该算法作为核心任务之一,在分类与回归领域具有基础性作用。
其基本思路在于:
对于给定的一组训练样本及其待识别的目标样本,
随后识别出目标样本在特征空间中最接近的前k个训练样本,
最后通过这些训练样本所属类别数量最多的类别作为预测结果。
2. 该𝐾-近邻模型相当于依据训练数据集将特征空间划分为若干区域。 在𝐾近邻法中,一旦选定训练集、采用的距离度量方法、选取的𝐾值以及分类决策原则,则其分类结果必然唯一确定。
在k近邻方法中包含三个基本构成要素:计算方式、参数选择以及分类依据。常用的计算方式包括欧氏距离及其推广形式pL距离。而当参数设置较小时(即k值较小时),模型会变得更加复杂;反之,则会变得更加简单。这种参数设置反映了在减少近似误差的同时也会增加估计误差之间的平衡关系,在实际应用中通常会通过交叉验证的方法来确定最佳参数。
常用的分类决策规则是多数表决,对应于经验风险最小化。
4.在实现过程中的k近邻法需要考虑如何高效地搜索出k个最近邻点,并依据分类决策规则来进行判断以确定最终点的归类。
(二)算法步骤
k-近邻算法步骤如下:
计算当前点与已知类别数据集中各点之间的距离;
按距离从小到大排序;
选取与当前点距离最近的前k个样本;
统计这些样本中各类别出现的频率;
将归类到出现频率最高的类别作为预测结果。
通过KNN算法区分爱情片与动作片,《图1-1》展示了6部电影中的打斗镜头及接吻数目。

(三)代码实现
# -*- coding: UTF-8 -*-
import collections
import numpy as np
def createDataSet():
#四组二维特征
group = np.array([[1,101],[5,89],[108,5],[115,8]])
print(group)
#四组特征的标签
labels = ['爱情片','爱情片','动作片','动作片']
return group, labels
def classify(inx, dataset, labels, k):
# 计算距离 其实就是计算点一定之间的距离
dist = np.sum((inx - dataset)**2, axis=1)**0.5
#print("dist",dist)
# k个最近的标签
# dist.argsort 将x中的元素从小到大排列,提取其对应的index(索引)
k_labels = [labels[index] for index in dist.argsort()[0 : k]]
print('k_labels', k_labels)
# 出现次数最多的标签即为最终类别
#主要功能:可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
print('k_labels',collections.Counter(k_labels).most_common(1)[0][0])
label = collections.Counter(k_labels).most_common(1)[0][0]
return label
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
test = [55,20]
#kNN分类
#test_class = classify0(test, group, labels, 3)
test_class = classify(test, group, labels, 3)
#打印分类结果
print(test_class)

(四)总结
优点:
1.k近邻算法理论简单,容易实现。
2.准确性高,对异常值和噪声有较高的容忍度
缺点:
1.k取值很小容易受异常点影响;k取值很小容易受数量波动影响
全部评论 (0)
还没有任何评论哟~
