数据挖掘(作业3

任务一

对以下数据集使用K均值聚类算法:

1)观察实验结果是否符合预期;

2)利用SSE标准确定K值;

3)自行调参并观察对聚类结果的影响。

注意:需要把类别信息去掉。

“tutorial3_Data Exploration”中的鸢尾花数据集“iris.data”

“tutorial4_Data Preprocessing”中的癌症数据集“breast-cancer-wisconsin.data”

breast-cancer-wisconsin.data 

 

import pandas as pd

cancer = pd.read_csv('D:\\数据挖掘\\实验3 聚类 代码与数据\\breast-cancer-wisconsin.data',header=None,names=['id','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromation','Normal Nucleoli','Mitoses','Class'])

cancer

import pandas as pd
import numpy as np
from sklearn import cluster
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer

# 数据预处理
cancer.replace('?', np.nan, inplace=True)  # 将 '?' 替换为 NaN
cancer.dropna(inplace=True)  # 删除包含 NaN 值的行
cancer = cancer.astype(float)  # 将数据类型转换为浮点型

# 使用SimpleImputer填补缺失值
imputer = SimpleImputer(strategy='median')
cancer_imputed = imputer.fit_transform(cancer)

# 数据缩放
scaler = StandardScaler()
data_scaled = scaler.fit_transform(cancer_imputed)

# 将缩放后的数据转换为 DataFrame
data_scaled_df = pd.DataFrame(data_scaled, columns=cancer.columns)

# 删除 'Class' 列
data = data_scaled_df.drop('Class', axis=1)
data = data_scaled_df.drop('id', axis=1)

# 使用K均值聚类算法
k_means = cluster.KMeans(n_clusters=2, max_iter=100, random_state=1)
k_means.fit(data) 
labels = k_means.labels_

# 创建 DataFrame 来存储聚类结果
result_df = pd.DataFrame(labels, index=cancer.index, columns=['Cluster ID'])
print(result_df['Cluster ID'].value_counts())  # 打印各个簇的样本数量


pd.DataFrame(labels, index=cancer.id, columns=['Cluster ID'])

 

# 训练不同K值下的KMeans模型,并记录SSE
sse = []
k_range = range(1, 11)
for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(data)  
    sse.append(kmeans.inertia_)

# 绘制SSE与K值的关系图
import matplotlib.pyplot as plt

plt.plot(k_range, sse, marker='o')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Sum of Squared Errors (SSE)')
plt.title('Elbow Method for Optimal K')
plt.show()

利用SEE标准确定K,发现拐点在k=2的时候,说明k的最优值是2,符合该数据集 

 

调整参数

max_iter最大迭代次数,通过改变最大迭代次数,发现对分类的影响不是很大

改变k值,可以得出和上面一样的结论,k为2的时候的效果最好

改变tol,发现收敛阈值对于模型的性能的影响不是很大

 

 

任务二

层次聚类层次聚类(学习笔记-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_55552561/article/details/135165713?spm=1001.2014.3001.5501

任务三

查阅scikit-learn文档中的数据生成器(Samples generator,https://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets )请至少生成5种不同(形状或者分布)的数据集,并使用DBScan谱聚类进行聚类分析,观察实验结果,结合算法原理进行分析。 

谱聚类和DBscan数据挖掘--聚类-CSDN博客

数据生成器scikit-learn文档中的数据生成器-CSDN博客

 生成数据:

# 生成数据集
datasets = [
    make_blobs(n_samples=1000, centers=3, cluster_std=1.0, random_state=42),
    make_moons(n_samples=1000, noise=0.1, random_state=42),
    make_circles(n_samples=1000, noise=0.05, factor=0.5, random_state=42),
    make_classification(n_samples=1000, n_features=20, n_classes=2, n_clusters_per_class=2),
    make_regression(n_samples=100, n_features=2)
]

from sklearn.datasets import make_blobs, make_moons, make_circles,make_classification,make_regression
from sklearn.cluster import DBSCAN, SpectralClustering
import matplotlib.pyplot as plt

# 生成数据集
datasets = [
    make_blobs(n_samples=1000, centers=3, cluster_std=1.0, random_state=42),
    make_moons(n_samples=1000, noise=0.1, random_state=42),
    make_circles(n_samples=1000, noise=0.05, factor=0.5, random_state=42),
    make_classification(n_samples=1000, n_features=20, n_classes=2, n_clusters_per_class=2),
    make_regression(n_samples=100, n_features=2)
]

# DBSCAN 和谱聚类参数设置
dbscan = DBSCAN(eps=0.1, min_samples=5)
spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors', random_state=42)

# 数据集索引
dataset_names = ['Blobs', 'Moons', 'Circles', 'S Curve', 'Swiss Roll']

# 分别对每个数据集进行可视化和聚类分析
for idx, (X, y) in enumerate(datasets):
    # 可视化原始数据集
    plt.figure(figsize=(18, 4))

    # 绘制原始数据集
    plt.subplot(1, 3, 1)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
    plt.title(f"Original {dataset_names[idx]} Dataset")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    
    # DBSCAN 聚类
    dbscan.fit(X)
    db_labels = dbscan.labels_
    
    # 谱聚类
    spectral.fit(X)
    spectral_labels = spectral.labels_
    
    # 绘制DBSCAN聚类结果
    plt.subplot(1, 3, 2)
    plt.scatter(X[:, 0], X[:, 1], c=db_labels, cmap='viridis')
    plt.title(f"DBSCAN Clustering on {dataset_names[idx]}")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    
    # 绘制谱聚类结果
    plt.subplot(1, 3, 3)
    plt.scatter(X[:, 0], X[:, 1], c=spectral_labels, cmap='viridis')
    plt.title(f"Spectral Clustering on {dataset_names[idx]}")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    
    plt.tight_layout()
    plt.show()

 运行得到的结果

可以看出聚类存在很大的问题,特别是谱聚类,因为按理说谱聚类是对kmeans的一个方面的改进,应该可以比较好地对圆形数据和月牙形地数据做一个比较好的分类,但上述结果明显没有做到,于是下面将五个数据集分开,对不同的数据集,用不一样的明显参数进行分类。

此外,在对数据生成的函数的进一步的了解,发现make_classification和make_swiss_roll生成的数据,不适用于对聚类算法的研究,于是下面只研究Blobs、Moons和Circle的数据。

Blobs数据:

修改了DBscan参数

# DBSCAN 和谱聚类参数设置
dbscan = DBSCAN(eps=0.5, min_samples=5)
spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors', random_state=42)

下面是三种不同的Blobs数据 

 这个数据集上,DBscan和谱聚类的分类效果都挺好的

 在上述这个数据集上的聚类,可以明显看出DBSCAN没有正确地进行分类,进行过多次调参,都没有办法达到更好的分类效果

        在给定的合成数据集中,既有 DBSCAN 及谱聚类未能很好地对数据进行有效聚类。DBSCAN 未能有效识别形状复杂且交错的数据结构,这是因为 DBSCAN 对于类别之间的密度差异和噪声数据敏感,对于密度相近的区域难以分辨。而对于谱聚类,尽管它能够在某些情况下处理非凸形状的聚类结构,但它仍然基于样本之间的相似度图进行聚类,难以很好地解决数据交错在一起的情况。

        对于交错在一起的数据,即使是 DBSCAN 和谱聚类这样的聚类算法也可能遇到困难。DBSCAN 依赖于密度可达性的概念,因此无法很好地处理密度相似的区域,谱聚类虽然不受凸形状的限制,但也是基于样本之间的相似性度量,因此在处理交错在一起的数据时也存在挑战。

        对于类似这种交错在一起的数据结构,可能需要更复杂或更适合此类情况的聚类方法,或者在应用传统聚类算法之前,对数据进行特征工程或预处理,以更好地凸显数据内部的聚类结构,比如使用核方法、降维技术等。另外,使用可视化工具对数据进行分析,能够帮助更好地理解数据的特性及算法的表现,从而为选择适当的聚类算法提供指导。

Moons数据: 

修改了谱聚类的参数

# DBSCAN 和谱聚类参数设置
dbscan = DBSCAN(eps=0.1, min_samples=5)
spectral = SpectralClustering(n_clusters=2, affinity='rbf', random_state=42,gamma=500)

 

Circles数据:

使用和上面这个月牙形一样的参数

# DBSCAN 和谱聚类参数设置
dbscan = DBSCAN(eps=0.1, min_samples=5)
spectral = SpectralClustering(n_clusters=2, affinity='rbf', random_state=42,gamma=500)

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 12c rac 搭建 dg

环境 rac 环境 (主)byoradbrac 系统版本:Red Hat Enterprise Linux Server release 6.5 软件版本:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1:172.17.38.44 byoradb2:…

车路协同中 CUDA 鱼眼相机矫正、检测、追踪

在车路协同中,鱼眼一般用来补充杆件下方的盲区,需要实现目标检测、追踪、定位。在目标追踪任务中,通常的球机或者枪机方案,无法避免人群遮挡的问题,从而导致较高的ID Swich,造成追踪不稳定。但是鱼眼相机的顶视角安装方式,天然缓解了遮挡的问题,从而实现杆件下方的盲区…

关于“Python”的核心知识点整理大全46

目录 16.1.3 提取并读取数据 highs_lows.py highs_lows.py 16.1.4 绘制气温图表 highs_lows.py 16.1.5 模块 datetime ​编辑 16.1.6 在图表中添加日期 highs_lows.py 16.1.7 涵盖更长的时间 highs_lows.py highs_lows.py 16.1.9 给图表区域着色 highs_lows.py …

Linux操作系统(Crontab计划任务+NTP时间同步服务器)

如何修改linux系统时间 与时间相关的命令,查看当前的时间 运行 date 即可 cal 查看当前月份的日历 运行 timedatectl 查看时间详细参数 ( NTP: network time protocol 网络时间协议 ) ( local time : 本地时间 &#x…

搭建APP应用程序如何选择服务器

我经常收到许多关于如何搭建 APP 的询问。其中,如何选择服务器是许多初创企业和开发者经常面临的问题。带着这些问题我也通过一些科技手段收集整理了些知识,今天我就和大家来来探讨如何选择服务器,帮助您搭建一个稳定、高效、安全的 APP。 Ap…

MariaDB单机多实例的配置方法

1、什么是数据库的单机多实例 数据库的单机多实例是指在一台物理服务器上运行多个数据库实例。这种部署方式允许多个数据库实例共享相同的物理资源,如CPU、内存和存储,从而提高硬件利用率并降低成本。每个数据库实例可以独立运行,处理不同的…

python如何通过日志分析加入黑名单

python通过日志分析加入黑名单 监控nginx日志,若有人攻击,则加入黑名单,操作步骤如下: 1.读取日志文件 2.分隔文件,取出ip 3.将取出的ip放入list,然后判读ip的次数 4.若超过设定的次数,则加…

SwiftUI ArkUI 对比分析

下载链接🔗: https://download.csdn.net/download/gwh111/88670868 版本 1.0 (2023 年 4月) 更新说明: 4.7 修改问题和缺陷 4.13 新增缺陷讨论 4.14 新增引言和部分小结 4.17 高亮关键性代码,新增SwiftUI状态官方定义 目录 引言…

[Angular] 笔记 11:可观察对象(Observable)

chatgpt: 在 Angular 中,Observables 是用于处理异步数据流的重要工具。它们被广泛用于处理从异步操作中获取的数据,比如通过 HTTP 请求获取数据、定时器、用户输入等。Observables 提供了一种机制来订阅这些数据流,并可以在数据到达时执行相…

ElasticSearch:centos7安装elasticsearch7,kibana,ik中文分词器,云服务器安装elasticsearch

系统:centos7 elasticsearch: 7.17.16 安装目录:/usr/local 云服务器的安全组:开放 9200 和5601的端口 一、下载安装elasticsearch7.17.16 1、安装 #进入安装目录 cd /usr/local#下载elasticsearch wget https://artifacts.elastic.co/d…

ASP.NET Core 使用Log4Net写文本日志和数据库日志

1&#xff0c;先安装依赖 2&#xff0c;在项目目录新建Log4Net.config配置文件&#xff0c;必须要安装System.Data.SqlClient&#xff0c;不然日志存不进去数据库 <?xml version"1.0" encoding"utf-8"?> <log4net><!-- Define some outpu…

Redis6.0 Client-Side缓存是什么

前言 Redis在其6.0版本中加入了Client-side caching的支持&#xff0c;开启该功能后&#xff0c;Redis可以将指定的key-value缓存在客户端侧&#xff0c;这样当客户端发起请求时&#xff0c;如果客户端侧存在缓存&#xff0c;则无需请求Redis Server端。 Why Client-side Cac…

【C#】.net core 6.0 依赖注入生命周期

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 对于.net core而言&#xff0c;依赖注入生命周期有三种瞬态&#xff08;Transient&#xff09;、作用域&#xff08;Scoped&#xff09;和单例&#xff08;Singleton&#xff09;&#xf…

【正则表达式】

概述 正则表达式又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式并不仅限于某一种语…

传统船检已经过时?AR智慧船检来助力!!

想象一下&#xff0c;在茫茫大海中&#xff0c;一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜&#xff0c;他们不再需要反复翻阅厚重的手册&#xff0c;一切所需信息都实时显示在眼前。这不是科幻电影的场景&#xff0c;而是智慧船检技术带来的现实变革。那么问题…

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 JVM进程缓存Lua语法入…

scikit-learn文档中的数据生成器

目录 1. make_classification: 2. make_regression: 3. make_blobs: 4. make_moons: 5.make_circles 6. make_sparse_coded_signal: 1. make_classification: 这是一个用于生成复杂二维数据的函数&#xff0c;通常用于可视化分类器的学习过程或者测试机器学习算法的性能…

学习笔记:数据挖掘与机器学习

文章目录 一、数据挖掘、机器学习、深度学习的区别&#xff08;一&#xff09;数据挖掘&#xff08;二&#xff09;机器学习&#xff08;三&#xff09;深度学习&#xff08;四&#xff09;总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…

在Ubuntu20.04配置PX4环境

目录 1.下载PX4源码2.安装PX4所有工具链3.编译PX4工程1.下载PX4源码 打开Ubuntu,Ctrl+Alt+T打开终端输入下面代码: git clone https://github.com/PX4/PX4-Autopilot.git --recursive出现上图中出现“Command ‘git’ not found, but can be installed with”,使用以下代码…

山景32位蓝牙DSP音频应用处理芯片—BP1048B2

由工采网代理的BP1048B2是山景推出的一款高性能32位DSP蓝牙音频应用处理器&#xff1b;该芯片拥有32位RISC内核&#xff0c;支持DSP指令&#xff0c;集成FPU支持浮点运算&#xff0c;可应用于蓝牙K歌宝、蓝牙便携式音箱、蓝牙拖箱、蓝牙SoundBar、包头式蓝牙耳机、各类蓝牙音频…
最新文章