基于KNN分类算法模型为案例进行机器学习研究 ( 白宁超 2018年7月24日08:52:16 )
导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用。本文通过一个模拟的实际案例进行讲解。整个流程包括:采集数据、数据格式化处理、数据分析、数据归一化处理、构造算法模型、评估算法模型和算法模型的应用。(本文原创,转载必须注明出处: 基于KNN分类算法模型为案例进行机器学习研究)
1 理论介绍什么是KNN?
k-近邻(kNN,k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。k-近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k-邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程即属于有监督学习范畴。k近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。
KNN算法思想
1 计算已知类别中数据集的点与当前点的距离。[即计算所有样本点跟待分类样本之间的距离] 2 按照距离递增次序排序。[计算完样本距离进行排序] 3 选取与当前点距离最小的k个点。[选取距离样本最近的k个点] 4 确定前k个点所在类别的出现频率。[针对这k个点,统计下各个类别分别有多少个] 5 返回前k个点出现频率最高的类别作为当前点的预测分类。[k个点中某个类别最多,就将样本划归改点]KNN工作原理
1 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。 2 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。 3 计算新数据与样本数据集中每条数据的距离。 4 对求得的所有距离进行排序(从小到大,越小表示越相似)。 5 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签。 6 求 k 个数据中出现次数最多的分类标签作为新数据的分类。KNN算法流程
1 搜集数据:数据采集过程,其分为非结构化数据,半结构化数据和数据化数据。诸如:网络爬取,数据库,文件等。 2 准备数据:格式化处理,对不同类别的数据进行统一的格式化处理。诸如:将pdf,word,excel,sql等等统一转化为txt文本。 3 分析数据:主要看看数据特点,有没有缺失值,数据连续性还是离散型,进而选择不同模型。诸如:可视化数据分析 4 训练数据:不适用于KNN,但是在其他一些监督学习中会经常遇到,诸如:朴素贝叶斯分类等。 5 测试算法:评价指标,如计算错误率,准确率,召回率,F度量值等。 6 应用算法:针对完善的模型进行封装重构,然后进行实际应用。KNN优缺点
优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、空间复杂度好 适用数据范围:数值型和标称型 2 KNN算法实现与分析 2.1 数据准备创建模拟数据集
描述:现在你来了一个新的任务,任务其实非常简单,就是根据吃冰淇淋和喝水的数量判断成都天气冷热程度。你现在要做的就是去成都春熙路街头采访记录一些游客吃了多少冰淇淋,又喝了几瓶水,他觉得成都天气怎么样(这里只考虑二分类问题,假设只有‘非常热’和‘一般热’)。其中特征向量包括两个分别是冰激凌数t1和喝水数t2,标签类别分别是非常热A和一般热B。
现在我们开始行动,随机采访4个游客(暂时不考虑样本数量问题),询问每个游客吃多少冰淇淋和喝多少水(两个整型的特征向量,不考虑特征重要程度),并记录下他们口中的成都天气感受(非常热A与一般热B)。然后通过采访数据训练一个KNN分类器,新的游客只需要说出特征向量自动判别成都天气冷热程度。创建模拟数据集代码如下:
'''KNN创建数据源,返回数据集和标签''' def create_dataset(): group = array(random.randint(0,10,size=(4,2))) # 数据集 labels = ['A','A','B','B'] # 标签 return group,labels运行查看数据集的特征向量和分类标签:
'''1 KNN模拟数据分类算法''' dataset,labels = create_dataset() print('特征集:\n'+str(dataset)) print('标签集:\n'+str(labels))运行结果:
特征集: [[8 4] [7 1] [1 4] [3 0]] 标签集: ['A', 'A', 'B', 'B']分析解读: