对给定的55种葡萄进行聚类分析,真实数据分为红葡萄和白葡萄两类,要求根据每种葡萄的特征向量x=(x1,x2,…,x6)采用聚类分析这些数据的特点,并根据真实数据验证聚类的准确性。
聚类,简单地说就是把相似的东西分到一组。聚类的时候我们并不关心某一类是什么,需要实现的目标只是把相似的东西聚到一起,因此,一个聚类算法通常只需要知道如何计算相似度就可以开始工作了,聚类因此在Machine Learning中被称作unsupervisedlearning (无监督学习)。本次实验数据虽然给出了结论,但我们假设不知道结论,并且在对实验数据不了解的情况下,尝试用聚类的方式对数据进行分析并同结论对比。具体采用以下两种方式:
1. K-means:
把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离它最近的均值(此即聚类中心)对应类别,以之作为聚类的标准。
2. 层次聚类:
1) 自底向上:起初每个元素都是一类,每次将最距离最近的两类聚为一类;
自顶向下:起初所有元素都在一类中,每次找出最不相似的元素分离出去形成两类。
3. 算法描述:a) K-means聚类:
Step1: 读入葡萄数据G[GRAPENUM],初始化类数组U[TYPENUM];
Step2: 根据得到的葡萄数据G确定MaxAttr[ATTRNUM]和MinAttr[ATTRNUM],计算Diff[ATTRNUM]并对G进行归一化处理;
Step3: 对每个类的中心进行初始化;
Step4: LOOP:判断当前划分次数是否耗尽或者两次划分类的中心没有发生很大改变,如果是,转Step7:;
Step5: 对每个葡萄计算其到各个类中心的距离,选择距离最小的类加入其中;
Step6: 重新计算各个类的中心,计算新类的中心与旧类的中心的差异Distin,转LOOP;
Step7: 输出各个类中的葡萄,算法结束。
b) 层次聚类(自底向上):
Step1: 读入葡萄数据G[GRAPENUM],初始化类数组U[TYPENUM];
Step2: 根据得到的葡萄数据G确定MaxAttr[ATTRNUM]和MinAttr[ATTRNUM],计算Diff[ATTRNUM]并对G进行归一化处理;
Step3: 将每个葡萄分别作为一类;
Step4: LOOP:判断当前分类数是否达到目标分类数,如果达到,转Step7:;
Step5: 找出中心相距最近的两类并将其合并为一类,计算该类的中心;
Step6: 类数+1,转Step4:;
Step7: 输出各类中的葡萄,算法结束。
4. 结果分析:
1. K-means聚类结果及分析:
a) 采用欧式距离:
未归一化处理:
归一化处理后: