一、密度聚类
密度聚类亦称“基于密度的聚类”,此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类蔟以获得最终的聚类结果。
它将数据点组织成簇的方式是通过寻找数据点周围的密度高于某个阈值的区域。密度聚类的核心是密度可达性,即如果一个点A在另一个点B的密度半径内,则A可以到达B。密度聚类相比于传统的聚类算法(如K-Means、层次聚类等)更加灵活,可以处理不同形状和密度的簇。
密度聚类的流程如下:
- 选择一个密度半径r和一个最小的密度n,n表示在密度半径r内至少有n个数据点才能形成一个簇。
- 随机选择一个未被访问的数据点p,找到p的密度半径r内的所有数据点。
- 如果p的密度大于等于n,则将p标记为核心点,并将p的密度半径内的所有数据点加入到p的簇中。
- 如果p的密度小于n,则将p标记为噪声点。
- 重复2-4直到所有的数据点都被访问过。
- 将所有被标记为核心点的数据点组成簇,将噪声点排除掉。
下面是Python实现密度聚类的代码:
import numpy as np
from sklearn.neighbors import NearestNeighbors
class DensityCluster:
def __init__(self, radius=1.0, min_samples=5):
self.radius = radius
self.min_samples = min_samples
self.labels_ = None
def fit(self, X):
nbrs = NearestNeighbors(radius=self.radius, min_samples=self.min_samples).fit(X)
self.labels_ = np.zeros(X.shape[0])
cluster_id = 1
for i, point in enumerate(X):
if self.labels_[i] != 0:
continue
neighbors = nbrs.radius_neighbors([point])[1][0]
if len(neighbors) < self.min_samples:
self.labels_[i] = -1
else:
self.labels_[neighbors] = cluster_id
while len(neighbors) > 0:
new_neighbors = []
for j in neighbors:
if self.labels_[j] == -1:
self.labels_[j] = cluster_id
elif self.labels_[j] == 0:
self.labels_[j] = cluster_id
new_neighbors += nbrs.radius_neighbors([X[j]],radius=self.radius, return_distance=False)[0].tolist()
neighbors = new_neighbors
cluster_id += 1
return self.labels_
以上代码实现了带有核心点和噪声点的密度聚类算法。其中,radius和min_samples是密度聚类算法的两个超参数。如果一个数据点在radius半径内至少有min_samples个数据点,则它是一个核心点;如果一个数据点在radius半径内少于min_samples个数据点,则它是一个噪声点。
二、层次聚类
层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构。数据集的划分可采用“自底向上”的聚合策略,也可采用“自顶向下”的分析策略。
AGNES是一种采用自底向上聚合策略的层次聚类算法。它先将数据集中的每个样本看作一个初始聚类簇,然后在算法运作的每一步中找出距离最近的两个聚类蔟进行合并,该过程不断重复,直至达到预设的聚类蔟个数。这里的关键是如何计算聚类簇之间的距离。实际上,每个蔟是一个样本集合,因此,只需要采用关于集合的某种距离即可。
AGNES聚类是一种层次聚类算法,其原理是将样本逐步合并成越来越大的簇,形成一个层次结构。AGNES的全称是Agglomerative Nesting,即自底向上凝聚的层次聚类法。
AGNES的流程如下:
初始化:把每个样本看成一个簇;
计算样本之间的距离(相似度);
合并距离最近的两个簇为一个簇;
重新计算样本之间的距离;
重复步骤3和4,直到所有样本都被合并成为一个簇。
以下是用Python实现AGNES聚类的代码:
from sklearn.cluster import AgglomerativeClustering
import numpy as np
# 构造样本数据
X = np.random.rand(10, 2)
# 创建AGNES聚类器对象
model = AgglomerativeClustering(n_clusters=2, linkage='ward')
# 训练模型并预测分类
y = model.fit_predict(X)
# 打印分类结果
print(y)
在上述代码中,我们使用了Scikit-learn库中的AgglomerativeClustering类来实现AGNES聚类。其中,n_clusters参数指定聚类簇的个数,linkage参数指定计算簇之间距离的方法。fit_predict方法用于训练模型并预测分类结果,最后打印出分类结果。