聚类算法——层次聚类

聚类学习

一、基本概念

  1. 定义:是聚类算法的一种,通过计算不同类别数据点之间的相似度来创建一棵有层次的嵌套聚类树。
  2. 在聚类树中,不同类别的原始数据点是树的最底层,树的顶层是一个聚类的根节点。
    图+代码
  3. 创建聚类树有自下而上合并和自上而下分裂两种方法。

二、自下而上的合并算法

  1. 层次聚类的合并算法通过计算两类数据点之间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。
  2. 简单来说,层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定他们的相似性,距离越小,相似度越高,并将距离最近的两个数据点活类别进行组合,生成聚类树。
  3. 相似度的计算:层次聚类使用欧氏距离来计算不同类别数据点间的距离(相似度)。
    D=\sqrt{(x_{1}-y_{1})^{2}+(x_{2}-y_{2})^{2}} 

三、两个组合数据点间的距离

  1. Single Linkage:是将两个组合数据点中距离最近的两个数据点之间的距离作为这两个组合数据点的距离。
    缺点:这种方法容易收到极端值的影响,两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。
  2. Complete Linkage:是将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。
    缺点:两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合到一起。
  3. Average Linkage:是计算两个组合数据点中的每个数据点与其他所有数据点的距离,将所有距离的均值作为两个组合数据点间的距离。
    缺点:这种计算方法计算量比较大,但结果比前两种方法更合理 。

四、层次聚类的优点和缺点

1.优点:

  1. 层次结构展现: 层次聚类产生的结果以树状结构(树状图或者树状簇间的关系图)呈现,能够直观展现不同层次下数据的聚类情况,有利于理解数据的结构。

  2. 无需预先指定簇的数量: 不需要事先知道要形成的簇的数量,因为层次聚类在树中自动形成不同层次的簇。

  3. 适用性广泛: 层次聚类方法适用于各种数据类型,可以是数值型数据、分类数据或者混合数据。

  4. 不受初始值选择的影响: 与一些基于初始值的聚类方法(如 K-Means)不同,层次聚类不受初始值选择的影响。

2.缺点:

  1. 计算复杂度高: 随着样本数量的增加,层次聚类的计算复杂度也会增加,尤其是在大规模数据集上效率较低。

  2. 不适用于大型数据集: 对于大型数据集,层次聚类的计算成本和内存消耗可能变得非常高,使其应用受到限制。

  3. 不易处理噪声和离群值: 对于含有噪声或离群值的数据,层次聚类可能会产生不理想的结果,因为它的聚类结果是由所有数据点组成的树状结构决定的。

  4. 不可逆性和后剪枝困难: 一旦形成了聚类树,很难反向修剪聚类结果或对树进行调整。

尽管层次聚类具有直观性和不需要预先指定簇数量等优点,但其在处理大型数据集和噪声数据方面存在一些限制,需要根据具体情况进行权衡和选择。

五、MATLAB中层次聚类的代码实现

function hierarchicalClustering(data, k)
    % data: 输入的数据,每行为一个样本,每列为一个特征
    % k: 聚类的簇的数量

    % 计算样本间的距离
    distanceMatrix = pdist(data);

    % 构建层次聚类树
    linkageMatrix = linkage(distanceMatrix);

    % 对数据进行层次聚类
    clusterIndices = cluster(linkageMatrix, 'Maxclust', k);

    % 绘制聚类结果
    gscatter(data(:,1), data(:,2), clusterIndices);
    title('Hierarchical Clustering');
    xlabel('X');
    ylabel('Y');
end
% 创建样本数据
data = [randn(50,2)*0.75+ones(50,2);
        randn(50,2)*0.5-ones(50,2)];

% 调用层次聚类函数并指定簇的数量为3
hierarchicalClustering(data, 3);

操作流程:

  1. 准备数据
    首先,准备你的数据。数据应该是一个矩阵,每行代表一个样本,每列代表一个特征。
  2. 编写层次聚类函数
    将我之前提供的 MATLAB 层次聚类函数保存为一个独立的 .m 文件。将文件保存在 MATLAB 的工作路径下或者当前工作目录中,确保它在你的 MATLAB 环境中可用。
  3. 导入数据
    在 MATLAB 中导入你准备好的数据。这可以通过 load 命令或手动创建一个矩阵来完成。
    % 例如,手动创建一个数据矩阵 data = [randn(50,2)*0.75+ones(50,2); randn(50,2)*0.5-ones(50,2)];
  4. 调用层次聚类函数

    使用之前编写的层次聚类函数,并传入数据和所需的簇的数量作为参数。
    % 例如,指定簇的数量为3进行层次聚类 hierarchicalClustering(data, 3);

  5. 分析结果
    运行代码后,会显示一个散点图,显示了数据样本并根据层次聚类结果进行了彩色标记。通过这个图可以观察到不同簇的分布情况。

  6. 调整参数和分析结果
    根据需要,你可以尝试使用不同的簇数量或调整其他参数来查看不同的聚类结果。在调整参数后,重新运行代码并分析新的聚类结果。 

变量含义:

  1. data:数据矩阵,每一行代表一个样本,每一列代表一个特征。

  2. distanceMatrix:通过 pdist 计算得到的样本间的距离矩阵。这个矩阵描述了每对样本之间的距离信息。

  3. linkageMatrix:通过 linkage 函数构建的层次聚类树的链接矩阵。它包含样本之间的连接信息,用于构建聚类树。

  4. clusterIndices:使用 cluster 函数根据链接矩阵和指定的参数(例如 'Maxclust', k)得到的聚类结果。每个样本被分配到一个簇,簇的标识以整数形式表示。

  5. k:用户指定的簇的数量,用于控制聚类过程中生成的簇的数量。

  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻辣小凉皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值