数据挖掘(作业3

news2024/11/16 3:26:40

任务一

对以下数据集使用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.coloradmin.cn/o/1339379.html

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

相关文章

XUbuntu22.04之删除多余虚拟网卡和虚拟网桥(二百零四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【动画视频生成】

转自:机器之心 动画视频生成这几天火了,这次 NUS、字节的新框架不仅效果自然流畅,还在视频保真度方面比其他方法强了一大截。 最近,阿里研究团队构建了一种名为 Animate Anyone 的方法,只需要一张人物照片&#xff0…

ArkTS基本概念装饰器

目录 ArkTS基本概念 装饰器汇总 ArkTS基本概念 ArkTS是HarmonyOS的主力应用开发语言。 它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨…

Havenask 分布式索引构建服务 --Build Service

Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 分布式索引构建服务——Build Service,主打稳定、快速、易管理,是在线系…

gulimall-002 分布式基础概念

1、微服务概念 微服务是一种非常流行的架构风格。 拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。 每个服务运行在自己的单个进程使用轻量级机制通信可以使用不同的编程语言编写以及不同的数据存储技术 2、集群&分布式&…

C# MVC +Layui侧边导航栏的收缩及展开

目录 1、头部代码 2、侧边栏&#xff08;例子只写了一级导航&#xff0c;需要多级可自行添加&#xff09; 3、body内容填充 4、 JS 1、头部代码 <div class"layui-layout layui-layout-admin"> <div class"layui-header"> …

ajax请求——XMLHttpRequest请求

个人练习笔记-----Ajax01 一、GET <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</t…

BloombergGPT—金融领域大模型

文章目录 背景BloombergGPT数据集金融领域数据集通用数据集分词 模型模型结构模型相关参数训练配置训练过程 模型评估评估任务分布模型对比金融领域评估通用领域评估 背景 GPT-3的发布证明了训练非常大的自回归语言模型&#xff08;LLM&#xff09;的强大优势。GPT-3有1750亿个…

vue实现H5拖拽可视化编辑器

一款专注可视化平台工具&#xff0c;功能强大&#xff0c;高可扩展的HTML5可视化编辑器&#xff0c;致力于提供一套简单易用、高效创新、无限可能的解决方案。技术栈采用vue和typescript开发, 专注研发创新工具。 <template><div:style"style":class"…

计算机毕业设计 基于SpringBoot的高校竞赛管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2024美赛数学建模思路A题B题C题D题E题F题思路汇总 选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

TiDB 7.1 多租户在中泰证券中的应用

本文详细介绍了中泰证券在系统国产化改造项目中采用 TiDB 多租户技术的实施过程。文章分析了中泰证券数据库系统现状以及引入 TiDB 资源管控技术的必要性&#xff0c;探讨了 TiDB 多租户的关键特性&#xff0c;并阐述了在实际应用中的具体操作步骤。通过该技术的应用&#xff0…

MariaDB单机多实例的配置方法

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

ElementUI的Table组件行合并上手指南

ElementUI的Table组件行合并 &#xff0c;示例用官网vue3版的文档 <el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%; margin-top: 20px"><el-table-column prop"id" label"ID&qu…

uniapp项目如何引用安卓原生aar插件(避坑指南三)

官方文档说明&#xff1a;uni小程序SDK 1.第一步在uniapp项目下&#xff0c;创建一个nativeplugins目录&#xff0c;目录下面创建插件名称&#xff0c;这里以abcModule为例子&#xff0c;在此目录下创建android目录&#xff0c;把aar放androidd目录下&#xff0c;同时创建libs…

低代码选型注意事项

凭借着革命性的生产力优势&#xff0c;低代码技术火爆了整个IT圈。面对纷繁复杂的低代码和无代码产品&#xff0c;开发者该如何选择&#xff1f; 在研究低代码平台的年数上&#xff0c;本人已有3年&#xff0c;也算是个低代码资深用户了&#xff0c;很多企业面临低代码选型上的…

探究Android DreamService的梦幻世界

探究Android DreamService的梦幻世界 引言 DreamService的概述 在Android开发中&#xff0c;DreamService是一种特殊类型的服务&#xff0c;它可以用于创建梦幻世界的屏保应用。梦幻世界是一种用户界面显示模式&#xff0c;当设备进入空闲状态时&#xff0c;系统会自动启动D…

【网络安全 | 指纹识别工具】WhatWeb使用详析

前言 WhatWeb 是一款用于识别 Web 应用程序和 Web 服务器的开源工具。它可以识别网站使用的编程语言、Web 框架、Web 服务器软件、Web 应用程序等信息&#xff0c;从而帮助安全测试人员快速了解目标网站的技术特征&#xff0c;发现可能存在的漏洞。 本文将对 WhatWeb 的使用方法…

获取Android和iOS崩溃日志的方法

文章目录 一、Android崩溃日志1、获取方法1.1 通过adb logcat获取1.2 通过adb shell dumpsys dropbox命令获取 2、导出设备Crash日志3、导出设备ANR日志4、常见日志类别 二、iOS崩溃日志1、获取方法1.1 xcode中打开1.2 手机上直接获取 2、Crash 头部信息 一、Android崩溃日志 …

redis中根据通配符删除key

redis中根据通配符删除key 我们是不是在redis中keys user:*可以获取所有key&#xff0c;但是 del user:*却不行这里我提供的命令主要是SCANSCAN 0 MATCH user:* COUNT 100使用lua保证原子性 SCAN参数描述 在示例中&#xff0c;COUNT 被设置为 100。这是一个防止一次性获取大…