
使用这些基本 REST API 最佳实践构建出色的 API
聚类算法在数据挖掘中很常用,它是将数据集中的对象根据相似性自动分组,形成多个类别或簇,以便更好地理解和分析数据。它的应用非常广泛,比如在市场分析中用于客户细分。
聚类算法按照算法原理,可以大致划分为以下几类,
K-Means 是一种无监督学习算法,主要用于将相似的数据点分到同一个组或簇中。它广泛应用于数据挖掘、模式识别和机器学习等领域。K-Means 算法假设数据空间是凸的,并且簇是球形的。
K-Means 算法通过迭代计算来将数据点分配到 K 个簇中,使得每个簇内的数据点距离簇中心最近。
from sklearn.cluster import KMeans
import numpy as np
# 示例数据
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 创建KMeans对象
kmeans = KMeans(n_clusters=2, random_state=0)
# 拟合模型
kmeans.fit(data)
# 输出聚类中心
print(kmeans.cluster_centers_)
# 对数据进行聚类
labels = kmeans.predict(data)
# 输出每个数据点的簇标签
print(labels)
这段代码使用sklearn
库中的KMeans
类来对示例数据进行聚类,并输出聚类中心和每个数据点的簇标签。
Hierarchical Clustering(层次聚类)是一种非监督机器学习算法,它通过将数据点逐步合并成簇,或者将簇逐步分裂成更小的簇,来发现数据中的层次结构。这种方法不依赖于预先指定的簇数,而是根据数据本身的结构来形成簇。
“就像拼图一样,层次聚类将相似的数据点像拼图一样拼接在一起,形成不同的层级。”
层次聚类主要有两种类型:自下而上的凝聚式(Agglomerative)和自上而下的分裂式(Divisive)。这里以凝聚式为例进行说明:
核心公式:
优点:
缺点:
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 示例数据
data = [[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]]
# 使用凝聚式层次聚类
linked = linkage(data, method='ward', metric='euclidean')
# 绘制树状图
dendrogram(linked)
plt.show()
这段代码使用了scipy
库中的linkage
和dendrogram
函数来执行层次聚类并绘制树状图。data
是示例数据,method='ward'
指定了簇合并方法为 Ward 方法,metric='euclidean'
指定了距离度量方法为欧氏距离。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。它通过分析数据点之间的密度分布来进行聚类,能够发现任意形状的簇,并且可以处理噪声和异常值。
DBSCAN 通过寻找高密度区域来定义簇,并以此将数据点划分到簇中。
DBSCAN 不需要预先指定簇的数量,它通过以下公式来计算:
from sklearn.cluster import DBSCAN
import numpy as np
# 生成一些示例数据
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
# 创建DBSCAN对象
db = DBSCAN(eps=0.3, min_samples=2)
# 拟合模型
db.fit(X)
# 获取簇标签
labels = db.labels_
# 打印簇标签
print(labels)
在这个示例中,我们使用sklearn
库中的DBSCAN
类来聚类数据。eps
参数设置为 0.3,min_samples
参数设置为 2。运行代码后,我们可以看到每个点的簇标签。
Gaussian Mixture Models(GMM)是一种概率模型,它将数据集视为由多个高斯分布组成的混合体。这种模型在机器学习和数据挖掘中广泛应用于无监督学习,特别是在聚类分析中。它通过将数据集划分为不同的簇,帮助用户发现数据中的潜在结构。
GMM 是一种假设数据由多个高斯分布混合而成的模型,通过最大化似然函数来估计这些高斯分布的参数,从而对数据进行聚类。
GMM 的核心公式是高斯分布的概率密度函数(PDF)和最大化似然函数。
其中:
其中:
from sklearn.mixture import GaussianMixture
import numpy as np
# 生成样本数据
data = np.random.randn(100, 2)
# 创建GMM模型,设置簇的数量为2
gmm = GaussianMixture(n_components=2)
# 训练模型
gmm.fit(data)
# 预测簇标签
labels = gmm.predict(data)
请注意,在实际应用中,您可能需要调整 GMM 模型的参数,如权重、协方差矩阵等。
Fuzzy C-Means (FCM) 是一种用于数据聚类的算法,由 Bezdek 在 1981 年提出。与传统的硬聚类算法(如 K-means)不同,FCM 允许一个样本可以同时属于多个类别,即所谓的模糊聚类。这种模糊性使得 FCM 在处理边界模糊的数据时更加有效。
FCM 通过调整样本到各个类别的隶属度,寻找一个能够使样本之间的差异最小化、类别内距离最小化的聚类中心。
FCM 的核心思想是通过优化隶属度矩阵和聚类中心,使得样本之间的差异最小化。以下是核心公式:
核心公式如下:
优点:
缺点:
import numpy as np
from sklearn.cluster import FuzzyCMeans
# 假设X是数据集,c是聚类数,m是模糊指数
X = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
c = 2
m = 2.5
fcm = FuzzyCMeans(n_clusters=c, init='cmeans++', max_iter=100, m=m)
fcm.fit(X)
# 输出聚类结果
labels = fcm.labels_
centers = fcm.cluster_centers_
以上是对 Fuzzy C-Means 算法的详细介绍,希望对初学者有所帮助。
Mean-Shift Clustering 是一种基于密度度的聚类算法,主要用于数据挖掘和图像分析领域。它通过迭代移动聚类中心到高密度区域,从而将相似的数据点聚在一起。
Mean-Shift Clustering 算法就像一个移动的“平均器”,它会不断移动到数据集中密度最高的地方,直到没有更多的移动空间。
neighborhood
是聚类中心当前邻域,w(i)
是基于高斯核的权重函数。优点:
缺点:
import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
# 生成一些示例数据
data = np.random.rand(100, 2)
# 估计带宽
bandwidth = estimate_bandwidth(data, quantile=0.3, n_samples=data.shape[0])
# 创建MeanShift聚类器
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
# 拟合数据
ms.fit(data)
# 获取聚类标签
labels = ms.labels_
# 获取聚类中心
centers = ms.cluster_centers_
以上代码演示了如何使用sklearn
库中的MeanShift
函数对数据进行聚类。注意,这里使用了estimate_bandwidth
函数来自动估计带宽,你也可以手动设置带宽。
Spectral Clustering 是一种基于图论和谱分解的聚类算法。它起源于图像处理领域,后来被广泛应用于数据挖掘、机器学习等多个领域。该算法的基本思想是通过将数据点视为图上的节点,通过构建相似度矩阵,然后将相似度矩阵进行谱分解,最后根据分解得到的特征向量进行聚类。
Spectral Clustering 通过将数据映射到一个低维空间,然后在这个空间中根据数据的相似性进行聚类。
优点:
缺点:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import SpectralClustering
from sklearn.preprocessing import StandardScaler
# 生成示例数据
np.random.seed(42)
X = np.random.rand(100, 2)
X[0:10, 0] += 1
X[20:30, 1] += 1
X[40:50, 0] -= 2
X[60:70, 1] -= 1
# 归一化数据
X = StandardScaler().fit_transform(X)
# 谱聚类
sc = SpectralClustering(n_clusters=4, affinity='nearest_neighbors', random_state=42)
sc.fit(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=sc.labels_)
plt.title('Spectral Clustering')
plt.show()
这段代码使用sklearn
库中的SpectralClustering
类进行谱聚类,并使用StandardScaler
对数据进行归一化处理。最后,使用matplotlib
绘制聚类结果。
聚类算法是数据挖掘和机器学习领域的重要方法之一,旨在将相似的数据点归为一组。Agglomerative Clustering(层次聚类)是一种自底向上的聚类算法,通过合并相似度高的数据点,逐步形成树状结构(称为聚类树或 Dendrogram)。
层次聚类就像将相似的小球逐渐合并成更大的球,最终形成一个大球团。
原理:从每个数据点开始,逐步合并距离最近的数据点,直到达到设定的聚类数。
核心公式:
优点:
缺点:
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 生成示例数据
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 计算距离
Z = linkage(data, 'ward')
# 绘制Dendrogram
dendrogram(Z)
plt.show()
在这个示例中,我们首先生成了一个包含三个簇的数据集,然后使用 Ward 方法进行层次聚类,并绘制了 Dendrogram。
K-Means 聚类算法是一种经典的聚类算法,它通过将数据集划分成 K 个簇来发现数据中的隐含结构。MiniBatch K-Means 是 K-Means 的一个变种,它在每次迭代时只使用一小部分数据(称为 mini-batch)来更新簇中心,从而提高算法的效率。
MiniBatch K-Means 算法通过不断迭代优化簇中心,将数据划分成 K 个簇,使得每个簇内的数据点彼此相似,而簇与簇之间的数据点彼此不同。
核心公式:
c_new = (1/n) * Σ(x_i)
其中,c_new 是新的簇中心,x_i 是簇内的数据点,n 是簇内数据点的数量。
优点:
缺点:
import numpy as np
def kmeans(data, k):
# 初始化簇中心
centroids = data[np.random.choice(data.shape[0], k, replace=False)]
# 训练模型
for _ in range(100):
# 分配簇
clusters = []
for i in range(k):
cluster = []
for j in range(data.shape[0]):
if np.linalg.norm(data[j] - centroids[i]) < np.linalg.norm(data[j] - centroids[(i+1)%k]):
cluster.append(j)
clusters.append(cluster)
# 更新簇中心
new_centroids = []
for i in range(k):
new_centroids.append(np.mean(data[clusters[i]], axis=0))
centroids = np.array(new_centroids)
return centroids
# 示例数据
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 训练模型
k = 2
centroids = kmeans(data, k)
# 打印结果
print("簇中心:", centroids)
这个示例代码使用了简单的 K-Means 算法,将数据划分为 2 个簇。在实际应用中,您可能需要根据具体问题调整算法参数和实现细节。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它通过分析数据点之间的密度关系来进行聚类。DBSCAN 变种是在 DBSCAN 基础上进行改进的算法,以解决其在处理高维数据和噪声数据时的局限性。
DBSCAN 通过寻找密度较高的区域来识别聚类,将低密度区域视为噪声。
from sklearn.cluster import DBSCAN
import numpy as np
# 创建示例数据
data = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
# 创建DBSCAN对象
dbscan = DBSCAN(eps=0.3, min_samples=2)
# 模型训练
dbscan.fit(data)
# 输出聚类结果
print("Cluster labels:", dbscan.labels_)
文章转自微信公众号@算法进阶