• 数据挖掘领域十大经典算法之—K-邻近算法/kNN(超详细附代码)


    ​简介

    又叫K-邻近算法,是监督学习中的一种分类算法。目的是根据已知类别的样本点集求出待分类的数据点类别。

    基本思想

    kNN的思想很简单:在训练集中选取离输入的数据点最近的k个邻居,根据这个k个邻居中出现次数最多的类别(最大表决规则),作为该数据点的类别。kNN算法中,所选择的邻居都是已经正确分类的对象。

    算法复杂度

    kNN是一种lazy-learning算法,分类器不需要使用训练集进行训练,因此训练时间复杂度为0;kNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为n,那么kNN的分类时间复杂度为O(n);因此,最终的时间复杂度是O(n)。

    优缺点

    优点

    1. 理论成熟,思想简单,既可以用来做分类也可以用来做回归 ;

    2. 适合对稀有事件进行分类(例如:客户流失预测);

    3. 特别适合于多分类问题(multi-modal,对象具有多个类别标签,例如:根据基因特征来判断其功能分类), kNN比SVM的表现要好。

    缺点

    1. 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数;

    2. 计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点;

    3. 可理解性差,无法给出像决策树那样的规则。

    代码

    # -*- coding: utf-8 -*-
    """
    Created on Tue Sep 15 20:53:14 2020
    
    @author: Administrator
    """
    
    # coding:utf-8
    
    import numpy as np
    
    def createDataset():
        '''
        创建训练集,特征值分别为搞笑镜头、拥抱镜头、打斗镜头的数量
        '''
        learning_dataset = {"宝贝当家": [45, 2, 9, "喜剧片"],
                  "美人鱼": [21, 17, 5, "喜剧片"],
                  "澳门风云3": [54, 9, 11, "喜剧片"],
                  "功夫熊猫3": [39, 0, 31, "喜剧片"],
                  "谍影重重": [5, 2, 57, "动作片"],
                  "叶问3": [3, 2, 65, "动作片"],
                  "伦敦陷落": [2, 3, 55, "动作片"],
                  "我的特工爷爷": [6, 4, 21, "动作片"],
                  "奔爱": [7, 46, 4, "爱情片"],
                  "夜孔雀": [9, 39, 8, "爱情片"],
                  "代理情人": [9, 38, 2, "爱情片"],
                  "新步步惊心": [8, 34, 17, "爱情片"]}
        return learning_dataset
    
    def kNN(learning_dataset,dataPoint,k):
        '''
        kNN算法,返回k个邻居的类别和得到的测试数据的类别
        '''
        # s1:计算一个新样本与数据集中所有数据的距离
        disList=[]
        for key,v in learning_dataset.items():
           #对距离进行平方和开根号
           d=np.linalg.norm(np.array(v[:3])-np.array(dataPoint))
           #round四舍五入保留两位小数,并添加到集合中
           disList.append([key,round(d,2)])
    
        # s2:按照距离大小进行递增排序
        disList.sort(key=lambda dis: dis[1]) 
        # s3:选取距离最小的k个样本
        disList=disList[:k]
        # s4:确定前k个样本所在类别出现的频率,并输出出现频率最高的类别
        labels = {"喜剧片":0,"动作片":0,"爱情片":0}
        #从k个中进行统计哪个类别标签最多
        for s in disList:  
            #取出对应标签
            label = learning_dataset[s[0]] 
            labels[label[len(label)-1]] += 1
        labels =sorted(labels.items(),key=lambda asd: asd[1],reverse=True)
    
        return labels,labels[0][0]
    
    
    if __name__ == '__main__':
    
        learning_dataset=createDataset()
        testData={"唐人街探案": [23, 3, 17, "?片"]}
        dataPoint=list(testData.values())[0][:3]
        
        k=6
    
        labels,result=kNN(learning_dataset,dataPoint,k)
        print(labels,result,sep='
    ')

    欢迎关注公众号:Python爬虫数据分析挖掘,回复【开源源码】免费获取更多开源项目源码

    公众号每日更新python知识和【免费】工具

    耐得住寂寞,才能登得顶
    Gitee码云:https://gitee.com/lyc96/projects
  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/chenlove/p/13707855.html
Copyright © 2020-2023  润新知