一、实验要求
在计算机上验证和测试k-means聚类和高斯混合模型聚类实验,sklearn的相关聚类算法。
- 实验目的
1、掌握k-means聚类算法的原理
2、掌握高斯混合模型聚类算法的原理;
3、掌握sklearn如何实现聚类;
三、实验内容
实验步骤
- 请根据cluster文件代码,根据K均值聚类算法的原理,有两种初始化方法,一种是随机中心点,一种是随即分类,请修改代码实现另一种初始化也就是随机分类代码,然后观察聚类过程比较两种随机初始化方法效果。
class KMeans:
def __init__(self, n_clusters=3, max_iter=15):
self._n_clusters = n_clusters
self._X = None
self._y = None
self._center = None
self._max_iter = max_iter
def fit(self, X):
self._X = X
n = X.shape[0]
d = X.shape[1]
self._y = np.array([np.random.randint(0, 3) for _ in range(150)])
self._center = np.array([np.mean(X[self._y == i, :], axis=0) for i in range(self._n_clusters)])
print(self._center)
step = 0
# 迭代
while step < self._max_iter:
# 显示中间过程
plt.figure()
plt.scatter(X[self._y == 0, 0], X[self._y == 0, 1], marker='+')
plt.scatter(X[self._y == 1, 0], X[self._y == 1, 1], marker='+')
plt.scatter(X[self._y == 2, 0], X[self._y == 2, 1], marker='+')
plt.scatter(self._center[0, 0], self._center[0, 1])
plt.scatter(self._center[1, 0], self._center[1, 1])
plt.scatter(self._center[2, 0], self._center[2, 1])
plt.show()
distances = np.array([np.sum((X - self._center[i, :]) ** 2, axis=1) for i in range(self._n_clusters)])
self._y = np.argmin(distances.T, axis=1)
step += 1
return self
随机分类 随机中心点
- 2请对比sklearn的K均值聚类和混合高斯模型,针对make_blobs生成的基本数据集, makemoons生成的太极数据集,makecircles生成的圆环数据集,多类数据集,对比聚类的效果如何。
四、实验总结
Kmeans计算量不大,收敛快。可以很方便的进行分布式计算。默认所有属性对距离的影响是相同的,默认所有数据均匀分布在聚类中。
GMM假设各个特征的权重不同,假设各个聚类中的数据分布不均匀。理论上可以拟合任何连续函数。计算量较大。如果其中一个聚类的数据并不服从正态分布、偏态分布,聚类算法会出现偏差。