聚类算法及可视化方法的实践与探索

簇内平方和表示数据点到其簇内质心的距离的平方和,公式如下:

其中, 是k簇数, ni是第 i 个簇的样本数, xij是第  i个簇中的第 j 个样本。

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)# 尝试不同的簇数,计算簇内平方和
inertia = []
for k in range(1, 11):kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(X)inertia.append(kmeans.inertia_)# 绘制肘部法图像
plt.plot(range(1, 11), inertia, marker='o')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method for Optimal K')
plt.show()

在图像中,我们寻找一个肘部,即簇内平方和的变化趋势减缓的点。这个肘部对应的簇数就是我们的最佳选择。

需要注意,有时候肘部并不明显,这时可能需要结合业务背景和其他评估指标来综合判断最佳的簇数。

图片

层次聚类的链接方式

层次聚类的链接方式主要有单链接(single-linkage)和完全链接(complete-linkage)两种,它们在形成聚类时有着不同的原理和效果。

1. 单链接 (Single-linkage):

在单链接中,两个聚类的距离被定义为它们中最近的两个点之间的距离。

也就是说,如果一个簇中的某个点与另一个簇中的所有点的距离都很小,那么这两个簇将会很接近。

2. 完全链接 (Complete-linkage):

在完全链接中,两个聚类的距离被定义为它们中最远的两个点之间的距离。这意味着两个簇被认为是在它们中最远的点之间保持一致的情况下被连接。

选择方式:

  • 如果你的数据可能包含离群点,并且你希望对异常值具有一定的鲁棒性,可以选择完全链接。

  • 如果你的数据相对干净,且你希望得到更细致的簇,可以选择单链接。

import numpy as np
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt# 生成一些示例数据
np.random.seed(42)
data = np.random.rand(10, 2)# 计算距离矩阵
distance_matrix = squareform(pdist(data))# 使用单链接层次聚类
single_linkage = linkage(distance_matrix, method='single')# 使用完全链接层次聚类
complete_linkage = linkage(distance_matrix, method='complete')# 绘制树状图
plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)
dendrogram(single_linkage)
plt.title('Single Linkage')plt.subplot(1, 2, 2)
dendrogram(complete_linkage)
plt.title('Complete Linkage')plt.show()

这段代码使用了scipy库中的linkagedendrogram函数来进行单链接和完全链接的层次聚类,并绘制了树状图,有助于理解聚类的形成过程。

图片

  1. 了解数据特性: 首先,你需要了解你的数据集特性,包括样本分布、聚类的密度和大小。不同的数据集可能需要不同的参数设置。

  2. 可视化数据: 使用散点图等可视化工具来观察数据的分布,这可以帮助你判断合适的邻域半径和最小样本数。可视化工具可以是matplotlib库,用于绘制数据分布图。

  3. 尝试不同参数组合: 通过尝试不同的邻域半径和最小样本数的组合,观察聚类结果的变化。通常,可以通过在一定范围内进行网格搜索来找到最优的参数组合。可以使用嵌套循环来遍历参数空间,然后评估每种组合的聚类效果。

  4. 使用密度可视化: 利用DBSCAN的核心思想是根据密度连接点,你可以通过在邻域内绘制样本点的个数来进行密度可视化。这有助于理解在不同参数下的数据密度分布。

下面用PyTorch实现DBSCAN的代码,并用matplotlib画出密度可视化图:

import torch
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN# 生成一些示例数据
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)# 转换为PyTorch张量
X_tensor = torch.tensor(X, dtype=torch.float32)# DBSCAN算法
dbscan = DBSCAN(eps=0.3, min_samples=5)
labels = dbscan.fit_predict(X_tensor)# 绘制密度可视化图
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, edgecolors='k')
plt.title('DBSCAN Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

通过调整epsmin_samples参数,你可以观察到不同的聚类效果。密度可视化图能够帮助你更直观地理解不同参数组合下的聚类结果。

图片

聚类算法的时间复杂度

Mini-Batch K-Means:

K-Means是一种常见的聚类算法,但在大规模数据上运行时可能效率较低。Mini-Batch K-Means是对传统K-Means的一种改进,通过每次随机选取一小部分数据来更新簇中心,从而减少计算量。

可以通过以下步骤实现:

 from sklearn.cluster import MiniBatchKMeanskmeans = MiniBatchKMeans(n_clusters=3, batch_size=100)kmeans.fit(X)

使用近似算法:

对于大规模数据,可以考虑使用一些近似聚类算法,例如K-Means++、K-Means||。这些算法在初始簇中心的选择上更为高效,有助于加速整个聚类过程。

谱聚类:

谱聚类是一种基于图论的聚类方法,可以通过降维来减少计算复杂度。它将数据转换到低维空间,然后在该空间中执行K-Means聚类。在大规模数据集上,通过适当的降维,可以提高计算效率。

 from sklearn.cluster import SpectralClusteringspectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors')spectral.fit(X)

使用分布式计算:

对于大规模数据,分布式计算是一种有效的方式。可以考虑使用分布式聚类算法,例如Spark中的K-Means。

K-Means并行化:

通过使用多核或GPU进行并行化,可以加速K-Means的计算过程。在Python中,可以使用joblib库来实现多核并行计算。

 from sklearn.cluster import KMeansfrom joblib import parallel_backendwith parallel_backend('threading', n_jobs=2):kmeans = KMeans(n_clusters=3)kmeans.fit(X)

总体而言,在大规模数据上提高聚类算法的计算效率,关键是选择合适的算法、采用近似方法、并行化计算,以及利用分布式计算资源。根据具体问题的性质和数据特点,选择最合适的策略来优化算法的性能。

聚类结果的可解释性

如何更好地解释这些簇对应的数据特征呢

1. 可视化聚类结果: 使用降维技术(如t-SNE、PCA)将高维数据映射到二维或三维空间,然后用不同颜色或标记表示不同的簇。这有助于直观地观察数据点在聚类中的分布。

# 以t-SNE为例
from sklearn.manifold import TSNE
import matplotlib.pyplot as plttsne = TSNE(n_components=2, random_state=42)
clustered_data_tsne = tsne.fit_transform(clustered_data)plt.scatter(clustered_data_tsne[:, 0], clustered_data_tsne[:, 1], c=labels, cmap='viridis')
plt.title('t-SNE Visualization of Clusters')
plt.show()

2. 簇内数据统计: 对每个簇进行统计分析,计算每个簇的中心(均值)、方差等统计量。

可以通过pandas库来实现。

import pandas as pd# 假设data是你的原始数据,labels是聚类结果
clustered_data = pd.DataFrame(data, columns=['feature1', 'feature2', ...])
clustered_data['label'] = labels# 统计每个簇的均值
cluster_means = clustered_data.groupby('label').mean()
print(cluster_means)

3. 特征重要性分析: 对每个簇内数据的特征进行重要性分析,可以使用决策树等模型。这能够帮助你理解哪些特征对于簇的形成起到了重要作用。

from sklearn.tree import DecisionTreeClassifier# 假设X是你的原始数据,y是聚类结果
dt = DecisionTreeClassifier(random_state=42)
dt.fit(X, y)# 特征重要性
feature_importance = dt.feature_importances_
print("Feature Importance:", feature_importance)

4. 关联规则挖掘: 使用关联规则挖掘方法,如Apriori算法,挖掘在同一簇内经常出现的特征组合。

from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules# 假设X是你的原始数据,y是聚类结果
frequent_itemsets = apriori(X, min_support=0.5, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
print(rules)

5. 使用主成分分析(PCA): 对每个簇内的数据应用PCA,找到主成分,以更好地理解簇的结构。

from sklearn.decomposition import PCA# 假设clustered_data是你的聚类结果
pca = PCA(n_components=2)
clustered_data_pca = pca.fit_transform(clustered_data)plt.scatter(clustered_data_pca[:, 0], clustered_data_pca[:, 1], c=labels, cmap='viridis')
plt.title('PCA Visualization of Clusters')
plt.show()

以上方法可以帮助你更好地解释聚类结果,理解每个簇对应的数据特征,进而为进一步分析和应用提供更多的线索。

处理高维数据

下面是一些处理高维数据的方法:

1. 降维技术:

  • 主成分分析(PCA): 通过线性变换将原始高维数据投影到低维空间,保留最大方差的方向,以减少数据的维度。

  • t分布邻域嵌入(t-SNE): 一种非线性降维方法,能够在保持样本之间的相对距离的同时降低维度。

# 使用PCA进行降维
from sklearn.decomposition import PCA# 假设X是高维数据
pca = PCA(n_components=2)
X_low_dim = pca.fit_transform(X)

2. 特征选择:

  • 通过选择最相关的特征,剔除冗余信息,从而降低数据的维度。

# 使用方差选择法进行特征选择
from sklearn.feature_selection import VarianceThresholdselector = VarianceThreshold(threshold=0.5)
X_low_dim = selector.fit_transform(X)

3. 使用聚类前的预处理:

  • 在应用聚类算法之前,可以先对数据进行预处理,如归一化、标准化,以确保每个维度的重要性相当。

# 使用MinMaxScaler进行归一化
from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)

4. 密度聚类算法:

  • 与基于距离的聚类算法不同,密度聚类算法(如DBSCAN)可以在高维空间中更灵活地发现密集的数据点,而不受维度的影响。

# 使用DBSCAN进行密度聚类
from sklearn.cluster import DBSCANdbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)

5. 集成聚类算法:

  • 使用多个聚类算法并集成它们的结果,可以提高在高维数据上的聚类效果。

# 使用KMeans和AgglomerativeClustering进行集成聚类
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.ensemble import VotingClassifierkmeans = KMeans(n_clusters=3)
agg_clustering = AgglomerativeClustering(n_clusters=3)ensemble_clf = VotingClassifier(estimators=[('kmeans', kmeans), ('agg', agg_clustering)], voting='hard')
labels = ensemble_clf.fit_predict(X)

6. 可视化:

  • 对降维后的数据进行可视化,以便更好地理解数据的结构和聚类效果。

# 使用matplotlib进行可视化
import matplotlib.pyplot as pltplt.scatter(X_low_dim[:, 0], X_low_dim[:, 1], c=labels, cmap='viridis')
plt.title('Clustering Result in 2D Space')
plt.show()

通过采用这些方法,我们可以更好地处理高维数据上的聚类问题,提高算法的性能和可解释性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探秘 AJAX:让网页变得更智能的异步技术(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

go语言函数二、init函数定义与作用

go语言init函数定义与作用 在go语言中,每一个源文件都可以包含一个init函数,这个函数会在main函数执行前,被go运行框架调用,注意是在main函数执行前。 package main import ("fmt" )func init() {fmt.Println("i…

快速部署SSL证书

以下是一个简单而快速的指南,教你如何在你的网站上部署SSL证书,为你的用户提供更安全的在线体验。 步骤1:选择SSL证书 首先,你需要选择适合你网站需求的SSL证书。有多种类型的证书可供选择,包括单域、多域名和通配符…

AWS 知识二:AWS同一个VPC下的ubuntu实例通过ldapsearch命令查询目录用户信息

前言: 前提:需要完成我的AWS 知识一创建一个成功运行的目录。 主要两个重要:1.本地windows如何通过SSH的方式连接到Ubuntu实例 2.ldapsearch命令的构成 一 ,启动一个新的Ubuntu实例 1.创建一个ubuntu实例 具体创建实例步骤我就不…

测试工具Jmeter:设置中文界面

首先我们打开Jmeter所在的文件,进入bin目录,打开Jmeter.properties: 打开后找到languageen: 改为zh_CN: 保存关闭,然后再打开Jmeter: 英文并不会显得高级,能做到高效的性能测试才是高级的。

E : DS查找—二叉树平衡因子

Description 二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用0来表示。 计算二叉树每个结点的平衡因子,并按后序遍历的顺序输出结点的平衡…

git修改远程commit信息

git 修改远程commit信息 如果你已经把本地commit的信息push到远程了,此时需要修改远程中的commit信息 第一步:git log 查看提交的信息,看下提交的commit日志 如下入所示 第二步:然后确定你需要修改的那一次commit,比如&#xf…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布

目录 一、实验 1.蓝绿发布准备 2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布 二、问题 1.手动构建Jenkins前端项目CI流水线报错 2.如何优化手动构建流水线选项参数 一、实验 1.蓝绿发布准备 (1)环境 表1 主机 主…

甄选的董宇辉,颠覆新东方?

董宇辉又被推向浪尖。 一年前,新东方老师董宇辉出现在东方甄选主播间,用边带货边教英文的方式爆火出圈,成为了东方甄选的活招牌。一年后,一条常规宣发物料引发一场巨大的舆情风波,董宇辉“小作文”事件如闹剧般展开&a…

Ubuntu 常用命令之 apt-get 命令用法介绍

apt-get是Ubuntu系统下的一个命令行工具,用于处理包。这个命令可以自动下载和安装软件包及其依赖项。它是Advanced Packaging Tool (APT)的一部分,APT是处理包的高级工具,可以处理复杂的包关系,如依赖关系等。 apt-get命令的常见…

Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

前言 在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的…

Open3D 最小二乘拟合平面(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫自重。 一、算法原理 平面方程的一般表达式为: A x + B y + C z

预测性维护在汽车制造行业中的应用

汽车制造行业是一个高度复杂和精细化的领域,依赖于各种设备来完成生产流程。这些设备包括机械装配线、焊接机器人、喷涂设备、传送带等。然而,这些设备在长时间运行中不可避免地会遇到各种故障,给生产进程带来延误和成本增加。为了应对这一挑…

Flink系列之:SQL提示

Flink系列之:SQL提示 一、动态表选项二、语法三、例子四、查询提示五、句法六、加入提示七、播送八、随机散列九、随机合并十、嵌套循环十一、LOOKUP十二、进一步说明十三、故障排除十四、连接提示中的冲突案例十五、什么是查询块 SQL 提示可以与 SQL 语句一起使用来…

Apache Doris 在奇富科技的统一 OLAP 场景探索实践

导读:随着消费信贷规模快速增长,个人信贷市场呈现场景化、体验感强的特征,精准营销、精细化风险管理以及用户使用体验的优化愈发重要。作为中国卓越的由人工智能驱动的信贷科技服务平台,奇富科技选择将 Apache Doris 作为整体 OLA…

2023美团商家信息

2023美团商家电话、地址、经纬度、评分、均价、执照...

Jenkins 执行远程脚本的插件—SSH2 Easy

SSH2 Easy 是什么? SSH2 Easy 是一个 Jenkins 插件,它用于在 Jenkins 构建过程中通过 SSH2 协议与远程服务器进行交互。通过该插件,用户可以在 Jenkins 的构建过程中执行远程命令、上传或下载文件、管理远程服务器等操作。 以下是 SSH2 Eas…

【C语言】SCU安全项目2-BufBomb

目录 关键代码解读: getxs() getbuf() test() 核心思路 具体操作1 具体操作2 前段时间忙于强网杯、英语4级和一些其他支线,有点摸不清头绪了,特别是qwb只有一个输出,太过坐牢,决定这个安全项目做完后就继续投身…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面,第三方支付平台作为中介,在网上交易的商家和消费者之间作一个信用的中转,通过改造支付流程来约束双方的行为,从而在一定程度上缓解彼此对双方信用的猜疑,增加对网上购物…

命令行方式使用abator.jar生成ibatis相关代码和sql语句xml文件

最近接手一个老项目,使用的是数据库是sql server 2008,框架是springmvc spring ibatis,老项目是使用abator插件生成的相关代码,现在需要增加新功能,要添加几张新表,可是目前网上下载的abator插件&#xf…