鸢尾花数据集knn算法可视化(在R中找到鸢尾花数据)

kNN处理鸢尾花数据集kNN(KNearestNeighbor)算法是机器学习中最基础入门,也是最常用的算法之一,可以解决大多数分类与回归问题。这里以鸢尾花数据集为例,讨论分类问题中的kNN的思想。鸢尾花数据集内包含3类共150条记录,每类各50个数据,每条记录都有4项特征:花萼长度(sepallength)、花萼宽度(sepalwidth)、花瓣长度(petal…

大家好,又见面了,我是你们的朋友全栈君。

kNN(K Nearest Neighbor)算法是机器学习中最基础入门,也是最常用的算法之一,可以解决大多数分类与回归问题。这里以鸢尾花数据集为例,讨论分类问题中的 kNN 的思想。

鸢尾花数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal length)。

可以通过这 4 个特征预测鸢尾花卉属于(iris-setosa,,iris-versicolour, iris-virginica)中的哪一品种,这里使用 kNN 来预测。

首先,导入鸢尾花数据集(两种方式,一种是下载鸢尾花数据集,然后从文件读取,我们采用第二种,直接从datasets中读取,返回的是字典格式的数据),并将鸢尾花数据集分为训练集和测试集。

iris = datasets.load_iris()
X = iris.data
y = iris.target
# 随机划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, random_state=20, 														shuffle=True)

为了方便理解 kNN,将鸢尾花的训练数据的前两个特征值,分别作为 x 轴和 y 轴数据,进行可视化。

# 数据可视化
plt.scatter(X_train[y_train == 0][:, 0], X_train[y_train == 0][:, 1], color='r')
plt.scatter(X_train[y_train == 1][:, 0], X_train[y_train == 1][:, 1], color='g')
plt.scatter(X_train[y_train == 2][:, 0], X_train[y_train == 2][:, 1], color='b')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()

在这里插入图片描述

如图所示,三个不同的颜色分别代表鸢尾花的三个类别。现在如果有一个新的数据(图中黑色点表示),如何判断它属于哪个类别呢?

我们需要使用的 kNN 算法,正如它的英文 K Nearest Neighbor,算法的核心思想是,选取训练集中离该数据最近的 k 个点,它们中的大多数属于哪个类别,则该新数据就属于哪个类别。

根据它的核心思想,模型中有三个需要确定的要素:

  • k 如何选择
  • 如何确定「最近」,也就是如何度量距离
  • 如何确定分类的规则

其中,k 的选择是一个超参数的选择问题,需要通过调整 K 的值确定最好的 K,最好选奇数,否则会出现同票。

可以通过交叉验证法确定模型的最佳 k 值(这里后面会谈);

度量距离的方式,一般为 Lp 距离:

在这里插入图片描述

p = 1 时,为曼哈顿距离:

鸢尾花数据集knn算法可视化(在R中找到鸢尾花数据)

p = 2 时,为欧式距离:

在这里插入图片描述

欧式距离是我们最常用的计算距离的方式。

分类的规则,采取多数表决的原则,即由输入实例的 k 个近邻的训练实例中的多数类决定输入实例的类。

代码如下:

# 计算距离,默认为欧氏距离
def calculateDistance(data1, data2, p=2):
    if len(data1) == len(data2) and len(data1) >= 1:
        sum = 0
        for i in range(len(data1)):
            sum += math.pow(abs(data1[i] - data2[i]), p)
            dist = math.pow(sum, 1/p)
    return dist

# knn模型分类
def knnClassify(X_train, y_train, test_data, k):
    dist = [calculateDistance(train_data, test_data) for train_data in X_train]
    # 返回距离最近的k个训练样本的索引(下标)
    indexes = np.argsort(dist)[:k]
    count = Counter(y_train[indexes])
    return count.most_common(1)[0][0]

if __name__ == '__main__':
    # 预测结果
    predictions = [knnClassify(X_train, y_train, test_data, 3) for test_data in X_test]
    # 与实际结果对比
    correct = np.count_nonzero((predictions == y_test) == True)
    print("Accuracy is: %.3f" % (correct/len(X_test)))

这里是自己实现的分类代码,在 sklearn 中有封装好的 kNN 库,代码如下:

# 创建kNN_classifier实例
kNN_classifier = KNeighborsClassifier(n_neighbors=3)
# kNN_classifier做一遍fit(拟合)的过程,没有返回值,模型就存储在kNN_classifier实例中
kNN_classifier.fit(X_train, y_train)
correct = np.count_nonzero((kNN_classifier.predict(X_test) == y_test) == True)
print("Accuracy is: %.3f" % (correct/len(X_test)))

kNN 没有显式的学习过程,这是它的优点,但在用它进行数据分类时,需要注意几个问题:

  • 不同特征有不同的量纲,必要时需进行特征归一化处理
  • kNN 的时间复杂度为O(D*N*N),D 是维度数,N 是样本数,这样,在特征空间很大和训练数据很大时,kNN 的训练时间会非常慢。这时就需要用到 kd 树,可以将时间复杂度降为O(logD*N*N)(kd 树后面会讲)。

参考文章:机器学习-kNN 算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128790.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java基础&笔试题

    Java基础&笔试题

  • python基础(7)内置函数divmod用法

    python基础(7)内置函数divmod用法前言我们都知道,python中//代表整数运算中的取整,%代表整数运算中的取余,那么有什么函数可以同时取到整数和余数吗?答案是有的,使用python内置函数divmoddivmod首先看一下源

  • Python实现五子棋人机对战[通俗易懂]

    Python实现五子棋人机对战[通俗易懂]本文转载自数据札记倌,详情可以扫描下方二维码:五子棋是常见的一款小游戏,五子棋问题是人工智能中的一个经典问题。这篇文章主要介绍了python版本五子棋的实现代码,大家可以做个参考,与我的傻儿子对弈一下。简述虽然计算机已经几乎激活成功教程了五子棋的取胜秘籍,甚至给出了取胜的具体方案,然而,对人来说,五子棋还是非常有玩头的。我们往往有五子棋的技巧性和全局观远远比不上象棋,围棋之类的感觉:这个真不一定,先说技…

  • 两种方式创建SqlSessionFactory[通俗易懂]

    两种方式创建SqlSessionFactory[通俗易懂]前提:已经完成了MyBatis环境的搭建!!!一、使用配置文件创建SqlSessionFactory开始Code了:packagecom.littlestar.util;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache…

  • java心形代码初学者_java输出爱心代码

    java心形代码初学者_java输出爱心代码绘制心形曲线1.要求非常有名的笛卡尔曲线数学公式:(x2+y2−2ax)2=4a2(x2+y2)(x^{2}+y^{2}-2ax)^{2}=4a^{2}(x^{2}+y^{2})(x2+y2−2ax)2=4a2(x2+y2)即心形曲线,本例通过Applet绘制出笛卡尔曲线。2.实现过程笛卡尔曲线是一个圆在同样半径的圆周上滚动,在滚动的过程中一定会形成轨迹曲线。它的数学方程为x=a(2c…

    2022年10月16日
  • ASP.NET_氚云开发

    ASP.NET_氚云开发氚云平台对接中间件WebService(修订版20200714)1.代码示例C#语言进行编写,运行在.NetFramework4.5环境2.使用VS2015以及以上版本打开.sln解决方案3.第三方WebService结构必须按照氚云规定的格式,方法和参数都不可变动,否则氚云平台无法调用4.所有数据传输均使用标准的Json格式数据5.第三方WebService必须发布至公网,氚云平台才可正常配置地址注意:此示例代码只是演示接口基础调用,没有做安全方面防范措施!!!不可直接使用项目结构:1

    2022年10月23日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号