1. 常用的聚类算法:
1.1. K-Means
- 简介:K-Means 是最经典的聚类算法之一,适用于寻找球形簇。
- 特点:简单、高效,但需要预先指定簇的数量。
- 应用场景:文本聚类、图像分割、市场细分等。
1.2. DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
- 简介:基于密度的聚类算法,能够发现任意形状的簇,并且可以识别噪声点。
- 特点:不需要预先指定簇的数量,能够处理不同密度的簇。
- 应用场景:异常检测、地理数据分析等。
1.3. HDBSCAN (Hierarchical DBSCAN)
- 简介:HDBSCAN 是 DBSCAN 的改进版本,通过构建层次结构来确定最佳的簇数量。
- 特点:自动确定簇的数量,对噪声点更鲁棒。
- 应用场景:复杂数据集的聚类、异常检测等。
1.4. Hierarchical Clustering (层次聚类)
- 简介:通过不断合并或分裂簇来形成树状结构。
- 特点:可以生成层次结构的簇,适合探索性数据分析。
- 类型:
-
- Agglomerative Clustering(凝聚层次聚类):自底向上,初始时每个数据点都是一个单独的簇,逐步合并。
- Divisive Clustering(分裂层次聚类):自顶向下,初始时所有数据点在一个簇中,逐步分裂。
1.5. Gaussian Mixture Models (GMM)
- 简介:基于概率模型的聚类算法,假设数据是由多个高斯分布混合而成。
- 特点:可以处理非球形簇,能够给出每个数据点属于每个簇的概率。
- 应用场景:图像分割、语音识别等。
1.6. Spectral Clustering (谱聚类)
- 简介:通过图论的方法将数据点映射到低维空间,然后在低维空间中进行聚类。
- 特点:适用于非凸形状的簇,能够处理复杂的结构。
- 应用场景:图像分割、社区检测等。
1.7. Mean Shift
- 简介:基于模式识别的聚类算法,通过滑动窗口找到数据点的密集区域。
- 特点:不需要预先指定簇的数量,能够处理不同大小和形状的簇。
- 应用场景:图像处理、目标跟踪等。
1.8. OPTICS (Ordering Points To Identify the Clustering Structure)
- 简介:基于密度的聚类算法,类似于 DBSCAN,但能够生成一个可达性图,用于可视化数据的聚类结构。
- 特点:能够处理不同密度的簇,生成的可达性图有助于理解数据的分布。
- 应用场景:复杂数据集的聚类、异常检测等。
1.9. Birch (Balanced Iterative Reducing and Clustering using Hierarchies)
- 简介:基于层次聚类的算法,通过构建一个平衡的树结构来减少数据量,提高聚类效率。
- 特点:适合处理大规模数据集,能够快速生成初步的聚类结果。
- 应用场景:大规模数据集的聚类、在线聚类等。
1.10. Affinity Propagation (亲和传播)
- 简介:通过消息传递的方式,让每个数据点互相传递信息,最终确定簇的中心。
- 特点:不需要预先指定簇的数量,能够处理不同大小和形状的簇。
- 应用场景:生物信息学、社交网络分析等。
1.11. BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies)
- 简介:BIRCH 是一种基于层次聚类的算法,通过构建一个平衡的树结构来减少数据量,提高聚类效率。
- 特点:适合处理大规模数据集,能够快速生成初步的聚类结果。
- 应用场景:大规模数据集的聚类、在线聚类等。
1.12. Mini-Batch K-Means
- 简介:K-Means 的变体,通过使用小批量数据来更新聚类中心,提高计算效率。
- 特点:适合处理大规模数据集,能够在较短时间内得到较好的聚类结果。
- 应用场景:大规模数据集的聚类、在线聚类等。
2. 实现示例
from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering, GaussianMixture, SpectralClustering, MeanShift, OPTICS, Birch, AffinityPropagation
import numpy as np
# 加载预训练模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 假设sentences是一个包含多个语句的列表
sentences = ["这是一个例子", "这是另一个例子", "机器学习很有趣", "深度学习正在改变世界"]
# 生成句子嵌入
sentence_embeddings = model.encode(sentences)
# K-Means
kmeans = KMeans(n_clusters=2)
kmeans_labels = kmeans.fit_predict(sentence_embeddings)
# DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=2)
dbscan_labels = dbscan.fit_predict(sentence_embeddings)
# Agglomerative Clustering
agg_clustering = AgglomerativeClustering(n_clusters=2)
agg_clustering_labels = agg_clustering.fit_predict(sentence_embeddings)
# Gaussian Mixture Model
gmm = GaussianMixture(n_components=2)
gmm_labels = gmm.fit_predict(sentence_embeddings)
# Spectral Clustering
spectral_clustering = SpectralClustering(n_clusters=2)
spectral_clustering_labels = spectral_clustering.fit_predict(sentence_embeddings)
# Mean Shift
mean_shift = MeanShift()
mean_shift_labels = mean_shift.fit_predict(sentence_embeddings)
# OPTICS
optics = OPTICS(min_samples=2)
optics_labels = optics.fit_predict(sentence_embeddings)
# Birch
birch = Birch(n_clusters=2)
birch_labels = birch.fit_predict(sentence_embeddings)
# Affinity Propagation
affinity_propagation = AffinityPropagation()
affinity_propagation_labels = affinity_propagation.fit_predict(sentence_embeddings)
# 输出聚类结果
def print_clusters(labels, method_name):
for i, sentence in enumerate(sentences):
print(f"Sentence: {sentence} - {method_name} Cluster: {labels[i]}")
print("\n")
print_clusters(kmeans_labels, "K-Means")
print_clusters(dbscan_labels, "DBSCAN")
print_clusters(agg_clustering_labels, "Agglomerative Clustering")
print_clusters(gmm_labels, "Gaussian Mixture Model")
print_clusters(spectral_clustering_labels, "Spectral Clustering")
print_clusters(mean_shift_labels, "Mean Shift")
print_clusters(optics_labels, "OPTICS")
print_clusters(birch_labels, "Birch")
print_clusters(affinity_propagation_labels, "Affinity Propagation")