数据挖掘(作业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 pdcancer = 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 pltplt.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.mzph.cn/news/581265.shtml

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

相关文章

HTTP代理服务器:Go语言下的“网络翻译官”

开场白:在这个全球化的网络时代,有时我们需要一个“翻译官”来帮助不同系统、不同语言进行交流。今天,我们就来探讨如何使用Go语言,轻松实现这样一个角色——HTTP代理服务器,让我们的网络请求更加畅通无阻!…

JSON.stringify()

一、定义 JSON.stringify() 是一个 JavaScript 内置函数,用于将 JavaScript 对象或值转换为 JSON 字符串 二、语法 JSON.stringify(value, replacer, space); value:要转换为 JSON 字符串的 JavaScript 对象或值。 eplacer(可选&#xff0…

模式识别与机器学习-无监督学习-聚类

无监督学习-聚类 监督学习&无监督学习K-meansK-means聚类的优点:K-means的局限性:解决方案: 高斯混合模型(Gaussian Mixture Models,GMM)多维高斯分布的概率密度函数:高斯混合模型&#xff…

Qt+opencv 视频分解为图片

最近遇到一些售前提供的BUG,但是他们提供的是录像视频,因为处理显示速度比较快,因此很难找到出现问题的位置。需要反复播放,自己编写了一个视频分解成图片这样就可以一张图一张图的对比,方便查看。 开发环境 qtopenv…

Flutter 疑难杂症集合

一. Flutter集成uni小程序sdk 1. 手机连接电脑测试打开uni小程序没问题,打包成apk后debug编译下的apk也没问题,但就是release编译的apk包打不开小程序。 报错情景:点击后页面会闪现一下黑色的背景,然后又跳转回了点击之前的页面。…

LeetCode 热题 100——1.两数之和

1. 两数之和 提示 简单 18.1K 相关企业 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在…

c语言用四种方式求解成绩之中最高分和最低分的差值

文章目录 一,题目二,方法1,方法一2,方法二3,方法三4,方法四 三,示例结果 一,题目 最高分最低分之差 输入n个成绩,换行输出n个成绩中最高分数和最低分数的差 输入 : 两行…

linux | pause函数 、alarm函数、signal函数

//直接上demo #include <stdio.h> #include <unistd.h> #include <signal.h> #include <cerrno>void signalrm_fn(int sig) {printf("alarm!\n");alarm(2);return; } int main(void) {//信号触发函数 &#xff0c;当该线程触发到SIGALRM信号…

信息网络协议基础-IPv6协议

文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…

浅谈WPF之ToolTip工具提示

在日常应用中&#xff0c;当鼠标放置在某些控件上时&#xff0c;都会有相应的信息提示&#xff0c;从软件易用性上来说&#xff0c;这是一个非常友好的功能设计。那在WPF中&#xff0c;如何进行控件信息提示呢&#xff1f;这就是本文需要介绍的ToolTip【工具提示】内容&#xf…

k8s 的YAML文件详解

一、yaml文件简介 Kubernetes只支持YAML和JSON格式创建资源对象&#xff0c;JSON格式用于接口之间消息的传递&#xff0c;适用于开发&#xff1b;YAML格式用于配置和管理&#xff0c;适用于云平台管理&#xff0c;YAML是一种简洁的非标记性语言。 1&#xff09;yaml的语法规则&…

自动备份B站Up主最新视频到百度网盘的Python脚本详解

自动备份B站Up主最新视频脚本详解&#xff08;Win和Linux有些不同&#xff09; 前言&#xff1a; 次篇文章启发于某些大胆的UP主&#xff08;老马&#xff09;的多次被封&#xff0c;并被下架一些视频。有些人并不能及时观看到&#xff0c;故写一个脚本自动下载最新视频。 &am…

中小企业运营难题:CRM系统为您解决!

​CRM如何帮助中小企业解决业务与团队之间的问题&#xff1f;它可以帮助企业获取潜在客户、数据储存管理、建立标准化流程、减少客户流失、促进客户沟通等。客户关系管理的核心理念要以客户为最主要的资源&#xff0c;提供全面的客户服务&#xff0c;满足客户要求&#xff0c;实…

【信息安全原理】——入侵检测与网络欺骗(学习笔记)

&#x1f4d6; 前言&#xff1a;在网络安全防护领域&#xff0c;防火墙是保护网络安全的一种最常用的设备。网络管理员希望通过在网络边界合理使用防火墙&#xff0c;屏蔽源于外网的各类网络攻击。但是&#xff0c;防火墙由于自身的种种限制&#xff0c;并不能阻止所有攻击行为…

C++构建简单静态库实例(cmakelist)

一、开发实例 通过cmake构建静态开发实例如下: 1.1 代码目录 代码目录结构如下: 1.2 代码内容 1.2.1 CMakeLists.txt # CMake 最低版本要求 cmake_minimum_required(VERSION 3.10)# 项目名称 project(mylib)# 添加源文件 set(SOURCE_FILESsrc/mylib

每日一题(LeetCode)----二叉树-- 二叉树的右视图

每日一题(LeetCode)----二叉树-- 二叉树的右视图 1.题目&#xff08;199. 二叉树的右视图&#xff09; 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,nu…

助力打造清洁环境,基于美团最新YOLOv6-4.0开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题&#xff0c;公共环境下垃圾投放点都会有固定的值班时间&#xff0c;但是考虑到实际扔垃圾的无规律性&#xff0c;往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题&#xff0c;有些容易扩散的垃圾比…

Nginx附-实战之负载均衡时怎么让请求不转发到一台正在启动的tomcat服务器上

问题描述 用nginx做负载均衡的时候&#xff0c;当一台挂掉的时候&#xff0c;请求会转发到另外一台。但挂掉这一台的tomcat服务在启动过程中&#xff0c;Nginx请求可能会转发到这台正在启动的服务器上&#xff0c;就会一直等待直到超时&#xff0c;前端使用者的体验就会很差。…

Apache Flink连载(十八):Flink On Yarn运行原理及环境准备

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Flink On Yarn运行原理…

【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec

【Pytorch】学习记录分享7——PyTorch自然语言处理基础-词向量模型Word2Vec 1. 词向量模型Word2Vec)1. 如何度量这个单词的&#xff1f;2.词向量是什么样子&#xff1f;3.词向量对应的热力图&#xff1a;4.词向量模型的输入与输出![在这里插入图片描述](https://img-blog.csdni…