一、实验目的
- 了解聚类的概念和层次聚类的方法
- 实现三种不同的层次聚类算法
- 对比三种不同算法在不同的数据集的情况下的性能
二、代码框架
-
本次实验使用的函数框架如下:
1.create_sample(mean, cov, num, label) #生成样本均值向量为mean,协方差矩阵为cov的,数量为num,标签为label的数据集 2.PoMinkowski(x1,x2,dimension,p=2) #两样本点之间Minkowski距离,dimension表示样本的特征维数,p=2时,计算的是欧氏距离 3.clusingle(clu1,clu2,dimension,p=2) #最短距离/单连接 (single linkage) 4.clucomplete(clu1,clu2,dimension,p=2) #最⻓距离/全连接 (complete linkage) 5.cluaverage(clu1,clu2,dimension,p=2) #平均距离 (average linkage) 6.discluster(cluster,dimension,kind=0,p=2) #类距离矩阵的生成,kind表示使用3,4,5中的哪种方法生成类距离矩阵 7.dismin(distance) #根据类距离矩阵确定距离最近的两个类 8.update(cluster,res) #更新类,将cluster中的res编号的两个类合并 9.datastat(cluster) #数据统计,统计合并完成后生成的三个类的数据 10.aggregation(cluster,dimension,kind=0,p=2) #聚合操作 11.makeplt3D(List) #根据List绘制三维点空间分布图 12.makeplt2D(List,label1) #根据List和label绘制分布直方图
三、代码详解
-
产生数据
# 生成数据 def create_sample(mean, cov, num, label): ''' :param mean: 均值向量 :param cov: 协方差矩阵 :param num: 数量 :param label: 标签 :return: 最终生成的数据前三列表示特征,后一列表示便签 ''' x,y,z=np.random.multivariate_normal(mean,cov,num).T L = np.ones(num)*label X=np.array([x,y,z,L]) return X.T使用
np.random.multivariate_normal函数生成均值向量为mean,协方差矩阵为cov,数量为num,标签为label的样本数据。 -
两点之间的距离计算
def PoMinkowski(x1,x2,dimension,p=2): ''' :param x1: 点x1 :param x2: 点x2 :param dimension: 两个点所在的空间维度 :param p: 参数p=2时为欧氏距离 :return: 距离 ''' dis = 0 for i in range(dimension): dis = dis + math.pow(x1[i]-x2[i],p) return math.sqrt(dis)
在本次试验中使用闵可夫斯基距离进行计算,默认使用p=2,即计算两个点之间的欧氏距离 -
三种层次聚类算法(基本要求和中级要求)
# 最短距离single linkage def clusingle(clu1,clu2,dimension,p=2): Min = float("inf") for i in range(len(clu1)): for j in range(len(clu2)): d=PoMinkowski(clu1[i],clu2[j],dimension,p) Min = d if d < Min else Min return Min # 最长距离complete linkage def clucomplete(clu1,clu2,dimension,p=2): Max = float("-inf") for i in range(len(clu1)): for j in range(len(clu2)): d = PoMinkowski

最低0.47元/天 解锁文章
3283

被折叠的 条评论
为什么被折叠?



