Scikit-learn聚类方法代码批注及相关练习

news2024/9/29 15:26:40

一、代码批注

代码来自:https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

# make_blobs:为聚类产生数据集及其相应的标签;n_samples:样本点个数;centers:类别数;cluster_std:每个类别的方差;random_state:随机种子
# 这里centers里的三个二维坐标,其实代表了聚类的三个中心
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0)

# 标准化
X = StandardScaler().fit_transform(X)

# 预估器,并得出模型(eps:数据点的邻域半径;min_samples:某个数据点的邻域内最少有的数据点个数)
db = DBSCAN(eps=0.2, min_samples=7).fit(X)

# 生成n_samples个False
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
# 预测出的结果(有结果的为True,为噪音的是False)
core_samples_mask[db.core_sample_indices_] = True
# 获得预测结果
labels = db.labels_
# 获得预测的聚类数,忽略掉噪音
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
# 获得噪音数
n_noise_ = list(labels).count(-1)

# 预测出的集群数,对应图中5中颜色
print('Estimated number of clusters: %d' % n_clusters_)
# 预测出噪音点的数量,对应图中的黑点
print('Estimated number of noise points: %d' % n_noise_)
# 同质性:簇的纯洁程度—对比分类问题的精度
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
# 完整性:簇的完整性—对比分类问题的召回率
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
# v测度:用来评估同一个数据集上两个独立赋值的一致性
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
# 调节的兰德系数(ARI):衡量两个数据分布的吻合程度
print("Adjusted Rand Index: %0.3f" % metrics.adjusted_rand_score(labels_true, labels))
# 调整互信息(AMI):衡量两个数据分布的吻合程度
print("Adjusted Mutual Information: %0.3f" % metrics.adjusted_mutual_info_score(labels_true, labels))
# 轮廓系数:将某个对象与自己的簇的相似程度和与其他簇的相似程度进行比较(肘方法)
print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(X, labels))


import matplotlib.pyplot as plt

unique_labels = set(labels)
# 给每个label赋个颜色
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    # 给噪音为黑色
    if k == -1:
        col = [0, 0, 0, 1]

    # 开始绘制,获得该种类的点
    class_member_mask = (labels == k)
    # core_samples_mask里false就是黑色噪音点
    # 取出同一类的点(这样&可以过滤掉黑点。如果没有core_samples_mask(黑点为false)会把黑点也画很大)
    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=14)
    # 获得噪音点,注意:db.core_sample_indices_没出现的的不一定就是噪音点(小圆圈)
    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=6)

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

在这里插入图片描述
在实验中一直有个困惑,不知道这个小圆圈是怎么画上去的。它的原因是在“db.core_sample_indices_”和“db.labels”,起初我以为“db.core_sample_indices_”会生成除噪音点以外的其他index,也就是区分开了噪音点与聚类点。但其实并不是,有少部分不在“db.core_sample_indices_”中的点也是聚类点,在下方打印出来的值分别与它俩相对,可以看见前者并没有为32的index,理论上它应该为-1噪音点,但打印出“db.labels”发现index为32的值是1,是一个聚类点。这点也在scikit learn文档最后一段进行了说明,文档解释到图中大的圆为“core sample”,而小的圆为“non-core sample”,它也是聚类的一部分。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、DBSCAN的使用

通过改变DBSCAN中min_samples参数观察图形的聚类效果。
在这里插入图片描述
当min_samples为41时编译器报错。
在这里插入图片描述
观察上图可以发现随着min_samples的增大cluster越来越少,噪音点越来越多,直至报错。这是因为DBSCAN算法是基于密度的算法,所以它将密集区域内的点看作核心点(核心样本)。它主要有两个参数:min_samples和eps。

eps表示数据点的邻域半径,如果某个数据点的邻域内至少有min_sample个数据点,则将该数据点看作为核心点。如果某个核心点的邻域内有其他核心点,则将它们看作属于同一个簇。如果min_sampLes设置地太大,那么意味着更少的点会成为核心点,而更多的点将被标记为噪声。

如果将eps设置得非常小,则有可能没有点成为核心点,并且可能导致所有点都被标记为噪声。如下图为eps=0.05,min_samples=5的图。
在这里插入图片描述
如果将eps设置为非常大,则将导致所有点都被划分到同一个簇。如下图为esp=0.3,min_samples=5的图。
在这里插入图片描述

三、KMeans的使用

由于KMeans并没有“core_sample_indices”这个属性,也就是不会分离出噪音点,需将该条语句注释掉。在画图时,由于并没有噪音点,也要进行相应改写。
在这里插入图片描述
在这里插入图片描述
KMeans算法是根据给定的n个数据对象的数据集,构建n个划分聚类的方法,每个划分聚类即为一个簇。该方法将数据划分为n个簇,每个簇至少有一个数据对象,每个数据对象必须属于而且只能属于一个簇。同时要满足同一簇中的数据对象相似度高,不同簇中的数据对象相似度较小。聚类相似度是利用各簇中对象的均值来进行计算的。

KMeans 算法的处理流程如下,首先,随机地选择k个数据对象,每个数据对象代表一个簇中心,即选择k个初始中心;对剩余的每个对象,根据其与各簇中心的相似度(距离),将它赋给与其最相似的簇中心对应的簇;然后重新计算每个簇中所有对象的平均值,作为新的簇中心。不断重复以上这个过程,直到准则函数收敛,也就是簇中心不发生明显的变化。通常采用均方差作为准则函数,即最小化每个点到最近簇中心的距离的平方和。新的簇中心计算方法是计算该簇中所有对象的平均值,也就是分别对所有对象的各个维度的值求平均值,从而得到簇的中心点。

四、KMeans与DBSCAN对比

KMeansDBSCAN
使用簇的基于原型的概念。使用基于密度的概念。
只能用于具有明确定义的质心(如均值)的数据。要求密度定义(基于传统的欧几里得密度概念)对于数据是有意义的。
需要指定簇的个数作为参数。不需要事先知道要形成的簇类的数量,自动确定簇个数。
很难处理非球形的簇和不同形状的簇。可以发现任意形状的簇类,可以处理不同大小和不同形状的簇。
可以用于稀疏的高纬数据,如文档数据。不能很好反映高维数据。
可以发现不是明显分离的簇,即便簇有重叠也可以发现。会合并有重叠的簇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/852895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习深度学习——RNN的从零开始实现与简洁实现

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——循环神经网络RNN 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮…

php后端实现调用高德地图进行POI搜索

对于当前位置或者选定省市位置进行查询 接口实现 /*** 查询地址* ApiTitle (查询地址)* ApiSummary (查询地址)* ApiMethod (POST)* ApiRoute (/api/demo/address)* ApiParams (name"dart", type"integer", requiredtrue, description"省…

项目经理的性格与情绪控制︱小象智能COO、原腾讯项目集管理经理王炼

小象智能COO、原腾讯项目集管理经理王炼女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:项目经理的性格与情绪控制。大会将于8月12-13日在北京举办,敬请关注! 议题简要: 众所周知,项…

光模块故障:能否继续发射光信号?

光模块是一种关键的光通信组件,负责将电信号转换为光信号进行传输。然而,光模块也可能出现故障,导致其无法正常工作。那么,如果光模块坏了,是否还能发射光信号呢?本文将探讨光模块故障对光信号发射的影响&a…

【ArcGIS】经纬度数据转化成平面坐标数据

将点位置导入Gis中,如下(经纬度表征位置): 如何利用Gis将其转化为平面坐标呢? Step1 坐标变换 坐标变换,打开ArcToolbox,找到“数据管理工具”->“投影和变换”->“要素”->“投影”…

0基础学习VR全景平台篇 第81篇:全景相机-临云镜如何直播推流

临云镜全景相机是阿里巴巴定制全景设备,实现空间三维信息的快速采集,与阿里云三维空间重建平台搭配,帮助品牌商与平台以较低的成本完成空间的快速采集,并支持对室内/室外空间的三维全景展示及空间漫游,同时支持VR浏览、…

论文图表--pyecharts使用

python中使用matplotlib画图颜色不好看,所以选取了pyecharts来画图表。 echarts介绍 pyecharts是echarts的python接口,echarts本身是基于javascript的,由于javascript搭建也比较麻烦,这里使用pyecharts来画图。 echarts常用来pp…

语音同声翻译软件到底谁更胜一筹呢

嘿!你是否曾经遇到过需要在不同语言之间进行实时翻译的情况?别担心,现在有许多翻译软件可供选择,让你的沟通变得更加简便和愉快。无论你是旅行者、国际商务人士还是语言爱好者,这些软件都将成为你的得力助手&#xff0…

PyQt学习笔记-Windows系统版本兼容问题踩坑记录

1 Pyinstaller打包的exe在Win10上可以使用&#xff0c;在Win7上缺提示找不到dll。 错误信息&#xff1a; Traceback (most recent call last): File "main.py", line 4, in <module> ImportError: DLL load failed while importing QtWidgets: 找不到指定的…

Beautiful Sequence 2023牛客暑期多校训练营7 C

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出一长度n-1的数组b&#xff0c;要求构造一个长度为n的数组a&#xff0c;满足a[i]^a[i1]b[i]&#xff0c;a[i]<a[i1]&#xff0c;求字典序第k小的数组 1<n<1e6;0<a[i],b[i]< 思路&#xff1a;因为…

快速引流推广,快速引流推广策略分享,教你精准引流

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 在当今互联网的快速发展中&#xff0c;短视频脱颖而出&#xff0c;成为互联网的新秀&#xf…

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…

PDCA、4Y(循环质量管理)

PDCA是什么&#xff1f; PDCA是由英语单词Plan(计划)、Do(执行)、Check(检查)和Act(修正)的第一个字母组成的&#xff0c;PDCA是按照这样的顺序进行质量管理的循环。PDCA四个英文字母及其在PDCA循环中所代表的含义如下&#xff1a; P&#xff08;Plan&#xff09;&#xff1a…

做电商的老哥注意,不干的淘宝产品记得下架,别被薅羊毛了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 提醒所有电商人&#xff1a;不干了就把链接下架&#xff0c;别被薅羊毛了。 关注卢松松的人都知道&#xff0c;虽然卢松松不做电商&#xff0c;但我还是有好几个店铺的。6月份我的某一个僵尸店铺就…

PROFIBUS-DP主站转ETHERCAT网关连接西门子支持ethercat吗

大家好&#xff0c;今天要给大家介绍一款捷米的神秘产品&#xff0c;它的名字叫JM-DPM-ECT&#xff0c;是一款兼具PROFIBUS-DP主站功能的通讯网关。想象一下&#xff0c;它既能和PROFIBUS总线打交道&#xff0c;又能与ETHERCAT网络愉快地交流&#xff0c;是不是感觉很神奇&…

校对软件趋势:人工智能技术的应用和未来发展

校对软件正处于人工智能技术应用和未来发展的前沿。以下是校对软件的一些趋势&#xff1a; 1.自然语言处理&#xff1a;随着自然语言处理(NLP)技术的不断发展&#xff0c;校对软件能够更准确地理解和分析文本。通过深度学习和语言模型的应用&#xff0c;校对软件可以更好地捕捉…

法律监督大数据平台有什么作用?

大数据赋能时代法律监督&#xff0c;构建法律行业领域大数据监督模型。法律监督大数据研判系统助力检察机关以社会公正为核心价值追求&#xff0c;对执法不严、司法不公“零容忍”&#xff0c;强化对诉讼活动的法律监督&#xff0c;坚决维护法律尊严&#xff0c;坚决捍卫公平正…

爬虫013_函数的定义_调用_参数_返回值_局部变量_全局变量---python工作笔记032

然后再来看函数,可以避免重复代码 可以看到定义函数以及调用函数

第六章代码题(四)

8.在以孩子兄弟二叉链表存储的树中&#xff0c;求树的叶子结点数。 首先要了解孩子兄弟存储结构&#xff0c;简单来说就是每个结点的左孩子不变&#xff0c;在同一层的结点都依次连在该层的结点的右孩子上。 如图 &#xff1a; 将上述的左孩子域改为第一个孩子指针&#xff0c…

安卓开发问题记录:需要常量表达式

问题原因 写代码过程中爆出这个错误&#xff1a;需要常量表达式&#xff0c;定位到switch。 解决方法&#xff1a;把switch case&#xff0c;改成if else 错误源代码&#xff1a; public void onClick(View view) {switch (view.getId()) {case R.id.iv_code:RxCaptcha.build(…