IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 学习笔记之kNN算法 -> 正文阅读

[人工智能]学习笔记之kNN算法

1.、

kNN 算法的算法流程

kNN 算法其实是众多机器学习算法中最简单的一种,因为该算法的思想完全可以用 8 个字来概括:“近朱者赤,近墨者黑”

假设现在有这样的一个样本空间,该样本空间里有宅男和文艺青年这两个类别,其中红圈表示宅男,绿圈表示文艺青年。如下图所示:

其实构建出这样的样本空间的过程就是 kNN 算法的训练过程。可想而知 kNN 算法是没有训练过程的,所以 kNN 算法属于懒惰学习算法。

假设我在这个样本空间中用黄圈表示,如下图所示:

现在使用 kNN 算法来鉴别一下我是宅男还是文艺青年。首先需要计算我与样本空间中所有样本的距离。假设计算得到的距离表格如下:

样本编号121314
标签宅男宅男文艺青年文艺青年
距离11.29.523.337.6

然后找出与我距离最小的 k 个样本(k 是一个超参数,需要自己设置,一般默认为 5),假设与我离得最近的 5 个样本的标签和距离如下:

样本编号45678
标签宅男宅男宅男宅男文艺青年
距离11.29.57.75.815.2

最后只需要对这 5 个样本的标签进行统计,并将票数最多的标签作为预测结果即可。如上表中,宅男是 4 票,文艺青年是 1 票,所以我是宅男。

注意:有的时候可能会有票数一致的情况,比如 k=4 时与我离得最近的样本如下:

样本编号491113
标签宅男宅男文艺青年文艺青年
距离4.29.57.75.8

可以看出宅男和文艺青年的比分是 2:2,那么可以尝试将属于宅男的 2 个样本与我的总距离和属于文艺青年的 2 个样本与我的总距离进行比较。然后选择总距离最小的标签作为预测结果。在这个例子中预测结果为文艺青年(宅男的总距离为 4.2+9.5,文艺青年的总距离为 7.7+5.8)。

2.

kNN 算法的优缺点

从算法流程中可以看出,kNN 算法的优点有:

  • 原理简单,实现简单;
  • 天生支持多分类,不像其他二分类算法在进行多分类时要使用 OvO、 OvR 的策略。

缺点也很明显:?

  • 当数据量比较大或者数据的特征比较多时,预测过程的时间效率太低。、
  • feature :训练集数据,类型为 ndarray;

  • label :训练集标签,类型为 ndarray。

    predict 函数用于实现 kNN 算法的预测过程,函数返回预测的标签,其中:

  • feature :测试集数据,类型为 ndarray。(PS:feature中有多条数据)

  • ?

    # encoding=utf8
    import numpy as np
    
    
    class kNNClassifier(object):
        def __init__(self, k):
            '''
            初始化函数
            :param k:kNN算法中的k
            '''
            self.k = k
            # 用来存放训练数据,类型为ndarray
            self.train_feature = None
            # 用来存放训练标签,类型为ndarray
            self.train_label = None
    
        def fit(self, feature, label):
            '''
            kNN算法的训练过程
            :param feature: 训练集数据,类型为ndarray
            :param label: 训练集标签,类型为ndarray
            :return: 无返回
            '''
    
            # ********* Begin *********#
            self.train_feature = np.array(feature)
            self.train_label = np.array(label)
        
            # ********* End *********#
    
        def predict(self, feature):
            '''
            kNN算法的预测过程
            :param feature: 测试集数据,类型为ndarray
            :return: 预测结果,类型为ndarray或list
            '''
    
            # ********* Begin *********#
            def _predict(test_data):
                distances = [np.sqrt(np.sum((test_data - vec) ** 2)) for vec in self.train_feature]
    
                nearest = np.argsort(distances)
                topK = [self.train_label[i] for i in nearest[:self.k]]
                votes = {}
                result = None
                max_count = 0
                for label in topK:
                    if label in votes.keys():
                        votes[label] += 1
                        if votes[label] > max_count:
                            max_count = votes[label]
                            result = label
                    else:
                        votes[label] = 1
                        if votes[label] > max_count:
                            max_count = votes[label]
                            result = label
                return result
    
            predict_result = [_predict(test_data) for test_data in feature]
            return predict_result
        # ********* End *********#

下面就直接开始用

sklearn 中的 KNeighborsClassifier 类实现了 kNN 算法的分类功能,需要使用 sklearn 中 KNeighborsClassifier 来对红酒数据进行分类。?直接上代码

from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np
def classification(train_feature, train_label, test_feature):
    '''
    对test_feature进行红酒分类
    :param train_feature: 训练集数据,类型为ndarray
    :param train_label: 训练集标签,类型为ndarray
    :param test_feature: 测试集数据,类型为ndarray
    :return: 测试集数据的分类结果
    '''
    #********* Begin *********#
    #实例化StandardScaler函数
    scaler = StandardScaler()
    train_feature = scaler.fit_transform(np.array(train_feature).reshape(133,13))
    test_feature = scaler.transform(np.array(test_feature).reshape(45,13))
    #生成K近邻分类器
    clf = KNeighborsClassifier()
    #训练分类器
    clf.fit(train_feature, train_label.astype('int'))
    #进行预测
    predict_result = clf.predict(test_feature)
    return predict_result 
    #********* End **********#

Numpy中的shape、reshape函数

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:38:36  更:2021-07-11 16:41:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/24 14:44:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码