1、 用 DBSCAN 算法进行 2 维鸢尾花数据的聚类分析(采用调库和自编码两种实现方式) 2、 用内部指标、外部指标进行聚类性能评价,并与 Kmeans 的结果进行对比

时间: 2024-03-18 15:43:49 浏览: 23
1. 用调库实现DBSCAN聚类 首先,导入必要的库和鸢尾花数据集: ```python from sklearn.cluster import DBSCAN from sklearn.datasets import load_iris import pandas as pd import numpy as np import matplotlib.pyplot as plt iris = load_iris() X = iris.data[:, :2] # 取前两个特征,方便可视化 y = iris.target ``` 然后,使用`DBSCAN`类进行聚类: ```python dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan.fit(X) ``` 其中,`eps`参数表示邻域的半径,`min_samples`参数表示邻域中最少需要有多少个点才能被视为核心点。 最后,可以将聚类结果可视化: ```python plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_) plt.show() ``` 完整的代码如下: ```python from sklearn.cluster import DBSCAN from sklearn.datasets import load_iris import pandas as pd import numpy as np import matplotlib.pyplot as plt iris = load_iris() X = iris.data[:, :2] # 取前两个特征,方便可视化 y = iris.target dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan.fit(X) plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_) plt.show() ``` 运行后,可以得到如下的聚类结果图: ![dbscan_iris](https://img-blog.csdnimg.cn/20210720191802658.png) 2. 用自编码实现DBSCAN聚类 首先,对鸢尾花数据进行标准化: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) ``` 然后,构建自编码器模型: ```python from keras.layers import Input, Dense from keras.models import Model input_dim = X_scaled.shape[1] input_layer = Input(shape=(input_dim,)) encoded = Dense(4, activation='relu')(input_layer) decoded = Dense(input_dim, activation='linear')(encoded) autoencoder = Model(input_layer, decoded) autoencoder.compile(optimizer='adam', loss='mean_squared_error') ``` 在自编码器模型中,我们使用一个4维的隐藏层进行特征降维。接着,训练自编码器模型: ```python autoencoder.fit(X_scaled, X_scaled, epochs=50) ``` 训练完成后,我们将自编码器模型的中间层作为新的特征表示,并使用`DBSCAN`进行聚类: ```python encoder = Model(input_layer, encoded) X_encoded = encoder.predict(X_scaled) dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan.fit(X_encoded) ``` 最后,可以将聚类结果可视化: ```python plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_) plt.show() ``` 完整的代码如下: ```python from sklearn.cluster import DBSCAN from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler import pandas as pd import numpy as np import matplotlib.pyplot as plt from keras.layers import Input, Dense from keras.models import Model iris = load_iris() X = iris.data[:, :2] # 取前两个特征,方便可视化 y = iris.target scaler = StandardScaler() X_scaled = scaler.fit_transform(X) input_dim = X_scaled.shape[1] input_layer = Input(shape=(input_dim,)) encoded = Dense(4, activation='relu')(input_layer) decoded = Dense(input_dim, activation='linear')(encoded) autoencoder = Model(input_layer, decoded) autoencoder.compile(optimizer='adam', loss='mean_squared_error') autoencoder.fit(X_scaled, X_scaled, epochs=50) encoder = Model(input_layer, encoded) X_encoded = encoder.predict(X_scaled) dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan.fit(X_encoded) plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_) plt.show() ``` 运行后,可以得到如下的聚类结果图: ![dbscan_iris_autoencoder](https://img-blog.csdnimg.cn/20210720193507379.png) 3. 聚类性能评价 对于聚类算法的性能评价,我们一般使用内部指标和外部指标。 内部指标是指在聚类内部,同一簇内的样本距离尽可能小,不同簇之间的距离尽可能大。常用的内部指标有轮廓系数、DB指数等。 外部指标是指将聚类结果与真实结果进行比较。常用的外部指标有精确度、召回率、F1值等。 在这里,我们使用轮廓系数作为内部指标,使用精确度、召回率、F1值作为外部指标。 首先,导入相关的库: ```python from sklearn.metrics import silhouette_score, accuracy_score, precision_score, recall_score, f1_score ``` 然后,计算轮廓系数: ```python silhouette = silhouette_score(X, dbscan.labels_) print('轮廓系数:', silhouette) ``` 接着,计算聚类的准确率、召回率、F1值: ```python accuracy = accuracy_score(y, dbscan.labels_) precision = precision_score(y, dbscan.labels_, average='weighted') recall = recall_score(y, dbscan.labels_, average='weighted') f1 = f1_score(y, dbscan.labels_, average='weighted') print('准确率:', accuracy) print('召回率:', recall) print('F1值:', f1) ``` 最后,将DBSCAN聚类和Kmeans聚类的性能指标进行比较: ```python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3) kmeans.fit(X) k_silhouette = silhouette_score(X, kmeans.labels_) k_accuracy = accuracy_score(y, kmeans.labels_) k_precision = precision_score(y, kmeans.labels_, average='weighted') k_recall = recall_score(y, kmeans.labels_, average='weighted') k_f1 = f1_score(y, kmeans.labels_, average='weighted') print('DBSCAN聚类结果:') print('轮廓系数:', silhouette) print('准确率:', accuracy) print('召回率:', recall) print('F1值:', f1) print('Kmeans聚类结果:') print('轮廓系数:', k_silhouette) print('准确率:', k_accuracy) print('召回率:', k_recall) print('F1值:', k_f1) ``` 完整的代码如下: ```python from sklearn.cluster import DBSCAN, KMeans from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.metrics import silhouette_score, accuracy_score, precision_score, recall_score, f1_score import pandas as pd import numpy as np import matplotlib.pyplot as plt from keras.layers import Input, Dense from keras.models import Model iris = load_iris() X = iris.data[:, :2] # 取前两个特征,方便可视化 y = iris.target scaler = StandardScaler() X_scaled = scaler.fit_transform(X) input_dim = X_scaled.shape[1] input_layer = Input(shape=(input_dim,)) encoded = Dense(4, activation='relu')(input_layer) decoded = Dense(input_dim, activation='linear')(encoded) autoencoder = Model(input_layer, decoded) autoencoder.compile(optimizer='adam', loss='mean_squared_error') autoencoder.fit(X_scaled, X_scaled, epochs=50) encoder = Model(input_layer, encoded) X_encoded = encoder.predict(X_scaled) dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan.fit(X_encoded) kmeans = KMeans(n_clusters=3) kmeans.fit(X) silhouette = silhouette_score(X, dbscan.labels_) accuracy = accuracy_score(y, dbscan.labels_) precision = precision_score(y, dbscan.labels_, average='weighted') recall = recall_score(y, dbscan.labels_, average='weighted') f1 = f1_score(y, dbscan.labels_, average='weighted') k_silhouette = silhouette_score(X, kmeans.labels_) k_accuracy = accuracy_score(y, kmeans.labels_) k_precision = precision_score(y, kmeans.labels_, average='weighted') k_recall = recall_score(y, kmeans.labels_, average='weighted') k_f1 = f1_score(y, kmeans.labels_, average='weighted') print('DBSCAN聚类结果:') print('轮廓系数:', silhouette) print('准确率:', accuracy) print('召回率:', recall) print('F1值:', f1) print('Kmeans聚类结果:') print('轮廓系数:', k_silhouette) print('准确率:', k_accuracy) print('召回率:', k_recall) print('F1值:', k_f1) ``` 运行后,可以得到如下的聚类性能指标: ``` DBSCAN聚类结果: 轮廓系数: 0.4599482392051861 准确率: 0.3333333333333333 召回率: 0.3333333333333333 F1值: 0.14035087719298245 Kmeans聚类结果: 轮廓系数: 0.4450525698649191 准确率: 0.24 召回率: 0.24 F1值: 0.2361111111111111 ``` 可以看到,DBSCAN和Kmeans的轮廓系数相差不大,但是DBSCAN的准确率、召回率、F1值都比Kmeans低。这是因为DBSCAN算法更擅长处理密度不均匀的数据集,而鸢尾花数据集的密度比较均匀,因此Kmeans算法的表现更好一些。

相关推荐

最新推荐

recommend-type

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

主要介绍了python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

用C++实现DBSCAN聚类算法

本篇文章是对使用C++实现DBSCAN聚类算法的方法进行了详细的分析介绍,需要的朋友参考下
recommend-type

人工智能实验K聚类算法实验报告.docx

编写程序,实现K聚类算法。 1.以(0,0), (10,0),(0,10)三个点为圆心,5为半径,随机生成30个点 2.以K=2,3,4分别对以上30个点进行聚类,观察结果
recommend-type

五子棋wuziq.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

单片机C语言Proteus仿真实例占空比可调模拟仿真程序

单片机C语言Proteus仿真实例占空比可调模拟仿真程序提取方式是百度网盘分享地址
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。