简单介绍:
假设有N个待聚类的样本,对于层次聚类来说,步骤:
1.(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度;
2.寻找各个类之间最近的两个类,将他们归为一类(类总数减少一个)
3. 重新计算新生成的这个类与各个旧类之间的相似度;
4.重复2和3直到所有的样本点都归为一类,结束。
创建了一个树形结构,这样的话,给定一个阈值,便于分割。
判断两个类之间的相似度的不同方法:
1.SingleLinkage:又叫做nearest-neighbor,就是取两个类之间距离最近的两个uangben的距离作为这两个集合的距离,即,最近两个样本之间的距离越小,这两个类之间的相似度越高。4
容易造成一种叫做chaining的效果,两个cluster明明从大局上相隔较远,但是因为个别点距离比较近而被合并了,并且这样合并之后chaining效应会进一步扩大,最后会得到比较松散的cluster.
2.CompleteLinkage:这个是SingleLinkage的反面极端,取这两个集合中距离最远的两个点之间的距离作为两个集合之间的距离.效果与singleLinkage相反,也是不太好的方法。
3.Average-linkage:这种方法就是将两个集合中的点的两两的距离全部放在一起求一个平均值,相对也得到一个合适的效果
4.average-linkage的一个变种就是取两两距离之间的中值(中位数),与均值相比更加可以解除个别偏离样本对结果的干扰。
Python实现:
1.Hierarchical_clustering.py
#coding=utf-8
#层次聚类Hierarchical_clustering方法实现
from numpy import *
from scipy.cluster._hierarchy import cluster_dist
from math import *
class cluster_node:
# 构造函数:self:this
def __init__(self, vec, left=None, right=None, distance=0.0, id=None, count=1):
self.left = left
self.right = right# 每次聚类都是一对数据,left保存其中一个数据,right保存另一个
self