MATLAB初学者入门(24)—— 聚类算法

ops/2024/11/29 12:37:04/

        聚类是一种广泛使用的无监督学习技术,用于将数据集中的对象分组,使得同一组内的对象比其他组的对象更为相似。MATLAB提供了多种工具和函数来实现和分析不同类型的聚类算法

案例分析:使用K-均值聚类对数据进行分组

        假设我们有一组二维数据,我们的任务是使用K-均值聚类算法将这些数据分组。

步骤 1: 生成模拟数据

        首先,我们生成一些模拟数据,这些数据可以从几个不同的高斯分布中抽取,以模拟现实世界数据集中的群集。

% 生成三组数据
rng(1); % For reproducibility
data1 = mvnrnd([1 2], [0.5 0; 0 0.5], 100);
data2 = mvnrnd([5 5], [0.5 0; 0 0.5], 100);
data3 = mvnrnd([9 1], [0.5 0; 0 0.5], 100);% 合并数据
data = [data1; data2; data3];% 绘制原始数据
figure;
plot(data(:,1), data(:,2), 'ko');
title('Original Data');
xlabel('X1');
ylabel('X2');
步骤 2: 应用K-均值聚类

        使用MATLAB的kmeans函数来实现K-均值聚类

% 设定聚类数
k = 3;% 执行K-均值聚类
[idx, C] = kmeans(data, k);% 绘制聚类结果
figure;
gscatter(data(:,1), data(:,2), idx, 'rgb', 'osd');
hold on;
plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 12, 'LineWidth', 2);
title('K-means Clustering');
xlabel('X1');
ylabel('X2');
legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Centroids');
hold off;
步骤 3: 分析聚类结果

        聚类结果可以帮助我们了解数据的内部结构,比如哪些数据点彼此接近,可能属于同一组。

步骤 4: 调整参数

        根据需要,可能需要调整聚类数目或尝试不同的初始化方法来优化聚类结果。

% 可以尝试不同的聚类数目或使用不同的初始质心分配策略
opts = statset('Display', 'final');
[idx, C] = kmeans(data, k, 'Replicates', 5, 'Options', opts);

案例分析:使用层次聚类和DBSCAN聚类对数据进行分组

        假设我们有相同的二维数据集,并希望探索这些数据的聚类结构,但这次使用层次聚类和DBSCAN聚类

步骤 1: 应用层次聚类

        层次聚类是一种不需要预先指定聚类数的聚类方法,它通过创建一个聚类树(称为树状图)来展示数据的分层结构。

% 使用层次聚类
Z = linkage(data, 'ward');
figure;
dendrogram(Z);
title('Hierarchical Clustering Dendrogram');
xlabel('Sample index');
ylabel('Distance');

        通过观察树状图,我们可以选择一个"距离"阈值来决定聚类数,或者直接通过函数指定聚类数。

% 从树状图选择聚类数
numClusters = 3;
clusters = cluster(Z, 'Maxclust', numClusters);% 绘制层次聚类结果
figure;
gscatter(data(:,1), data(:,2), clusters);
title('Hierarchical Clustering Results');
xlabel('X1');
ylabel('X2');
步骤 2: 应用DBSCAN聚类

        DBSCAN是一种基于密度的聚类算法,能够识别任意形状的聚类,并且可以识别并处理噪声数据。

% 设置DBSCAN参数
epsilon = 2.0;  % 邻域的大小
minpts = 5;     % 形成密集区域所需的最小点数% 执行DBSCAN聚类
dbLabels = dbscan(data, epsilon, minpts);% 绘制DBSCAN聚类结果
figure;
gscatter(data(:,1), data(:,2), dbLabels);
title('DBSCAN Clustering Results');
xlabel('X1');
ylabel('X2');

案例分析:使用谱聚类对数据进行分组

        假设我们需要对一组形状复杂且不规则的数据进行聚类,我们将使用谱聚类来识别数据中的固有结构。

步骤 1: 生成复杂形状的数据

        首先,生成一个包含两个月牙形状的数据集,这种数据集通常用来演示聚类算法处理复杂数据集的能力。

% 使用MATLAB的示例数据生成函数
data = load('twomoons.mat');
points = data.X;% 绘制原始数据
figure;
scatter(points(:,1), points(:,2));
title('Original Data');
xlabel('X1');
ylabel('X2');
步骤 2: 构建相似性矩阵

        谱聚类的第一步是构建一个相似性矩阵,描述每对数据点之间的近似程度。

% 计算高斯核相似性矩阵
sigma = 0.1;
similarityMatrix = exp(-pdist2(points, points).^2 / (2*sigma^2));
步骤 3: 构建图拉普拉斯矩阵并进行特征分解

        接下来,构建归一化的图拉普拉斯矩阵,并找到其最小的几个特征向量。

% 计算度矩阵
D = diag(sum(similarityMatrix, 2));% 构建归一化的图拉普拉斯矩阵
L = D - similarityMatrix;
normL = D^(-1/2) * L * D^(-1/2);% 特征分解
[eigVecs, eigVals] = eig(normL);
步骤 4: 使用K-均值聚类对特征向量进行聚类

        谱聚类的最后一步是对特征向量空间进行K-均值聚类

% 选取最小的几个特征向量
k = 2;
V = eigVecs(:, 2:k+1);% K-均值聚类
clusterIdx = kmeans(V, k);% 绘制聚类结果
figure;
gscatter(points(:,1), points(:,2), clusterIdx);
title('Spectral Clustering Results');
xlabel('X1');
ylabel('X2');

结论

(1)展示了如何使用MATLAB中的K-均值聚类算法对复杂数据进行分组和分析。K-均值聚类是一种强大的工具,可用于数据挖掘、图像分割、市场细分等多种应用场景。在实际应用中,选择合适的聚类数量通常是挑战之一。方法如肘部法则或轮廓系数可以帮助确定最佳的聚类数。此外,K-均值聚类对初始质心的选择敏感,可能会陷入局部最优解,因此在实际操作中可能需要多次运行算法或使用不同的初始化策略来获得更稳定的聚类结果。

(2)层次聚类和DBSCAN聚类为我们提供了不同的视角来理解数据集的结构。层次聚类特别适合于那些层次结构明显的数据集,而DBSCAN聚类则适用于那些具有不同密度区域的数据集,且可以有效地处理异常点或噪声。在实际应用中,每种聚类方法都有其特定的适用场景和参数配置。选择合适的聚类方法和调整相应的参数对于获得有意义的聚类结果至关重要。通过实验和评估不同方法产生的结果,可以更好地了解数据特性,从而制定更有效的数据分析策略。

(3)谱聚类通过将聚类问题转化为图的特征分解问题,能够有效处理具有复杂形状和内在结构的数据集。它特别适合于解决那些传统聚类算法难以处理的非球形数据集聚类问题。在实践中,谱聚类的性能高度依赖于相似性矩阵的选择和参数(如高斯核的σ值)的调整。适当选择这些参数对于提高聚类结果的质量至关重要。此外,谱聚类在处理大规模数据集时可能面临计算和存储上的挑战,因此在大数据应用中可能需要考虑更高效的算法实现或使用近似方法。


http://www.ppmy.cn/ops/30375.html

相关文章

Linux编码常出现的错误

1.printf("\n");缓冲区未清空的情况,没有加\n 2.使用gdb时需要加-g调试信息选项 3.有时候可能需要多多个文件流,后面的文件流如果不能打开的话就需要关闭前面的文件流,所以不能简单的用ERROR_CHECK 4.注意字符串的最后一个字符是…

firefox 浏览器常见问题(技巧)总结

目录 问题火狐浏览器firefox 如何取消更新提醒? 待续、更新中 问题 火狐浏览器firefox 如何取消更新提醒? 1、用户在电脑桌面上找到火狐浏览器,接着用鼠标右键点击,在弹出来的右键菜单中,用户选择其中的打开文件所在的位置选项火狐浏览器怎…

web server apache tomcat11-29-Windows Authentication

前言 整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

OneFlow深度学习框架入门与实践

OneFlow深度学习框架入门与实践 一、引言 在深度学习领域,框架的选择对于研究人员和开发者至关重要。OneFlow作为一款新兴的深度学习框架,凭借其高性能、易用性和灵活性,逐渐在业界崭露头角。本文将带领大家深入了解OneFlow深度学习框架&am…

数据结构(三)------栈

制作不易,三连支持一下呗!!! 文章目录 前言一、什么是栈二、栈的实现 1.栈的结构2.栈的初始化和销毁3.栈的插入数据和删除数据4.取栈顶元素总结 前言 前面我们介绍了第二种数据结构---链表,这里我们继续介绍下一种数据…

STM32学习和实践笔记(24):PWM输出实验:呼吸灯

本实验所要实现的功能是:通过TIM3的CH1输出一个PWM信号,控制D7指示 灯由暗变亮,再由亮变暗,类似于人的呼吸。程序框架如下: (1)初始化PC6管脚为PWM输出功能 (2)PWM输出…

C语言:文件操作(上)

片头 嗨!小伙伴们,今天我们来学习新的知识----文件操作,准备好了吗?我要开始咯! 目录 1. 为什么使用文件? 2. 什么是文件? 3. 二进制文件和文本文件? 4. 文件的打开和关闭 5. 文件顺序读写…

【笔试训练】day17

1.小乐乐该数字 遇到按位处理的情况可以考虑用字符串去读 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;int main() {string str;cin >> str;int ans 0;for (int i 0; i < str.siz…