公众号:尤而小屋 作者:Peter 编辑:Peter
大家好,我是Peter~
本文主要介绍8个常见聚类算法和基本原理:
K-Means聚类算法的原理如下:
1、K-Means聚类算法的优点包括:
2、K-Means聚类算法也存在以下缺点:
import numpy as np
import matplotlib.pyplot as plt
def kmeans(X, k, max_iterations=100):
"""
K-Means聚类算法实现
:param X: 数据集
:param k: 聚类数
:param max_iterations: 最大迭代次数
:return: 聚类结果
"""
centroids = X[np.random.choice(X.shape[0], k, replace=False)] # 随机初始化聚类中心
for i in range(max_iterations):
# 计算每个样本到聚类中心的距离
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
# 根据距离将样本划分到距离最近的聚类中心所在的簇
labels = np.argmin(distances, axis=0)
# 重新计算各簇的中心
new_centroids = np.array([X[labels == j].mean(axis=0) for j in range(k)])
# 判断是否收敛
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
return labels, centroids
# 测试
X = np.random.rand(100, 2)
labels, centroids = kmeans(X, k=4)
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
层级聚类(Hierarchical Clustering)是一种基于树形结构的聚类算法,通过将数据点逐步合并成簇,最终形成一棵树形的聚类结构。层级聚类算法可以分为两种:自底向上聚类(Agglomerative Clustering)和自上向下聚类(Divisive Clustering)
1、自底向上聚类的原理:
2、自上向下聚类的原理:
1、层级聚类的优点包括:
2、层级聚类也存在以下缺点:
import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram
# 生成数据集
X = np.random.rand(10, 2)
# 计算聚类距离矩阵
Z = linkage(X, method='ward')
# 绘制聚类树状图
dendrogram(Z)
# 显示图形
plt.show()
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,用于将高维数据分组为密度相连的、具有相似特征的多个数据簇。其原理如下:
主要优点:
主要缺点:
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成一个随机数据集
X, y = make_blobs(n_samples=1000, centers=8, random_state=42)
# 创建DBSCAN聚类器
dbscan = DBSCAN(eps=0.5, min_samples=5)
# 进行聚类
labels = dbscan.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow')
plt.show()
均值漂移聚类(Mean Shift Clustering)是一种基于密度的聚类算法,用于将高维数据分组为密度相连的、具有相似特征的多个数据簇。其原理如下:
1- 选择参数:均值漂移聚类算法需要选择一个关键参数,即带宽(bandwidth)。带宽用于控制均值漂移算法的搜索半径,即决定哪些数据点被认为是相似的。
主要优点:
主要缺点:
from sklearn.cluster import MeanShift
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成一个随机数据集
X, y = make_blobs(n_samples=1000, centers=8, random_state=42)
# 创建MeanShift聚类器
meanshift = MeanShift(bandwidth=0.5)
# 进行聚类
labels = meanshift.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow')
plt.show()
谱聚类(Spectral Clustering)是一种基于图论的聚类方法,通过将数据点映射到低维空间,然后在低维空间中进行聚类。其原理如下:
1、谱聚类的优点包括:
2、然而,谱聚类算法也存在以下缺点:
from sklearn.cluster import SpectralClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成一个随机数据集
X, y = make_blobs(n_samples=1000, centers=8, random_state=42)
# 创建谱聚类器
spectral = SpectralClustering(n_clusters=8, affinity='nearest_neighbors', assign_labels='kmeans')
# 进行聚类
labels = spectral.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow')
plt.show()
模糊聚类(Fuzzy Clustering)是一种基于模糊逻辑的聚类方法,它允许每个数据点在多个簇中具有不同的隶属度。其原理如下:
1-主要优点
2-主要缺点
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成一个随机数据集
X, y = make_blobs(n_samples=1000, centers=8, random_state=42)
# 创建模糊聚类器
fuzzy_clustering = AgglomerativeClustering(n_clusters=8, linkage='complete', affinity='euclidean')
# 进行聚类
labels = fuzzy_clustering.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='rainbow')
plt.show()
密度峰值聚类(DPC)是一种基于密度的聚类方法,其原理是基于以下两个假设:
DPC算法的主要思路是通过搜索数据空间中的密度峰值来确定类簇的中心,然后将周围的点归为相应的簇。具体来说,DPC算法主要包括以下步骤:
(1)计算每个数据点在数据空间中的局部密度,可以使用基于最近邻的方法来计算;
(2)搜索密度峰值,将所有密度大于周围点密度的点标记为可能的簇中心;
(3)对于每个可能的簇中心,计算其与周围点的距离,如果距离小于某个阈值,则将它们归为同一簇;
(4)迭代更新每个簇的中心,直到簇中心不再变化或达到最大迭代次数。
参考文献:https://blog.csdn.net/weixin_45317919/article/details/121472851
1、主要优点
2、主要缺点
DPC算法也存在一些缺点:
import numpy as np
def distance(x1, x2):
# 计算两个样本点之间的欧氏距离
return np.sqrt(np.sum((x1 - x2) ** 2))
def local_density(x, X, delta):
# 计算样本点x的局部密度
distance_list = [distance(x, x_i) for x_i in X]
return sum([1 for d in distance_list if d < delta])
def min_distance(x, X):
# 计算样本点x与其他样本点的最小距离
distance_list = [distance(x, x_i) for x_i in X]
return np.min(distance_list)
def find_density_peaks(X, delta, rho):
n_samples = len(X)
rhos = np.zeros(n_samples)
deltas = np.zeros(n_samples)
for i in range(n_samples):
rhos[i] = local_density(X[i], X, delta)
sorted_indices = np.argsort(-rhos)
max_rho_index = sorted_indices[0]
for i in range(n_samples):
deltas[i] = min_distance(X[i], X)
centers = [max_rho_index]
center_deltas = [deltas[max_rho_index]]
for i in range(1, n_samples):
if rhos[sorted_indices[i]] > rho and deltas[sorted_indices[i]] > center_deltas[-1]:
centers.append(sorted_indices[i])
center_deltas.append(deltas[sorted_indices[i]])
return centers
# 示例用法
X = np.array([[1, 2], [1.5, 2.5], [2, 1], [6, 5], [6.5, 4.5], [5.5, 5]])
delta = 1.0
rho = 2
centers = find_density_peaks(X, delta, rho)
print("聚类中心点的索引:", centers)
在上面的代码中,distance函数用于计算两个样本点之间的欧氏距离。local_density函数计算样本点x的局部密度,它遍历数据集中的每个样本点,并统计距离小于给定阈值delta的样本点个数。
min_distance函数计算样本点x与其他样本点的最小距离。find_density_peaks函数是主要的密度峰值聚类算法,它遍历数据集中的每个样本点,计算每个样本点的局部密度和最小距离,并根据给定的rho和delta阈值找到密度峰值点作为聚类中心。
在示例用法中,我们给定了一个简单的二维数据集X,并指定了delta和rho的阈值。通过调用find_density_peaks函数,我们可以获得聚类中心点的索引。输出结果将显示聚类中心点的索引值。
请注意,密度峰值聚类算法对于选择合适的delta和rho阈值非常敏感,因此在实际应用中可能需要进行调参和验证。
高斯混合模型(Gaussian Mixture Model,简称GMM)是一种常用的聚类算法,它假设数据点服从高斯分布。
GMM聚类算法通过迭代来不断优化隶属度矩阵和聚类中心,以最小化数据点与高斯分布之间的误差。其迭代过程包括以下步骤:
最大值期望(Expectation-Maximization,EM)算法是一种用于在概率模型中估计参数的迭代算法。该算法通常用于处理带有潜在变量的数据集,其中观测数据是部分可观测的。
EM算法的目标是通过迭代来最大化观测数据的对数似然函数,以估计模型参数。它通过以下两个步骤来实现:
参考:https://zhuanlan.zhihu.com/p/568823491
from sklearn.mixture import GaussianMixture
import numpy as np
# 生成随机数据
np.random.seed(0)
X = np.concatenate([np.random.normal(0, 1, int(0.3*100)),
np.random.normal(5, 1, int(0.4*100)),
np.random.normal(10, 1, int(0.3*100))])
X = X.reshape(-1, 2)
# 训练GMM模型
gmm = GaussianMixture(n_components=3, max_iter=100)
gmm.fit(X)
labels = gmm.predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.show()
这些聚类方法各有特点和使用场景,需要根据具体的数据特点和需求选择合适的方法。同时,这些方法也可以结合使用或者与其他算法结合使用,以实现更好的聚类效果。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。