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

这篇具有很好参考价值的文章主要介绍了Scikit-learn聚类方法代码批注及相关练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、代码批注

代码来自: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()

Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
在实验中一直有个困惑,不知道这个小圆圈是怎么画上去的。它的原因是在“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”,它也是聚类的一部分。
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python

二、DBSCAN的使用

通过改变DBSCAN中min_samples参数观察图形的聚类效果。
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
当min_samples为41时编译器报错。
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
观察上图可以发现随着min_samples的增大cluster越来越少,噪音点越来越多,直至报错。这是因为DBSCAN算法是基于密度的算法,所以它将密集区域内的点看作核心点(核心样本)。它主要有两个参数:min_samples和eps。

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

如果将eps设置得非常小,则有可能没有点成为核心点,并且可能导致所有点都被标记为噪声。如下图为eps=0.05,min_samples=5的图。
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python
如果将eps设置为非常大,则将导致所有点都被划分到同一个簇。如下图为esp=0.3,min_samples=5的图。
Scikit-learn聚类方法代码批注及相关练习,机器学习,scikit-learn,聚类,python

三、KMeans的使用

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

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

四、KMeans与DBSCAN对比

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

到了这里,关于Scikit-learn聚类方法代码批注及相关练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据科学】Scikit-learn

    Scikit-learn 是 开源的Python库 ,通过统一的界面实现 机器学习 、 预处理 、 交叉验证及可视化算法 。   以上是使用 scikit-learn 库 进行 k-最近邻(KNN)分类 的流程,得到 KNN 分类器在 iris 数据集上的预测准确率。    Scikit-learn 处理的数据是 存储为 NumPy 数组或 SciPy 稀疏矩阵

    2024年02月07日
    浏览(45)
  • 【scikit-learn基础】--概述

    Scikit-learn 是一个基于 Python 的开源机器学习库,它提供了大量的机器学习算法和工具,方便用户进行数据挖掘、分析和预测。 Scikit-learn 是基于另外两个知名的库 Scipy 和 Numpy 的, 关于 Scipy 和 Numpy 等库,之前的系列文章中有介绍: Scipy 基础系列 Numpy 基础系列 自从 AlphaGo 再度

    2024年02月05日
    浏览(39)
  • Scikit-learn:全面概述

    在机器学习领域,Python已经成为一种重要的编程语言,这得益于其简洁、多功能和丰富的库。在这些库中,Scikit-learn作为其中最受欢迎和强大的之一,脱颖而出。它提供了各种工具、算法和功能,使用户能够轻松地进行各种机器学习任务。在本文中,我们将探索Scikit-learn的主

    2024年02月10日
    浏览(49)
  • 机器学习库Scikit-learn

    本文目录 3.1 背景知识 3.2 Scikit-learn概述 3.3 Scikit-learn主要用法 3.3.1 基本建模流程 3.3.2 数据预处理 3.3.3 监督学习算法 3.3.4 无监督学习算法 3.3.5 评价指标 3.3.6 交叉验证及超参数调优 3.4 Scikit-learn总结 参考文献 Scikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习包,它封装

    2024年02月04日
    浏览(42)
  • scikit-learn实现线性回归

    要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归,然后再有监督学习中找到线性模型 公式: L2范数是指向量中每个元素的平方和的平方根。在数学中,L2范数也称为欧几里得范数,通常用 ∣

    2024年02月04日
    浏览(42)
  • 安装scikit-learn的详细过程

     1. 打开命令终端,检查Python和pip的版本. scikit-learn支持的Python版本是3.6及以上,pip版本最低为9.0.1. 2. 升级pip版本(可选).使用命令:   pip install --user --upgrade pip     升级pip至最新版本. 3.. 安装scikit-learn. 使用pip命令安装最新版本的scikit-learn:   pip install --user scikit-learn  下载太慢可

    2024年02月16日
    浏览(31)
  • Scikit-Learn 中级教程——特征缩放

    在机器学习中,特征缩放是一个重要的预处理步骤。它用于调整数据中特征的范围,以便模型能够更好地收敛和表现。在本篇博客中,我们将深入介绍 Scikit-Learn 中的特征缩放方法,并通过代码示例说明如何进行特征缩放。 1. 为什么需要特征缩放? 在许多机器学习算法中,特

    2024年01月24日
    浏览(40)
  • Scikit-Learn 中级教程——学习曲线

    学习曲线是一种评估机器学习模型性能的可视化工具,它可以帮助我们理解模型在不同训练数据大小下的表现。在本篇博客中,我们将深入介绍学习曲线的概念,并使用 Scikit-Learn 中的工具绘制学习曲线。 1. 为什么需要学习曲线? 学习曲线有助于回答以下问题: 模型的性能

    2024年01月25日
    浏览(35)
  • scikit-learn中OneHotEncoder用法

    One-Hot编码,又称为一位有效编码,是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值,然后,每个整数值被表示为二进制向量,将整数索引标记为1,其余都标为0。 drop=None :用于从每个特征中舍去特定的分类,默认为 None ,且不能与 categories 、 n_values 同

    2024年02月10日
    浏览(36)
  • Scikit-Learn支持向量机分类

    1.1、SVM概述 在机器学习中,支持向量机(Support Vector Machine,SVM)算法既可以用于回归问题(SVR),也可以用于分类问题(SVC) 支持向量机是一种经典的监督学习算法,通常用于分类问题。SVM在机器学习知识结构中的位置如下: SVM的核心思想是将分类问题转化为寻找分类平面

    2024年04月23日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包