一些前提的约定,还是沿用上篇文章的哈。先来致敬下男神。

一:层次聚类(Hierarchical Clustering)介绍
它也是聚类算法的一种,也是我学习的第三种聚类算法,通过计算样本点之间的相似性,也可以理解成距离,构建出一个嵌套层次聚类树,有两种方式,一个是自下而上的合并法,一个是自上而下的分裂法,本文讲解更容易理解的合并法。

如上图所示,不断地将样本汇聚成小的簇,再将晓得簇不断重复该过程汇聚成更大簇。

二:算法介绍
简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。然后不断迭代这一过程,直到最后所有的样本都在一个类别内。

算法详细过程如下:
1:距离矩阵
现在我们需要描述类别和类别之间的相似性,也可以用距离来衡量,我们这里还是用欧氏距离来计算。给定两个样本点x(i), x(j)。

首先呢,我们需要建立一个距离矩阵D,D(i, j)表示类别i到类别j的距离,D(j, i)表示类别j到类别i的距离,很明显D(i, j)= D(j, i)。D(i, i)就是自身类别到自身的距离,也就是对角线的元素,恒等于0,即D(i, i)=0。
请注意这里的用词,类别,类别可以包含一个样本点,也可以包含多个样本点。
最开始的矩阵,每个类别就是每一个样本点自身,这个矩阵其实也就是样本点到样本点的距离矩阵。

然后找到距离最小的两个类别,将其合并为一个类别。假设合并了第i个和第j个类别组成一个新的类别{i,j}。那么我们将重新计算距离矩阵,此时{i,j}将作为一个整体参与距离运算,所以之类先必须学习一下,包含有多个样本的类别之间距离计算方法。有三种。
Single Linkage:将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。
Complete Linkage:的计算方法与Single Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。
Average Linkage:计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。
Center Linkage:计算两个类别的质心μi和μj之间的距离,我不知道这样做科学不?这个是我临时想到的一种计算的方法。

我们这里使用第三种方法,举个例子。假如有两个类别A和B,A包含有样本{1,2},B包含有样本{3,4}。那么可得:D(A,B)=[D(1,3)+ D(1,4) + D(2,3) + D(2,4)]/4;

三:简单实践一波

给定这个样本集合,我们希望最后化成2个簇,当然了,我们可以在任意簇群的时候停止迭代即可。我这里实验的话,我想最后聚类成2个簇群。

clear all
clc% randomly construct the samples
x_1 = [0.5:0.05:1.5];
y_1 = 1.5 .+ rand(1, size(x_1)(2));
x_2 = [2.5:0.05:3.5];
y_2 = 4.5 .+ rand(1, size(x_2)(2));x = [x_1, x_2];
y = [y_1, y_2];
trainData = [x', y'];figure();
subplot(1, 2, 1);
hold on;% drow all the points
scatter(trainData(:, 1), trainData(:, 2), 'g', 'linewidth', 3);xlim([0,5]);
ylim([0,6]);
%axis equal;
grid on;
xlabel('x1');
ylabel('x2');% let's start
% calclate all the distance from each point to another point.
m = size(trainData)(1);
D = zeros(m, m);
for i=1:mD(:,i) = sqrt(((trainData(i, :) .- trainData) .^ 2) * ones(2,1));
end;function dis = calDis(Data, arr1 ,arr2)dis = 0;for i=1:size(arr1)(1)for j=1:size(arr2)(1)dis += Data(arr1(i), arr2(j));end;end;dis = dis /(size(arr1)(1) * size(arr2)(1));
end;% init the type array
Temp_Type = cell(m , 1);
for i=1:size(Temp_Type)(1)Temp_Type{i,1} = [i];
end;% the lowest layer of cluster tree should is normal smaple points
prevItr = floor(m/2)-1;% we set the stop condition is all the samples divided into K clusters
K = 2;% think that, finally we want all the samples into two clusters.
while size(Temp_Type)(1) > K% claculate all distance againnewSize = size(Temp_Type)(1);Temp_Data = cell(newSize , 1);for i=1:newSizeTemp_Data{i, 1} = [];for j=1:newSizeif i == jTemp_Data{i, 1}(1, end + 1) = [0];else Temp_Data{i, 1}(1, end + 1) = calDis(D, Temp_Type{i, 1}, Temp_Type{j, 1});end;end;end;% find the min distance between two types.i=0;j=0;min_dis = intmax('int32');for row=2:newSizethisRow = Temp_Data{row, :}(1, 1:row-1);val = min(thisRow);col = find(thisRow == val);if min_dis > valmin_dis = val;i = row;j = col;end;end;% merge this two type.Temp_Type{i,1} = [Temp_Type{i,1}, Temp_Type{j,1}];Temp_Type(j,:) = [];end;subplot(1, 2, 2);
hold on;% drow all the points
scatter(trainData(Temp_Type{1}(1, :), 1), trainData(Temp_Type{1}(1, :), 2), 'r', 'linewidth', 3);
scatter(trainData(Temp_Type{2}(1, :), 1), trainData(Temp_Type{2}(1, :), 2), 'b', 'linewidth', 3);xlim([0,5]);
ylim([0,6]);
%axis equal;
grid on;
xlabel('x1');
ylabel('x2');

聚类结果如下:

再实验一组数据:

得到结果如下:

总结一下:这个算法运行还式很慢的。真的是慢,虽然我的算法可以进行优化,但是还是慢。DBSCAN还是很快的。

每天进步一点点《ML - 基于层次的聚类》相关推荐

  1. 每天进步一点点《ML - 感知机》

    一些前提的约定,还是沿用上篇文章的哈.先来致敬下男神. 一:感知机 感知机是一种线性二分类模型,其目的是找到能将训练数据线性可分的分离超平面.超平面线性模型为 联想起之前学到逻辑斯特回归的决策边界,Z ...

  2. 感知机介绍及MATLAB实现

    文章目录 前言 1 感知机简介 2 感知机结构 3 感知机学习过程 3.1 数据传播过程 3.2 参数更新过程 4 代码实现 4.1 准备数据 4.2 感知机训练学习 4.3 感知机仿真测试 总结 2 ...

  3. 每天进步一点点《ML - 线性回归》

    本系列Machine Learning 的学习博文很大部分全是受教于 Andrew Ng 的Stanford录制的ML视频,我的男神. 致敬男神! 第一次写这样系列的博文,单纯是为了记录自己的所学,做 ...

  4. 【ML】基于机器学习的心脏病预测研究(附代码和数据集,多层感知机模型)

    写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌. 之前创作过心脏病预测研究文章如下: [ML]基于机器学 ...

  5. 每天进步一点点《ML - 支持向量机》

    一些前提的约定,还是沿用上篇文章的哈.先来致敬下男神. 一:支持向量机(support vector machine) 在感知机那一章节我们讲了,对样本的分类过程中,可以用维度空间内的某个超平面划分开 ...

  6. 每天进步一点点《ML - 正则化代价函数》

    本系列Machine Learning 的学习博文很大部分全是受教于 Andrew Ng 的Stanford录制的ML视频,我的男神. 一:欠拟合(Under fitting)与过拟合(Over fi ...

  7. 每天进步一点点《ML - 高斯混合模型》

    上一篇文章学习了极大似然估计和EM算法,这一章节就是学习EM算法的具体应用场景,高斯混合模型,是一中聚类的算法. 一:高斯混合模型(GMM) 我们将一个分布复杂的数据分布,用多个高斯概率分布来共同表示 ...

  8. 每天进步一点点《ML - 从极大似然到EM算法》

    一:极大似然 1:概念引入 极大似然参数估计是概率论中学习过的内容,就是预先定义概率分布模型,根据一堆的同概率分布的一堆样本数据去估计该概率模型中的未知参数. 举个例子:有很多西瓜x,我们可以得到每一 ...

  9. 每天进步一点点《ML - Sklearn库简单学习》

    一:Sklearn介绍 Sklearn是一个强大的机器学习库,基于python的.官方文档(http://scikit-learn.org/stable/ ).如下列举部分的使用场景. 由图中,可以看 ...

  10. 每天进步一点点《ML - 异常点检测》

    一些前提的约定,还是沿用上篇文章的哈.先来致敬下男神. 一:异常点检查(Anomaly Detection) 这一章节相对来说简单很多,也可以说是很大程度是概率论的知识内容了. 异常点,和大部分正常状 ...

最新文章

  1. Playframework2 标签速记
  2. 成熟的夜间模式解决方案
  3. 资源调度框架YARN
  4. 省二计算机二级vb程序设计题,江苏省计算机二级考试VB程序设计复习题(分类汇总)...
  5. 基于Linux的Socket编程之TCP全双工Server-Client聊天程序
  6. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(NumPy科学计算库<2>python)
  7. 日访问量1万mysql_日访问量1万服务器
  8. 语音识别 | 从入门到精通的高效选择!
  9. iOS 点击返回键崩溃的未解之谜
  10. 如何在Angular中引入AliPlayer
  11. 智力答题源码php,基于PHP智力竞赛抢答计分系统PHP1025(毕业设计+论文)
  12. 搜索命令:whereis/which/locate/find/grep
  13. c打包html,cmake使用教程(十一)-使用cpack打包源码并编写自动化脚本上传到仓库...
  14. Asc、AscB、AscW
  15. JAVA设计模式之——抽象工厂模式
  16. 应用回归分析(知识点整理)(一)
  17. 【Windows】“很抱歉,此功能看似已中断,并需要修复。请使用Windows控制面板中的“程序和功能”选项修复Microsoft Office。”的解决方法
  18. Linux内核页表管理-那些鲜为人知的秘密
  19. 一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
  20. Space Invaders 太空侵略者

热门文章

  1. sqoop数据导出导入命令
  2. 如何使用cocoapods来进行依赖库的管理
  3. Winform使用DevExpress的WaitDialogForm画面 z
  4. 在TOC中添加右键查看属性信息菜单
  5. 用pycharm搭建odoo 12, 11,10 开发调试环境
  6. Hystrix面试 - 基于本地缓存的 fallback 降级机制
  7. ZooKeeper管理员指南
  8. 使用kubeadm安装Kubernetes
  9. 如何在CentOS 7上安装和配置MySQL Cluster
  10. 计算机技能大赛图形试题,图形图像处理技能大赛竞赛试题试卷.doc