↑↑↑关注后"星标"kaggle竞赛宝典
kaggle竞赛宝典 作者:算法进阶 无监督聚类算法汇总!
无监督聚类算法汇总!
聚类算法按照算法原理,可以大致划分为以下几类,
基于距离的聚类算法:
K-Means:将数据点划分为 K 个簇,使得每个点到其对应簇中心的距离最小。 k-Medoids:类似于 K-Means,但使用簇内最近点(medoids)作为簇中心,对噪声和异常值有更好的鲁棒性。 Fuzzy C-Means (FCM):基于模糊 C-均值算法,每个数据点属于每个簇的模糊程度。 C-Means:与 FCM 类似,但更加关注数据点的硬归属。
层次聚类算法:
Hierarchical Clustering:根据数据点之间的距离构建一个层次结构,可以是树形结构。 Agglomerative Clustering:自底向上合并相似的数据点形成簇。 BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies):先对数据进行初步聚类,然后进行层次聚类。
基于密度的聚类算法:
DBSCAN (Density-Based Spatial Clustering of Applications with Noise):基于密度的聚类算法,可以检测到任意形状的簇。 OPTICS (Ordering Points To Identify the Clustering Structure):类似于 DBSCAN,但可以更好地处理噪声和异常值。 Density-Based Clustering:一个更通用的类别,包括 DBSCAN 和 OPTICS。
基于模型的聚类算法:
Gaussian Mixture Models (GMM):假设数据由多个高斯分布组成,每个分布对应一个簇。 Gaussian Mixture Clustering:类似于 GMM,但更关注聚类。
基于模型的聚类算法(文本聚类):
Latent Dirichlet Allocation (LDA):用于文档聚类,将文档表示为单词的主题分布。 Latent Semantic Analysis (LSA):用于文档聚类,通过潜在语义分析找到文档之间的相似性。 Factor Analysis:用于数据降维,也可以用于聚类。
其他聚类算法:
Mean-Shift Clustering:基于密度的聚类算法,寻找局部密度峰值作为簇中心。 Affinity Propagation:基于相似度的聚类算法,通过传播相似度信息来识别簇。 MiniBatchKMeans:K-Means 的一个变种,用于大规模数据集。 Spectral Clustering:基于图论的聚类算法,通过谱分解数据点的相似度矩阵。 X-Means:类似于 K-Means,但可以动态地调整簇的数量。 Self-Organizing Maps (SOM):通过竞争学习算法将数据映射到一个低维空间,用于可视化和高维数据的聚类。 k-Prototypes:类似于 k-Means,但用于文本数据,考虑单词的频率和共现性。 Clustering Ensembles:结合多个聚类算法的结果,以提高聚类性能。
K-Means
聚类算法 K-Means
背景介绍
K-Means 是一种无监督学习算法,主要用于将相似的数据点分到同一个组或簇中。它广泛应用于数据挖掘、模式识别和机器学习等领域。K-Means 算法假设数据空间是凸的,并且簇是球形的。
一句话通俗概括原理
K-Means 算法通过迭代计算来将数据点分配到 K 个簇中,使得每个簇内的数据点距离簇中心最近。
算法原理及核心公式
核心思想:选择 K 个初始中心点(通常是随机选择),然后迭代更新这些中心点,直到中心点不再显著变化。
步骤:
随机选择 K 个数据点作为初始聚类中心。 将每个数据点分配到最近的聚类中心,形成 K 个簇。 计算每个簇的中心点,即该簇所有数据点的均值。 重复步骤 2 和 3,直到聚类中心不再改变。
核心公式:
聚类分配:对于每个数据点(x),计算其到每个聚类中心的距离,将其分配到距离最近的聚类中心所代表的簇。 簇中心更新:对于每个簇,计算该簇所有数据点的均值,作为新的聚类中心。
模型训练过程
初始化:随机选择 K 个数据点作为初始聚类中心。 分配:将所有数据点分配到最近的聚类中心。 更新:计算每个簇的中心点。 重复:重复步骤 2 和 3,直到聚类中心变化很小或达到最大迭代次数。
模型调优经验
选择 K 值:可以使用肘部法则或轮廓系数来选择合适的 K 值。 初始化中心:使用 K-means++算法来选择初始中心,可以减少陷入局部最优的风险。 处理异常值:异常值可能会影响聚类结果,因此在聚类之前可以考虑去除或处理异常值。
优缺点
优点: 简单易懂,实现简单。 运算速度快,适用于大规模数据集。 对输入数据的规模和维度没有严格要求。 缺点: 对异常值敏感。 需要预先指定簇的数量 K。 可能陷入局部最优解。
应用场景
文本聚类:将文档分组为相似主题。 图像聚类:将图像分组为相似风格或内容。 社交网络分析:将用户分组为相似兴趣或特征。
Python 示例代码
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
聚类算法 Hierarchical Clustering
背景介绍
Hierarchical Clustering(层次聚类)是一种非监督机器学习算法,它通过将数据点逐步合并成簇,或者将簇逐步分裂成更小的簇,来发现数据中的层次结构。这种方法不依赖于预先指定的簇数,而是根据数据本身的结构来形成簇。
一句话通俗概括原理
“就像拼图一样,层次聚类将相似的数据点像拼图一样拼接在一起,形成不同的层级。”
算法原理及核心公式
层次聚类主要有两种类型:自下而上的凝聚式(Agglomerative)和自上而下的分裂式(Divisive)。这里以凝聚式为例进行说明:
初始化:将每个数据点视为一个簇。 合并:计算最近距离的簇,并将它们合并成一个簇。 重复:继续上述过程,直到满足停止条件(如达到指定层数或簇数)。
核心公式:
距离计算:可以使用不同的距离度量,如欧氏距离、曼哈顿距离等。 簇合并:常用的方法有单链接(最近距离)、完全链接(最远距离)、平均链接(簇内点的平均值)等。
模型训练过程
选择距离度量方法。 选择簇合并方法。 初始化每个数据点为单独的簇。 计算簇间的距离。 根据选择的合并方法合并最近的簇。 重复步骤 4 和 5,直到达到停止条件。
模型调优经验
距离度量:根据数据特征选择合适的距离度量方法。 簇合并方法:不同的合并方法会影响聚类结果,可以尝试不同的方法比较效果。 停止条件:根据数据量和业务需求设置合适的停止条件。
优缺点
优点:
不需要预先指定簇的数量。 能够发现数据的层次结构。
缺点:
聚类结果受距离度量方法和簇合并方法的影响较大。 对于大规模数据集,计算成本较高。
应用场景
社交网络分析,发现朋友之间的关系。 市场细分,识别潜在客户群体。 文本聚类,分析文档主题。
Python 示例代码
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
背景介绍
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。它通过分析数据点之间的密度分布来进行聚类,能够发现任意形状的簇,并且可以处理噪声和异常值。
一句话通俗概括原理
DBSCAN 通过寻找高密度区域来定义簇,并以此将数据点划分到簇中。
算法原理及核心公式
核心概念:
核心点:一个点如果至少有 MinPts 个邻居,那么它就是一个核心点。 边界点:如果一个点不是核心点,但至少有 MinPts 个邻居中的部分是核心点,那么它是一个边界点。 噪声点:如果一个点不是核心点,且其邻居数量小于 MinPts,那么它是一个噪声点。
核心公式:
DBSCAN 不需要预先指定簇的数量,它通过以下公式来计算:
Eps:邻域半径 MinPts:邻域内的最小点数
模型训练过程
初始化:设置邻域半径 Eps 和最小点数 MinPts。 核心点检测:对于数据集中的每个点,检查其 Eps 邻域内是否有 MinPts 个点。如果是,则该点为核心点。 簇扩展:从核心点开始,递归地将其邻居加入簇中。 重复:重复步骤 2 和 3,直到所有点都被处理。
模型调优经验
MinPts:通常需要根据数据的分布来设定。如果簇的大小变化较大,可以尝试多个 MinPts 值。 Eps:可以手动设定,或者使用 KNN 算法来估计。
优缺点
优点:
能够发现任意形状的簇。 对噪声和异常值有很好的鲁棒性。 不需要预先指定簇的数量。
缺点:
需要设定参数 MinPts 和 Eps,这可能会很困难。 对于高维数据,性能可能会下降。
应用场景
数据挖掘 生物信息学 图像分割 地理信息系统
Python 示例代码
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)
背景介绍
Gaussian Mixture Models(GMM)是一种概率模型,它将数据集视为由多个高斯分布组成的混合体。这种模型在机器学习和数据挖掘中广泛应用于无监督学习,特别是在聚类分析中。它通过将数据集划分为不同的簇,帮助用户发现数据中的潜在结构。
一句话通俗概括原理
GMM 是一种假设数据由多个高斯分布混合而成的模型,通过最大化似然函数来估计这些高斯分布的参数,从而对数据进行聚类。
算法原理及核心公式
核心公式
GMM 的核心公式是高斯分布的概率密度函数(PDF)和最大化似然函数。
高斯分布 PDF:
其中:
( x ) 是数据点。 ( \mu ) 是均值向量。 ( \sigma^2 ) 是协方差矩阵。
似然函数:
其中:
( \theta ) 是模型参数,包括均值向量、协方差矩阵和每个高斯分布的权重。 ( N ) 是数据点的总数。 ( P(x_i|\mu, \sigma^2, \pi) ) 是每个数据点的高斯分布 PDF。
算法流程
初始化:随机选择 K 个均值向量作为初始均值。 计算权重:对于每个数据点,计算其属于每个高斯分布的概率,并归一化。 更新均值和协方差:使用最大似然估计法更新每个高斯分布的均值和协方差。 迭代:重复步骤 2 和 3,直到收敛。
模型训练过程
选择合适的 K 值(簇的数量)。 使用 EM 算法进行训练,包括以下步骤:
E 步:计算每个数据点属于每个簇的概率。 M 步:使用这些概率更新均值、协方差和权重。
模型调优经验
选择合适的 K 值:可以使用肘部法则或轮廓系数等方法确定最佳的 K 值。 初始化:尝试不同的初始化方法,如 K-means 初始化。 选择合适的算法:使用快速 GMM 或 Gaussian Processes 等算法。
优缺点
优点
可以处理非球形簇。 可以处理混合分布的数据。 易于解释。
缺点
需要选择 K 值。 对于小样本数据,性能可能较差。 需要计算协方差矩阵。
应用场景
聚类分析。 数据降维。 异常检测。
Python 示例代码
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
背景介绍
Fuzzy C-Means (FCM) 是一种用于数据聚类的算法,由 Bezdek 在 1981 年提出。与传统的硬聚类算法(如 K-means)不同,FCM 允许一个样本可以同时属于多个类别,即所谓的模糊聚类。这种模糊性使得 FCM 在处理边界模糊的数据时更加有效。
一句话通俗概括原理
FCM 通过调整样本到各个类别的隶属度,寻找一个能够使样本之间的差异最小化、类别内距离最小化的聚类中心。
算法原理及核心公式
FCM 的核心思想是通过优化隶属度矩阵和聚类中心,使得样本之间的差异最小化。以下是核心公式:
隶属度矩阵 (U \in R^{n \times c}),其中 (n) 是样本数量,(c) 是聚类数。(U_{ij}) 表示第 (i) 个样本属于第 (j) 个聚类的隶属度。
聚类中心 (V \in R^{c \times m}),其中 (m) 是特征维度。(V_{jk}) 表示第 (j) 个聚类在第 (k) 个特征上的值。
参数 (m):称为模糊指数,控制聚类的紧密度。
核心公式如下:
隶属度矩阵 (U) 的更新公式:[ U*{ij} = \left(\frac{\sum*{k=1}^m (V*{jk} - V*{ik})^{2-m}}{\sum*{k=1}^m (V*{jk} - V_{ik})^{2-m}}\right)^{\frac{1}{m-1}} ] 聚类中心 (V) 的更新公式:[ V*{jk} = \frac{\sum*{i=1}^n U*{ij}^m x_i}{\sum*{i=1}^n U_{ij}^m} ]
模型训练过程
初始化隶属度矩阵 (U) 和聚类中心 (V)。 使用上述公式更新 (U) 和 (V)。 重复步骤 2,直到满足停止条件(如迭代次数或目标函数变化小于阈值)。
模型调优经验
选择合适的聚类数 (c)。 选择合适的模糊指数 (m),通常在 1.5 到 2.5 之间。 迭代次数或目标函数变化阈值。
优缺点
优点:
能够处理模糊聚类问题。 对噪声和异常值有较好的鲁棒性。
缺点:
对于聚类数 (c) 的选择敏感。 需要确定模糊指数 (m)。
应用场景
数据挖掘 生物信息学 图像处理 机器学习中的特征选择
Python 示例代码
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 是一种基于密度度的聚类算法,主要用于数据挖掘和图像分析领域。它通过迭代移动聚类中心到高密度区域,从而将相似的数据点聚在一起。
一句话通俗概括原理
Mean-Shift Clustering 算法就像一个移动的“平均器”,它会不断移动到数据集中密度最高的地方,直到没有更多的移动空间。
算法原理及核心公式
核心思想:将聚类中心移动到邻域内具有最高密度的位置。 核心公式:其中, neighborhood
是聚类中心当前邻域,w(i)
是基于高斯核的权重函数。
模型训练过程
初始化聚类中心。 对每个聚类中心,计算其邻域内所有点的加权平均。 将聚类中心移动到新的位置。 重复步骤 2 和 3,直到聚类中心不再移动或达到预设的迭代次数。
模型调优经验
邻域大小:邻域大小对聚类结果影响很大。通常,邻域大小需要根据数据集的特性进行调整。 带宽:带宽决定了高斯核的形状。较小的带宽会导致更紧密的聚类,而较大的带宽会导致更松散的聚类。 初始化聚类中心:聚类中心的初始化方法对聚类结果有较大影响。可以采用随机初始化或基于某种分布的初始化。
优缺点
优点:
对噪声数据鲁棒性强。 对数据分布没有严格的假设。 可以处理高维数据。
缺点:
计算量大,特别是对于大数据集。 邻域大小和带宽的选择对聚类结果有较大影响。
应用场景
图像分割。 时间序列分析。 文本聚类。
Python 示例代码
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 是一种基于图论和谱分解的聚类算法。它起源于图像处理领域,后来被广泛应用于数据挖掘、机器学习等多个领域。该算法的基本思想是通过将数据点视为图上的节点,通过构建相似度矩阵,然后将相似度矩阵进行谱分解,最后根据分解得到的特征向量进行聚类。
一句话通俗概括原理
Spectral Clustering 通过将数据映射到一个低维空间,然后在这个空间中根据数据的相似性进行聚类。
算法原理及核心公式
相似度矩阵构建:首先,根据数据点之间的相似度构建一个相似度矩阵 ( W )。如果 ( W*{ij} ) 表示第 ( i ) 个点和第 ( j ) 个点的相似度,则 ( W*{ij} ) 的取值范围通常在 0 到 1 之间。
归一化:对相似度矩阵进行归一化处理,得到归一化矩阵 ( D ),其中 ( D*{ii} = 0 ),( D*{ij} = \frac{1}{\sqrt{D*{ii} + D*{jj}}} )。
拉普拉斯矩阵构建:构建拉普拉斯矩阵 ( L = D - W )。
谱分解:对拉普拉斯矩阵进行谱分解,得到特征值和特征向量。( L = UDU^T ),其中 ( D ) 是对角矩阵,( U ) 是特征向量矩阵。
聚类:根据特征向量进行聚类。通常取前 ( k ) 个最大的特征值对应的特征向量,然后将这些向量进行降维,最后根据这些降维后的向量进行 K-means 聚类。
模型训练过程
构建相似度矩阵。 归一化相似度矩阵。 构建拉普拉斯矩阵。 进行谱分解。 根据特征向量进行聚类。
模型调优经验
相似度度量:选择合适的相似度度量方法,如余弦相似度、高斯核等。 邻域大小:根据数据的分布调整邻域大小。 特征选择:根据领域知识或实验结果选择合适的特征向量数量。
优缺点
优点:
对于非凸数据集也能有效聚类。 对初始聚类中心的选择不敏感。
缺点:
需要事先指定聚类数量 ( k )。 对噪声数据敏感。
应用场景
图像分割 文本聚类 生物信息学中的基因表达数据分析
Python 示例代码
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
背景介绍
聚类算法是数据挖掘和机器学习领域的重要方法之一,旨在将相似的数据点归为一组。Agglomerative Clustering(层次聚类)是一种自底向上的聚类算法,通过合并相似度高的数据点,逐步形成树状结构(称为聚类树或 Dendrogram)。
一句话通俗概括原理
层次聚类就像将相似的小球逐渐合并成更大的球,最终形成一个大球团。
算法原理及核心公式
原理:从每个数据点开始,逐步合并距离最近的数据点,直到达到设定的聚类数。
核心公式:
初始时,每个数据点都是一个单独的簇。 计算所有簇之间的距离,选择最近的两个簇合并成一个簇。 重复步骤 2,直到达到设定的聚类数。
模型训练过程
初始化:每个数据点为一个簇。 计算距离:计算当前簇之间的距离。 合并簇:选择距离最近的两个簇合并成一个簇。 重复步骤 2 和 3,直到达到设定的聚类数。
模型调优经验
聚类数的选择:可以通过观察 Dendrogram 来确定合适的聚类数。 距离度量:可以选择不同的距离度量方法,如欧氏距离、曼哈顿距离等。 聚类方法:可以选择不同的聚类方法,如单链接、完全链接、平均链接等。
优缺点
优点:
不需要预先指定聚类数。 可以直观地通过 Dendrogram 观察聚类过程。
缺点:
计算复杂度较高。 对噪声数据敏感。
应用场景
市场细分。 社交网络分析。 文本聚类。
Python 示例代码
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。
MiniBatch K-Means
方法
背景介绍
K-Means 聚类算法是一种经典的聚类算法,它通过将数据集划分成 K 个簇来发现数据中的隐含结构。MiniBatch K-Means 是 K-Means 的一个变种,它在每次迭代时只使用一小部分数据(称为 mini-batch)来更新簇中心,从而提高算法的效率。
一句话通俗概括原理
MiniBatch K-Means 算法通过不断迭代优化簇中心,将数据划分成 K 个簇,使得每个簇内的数据点彼此相似,而簇与簇之间的数据点彼此不同。
算法原理及核心公式
初始化:随机选择 K 个数据点作为初始簇中心。 分配簇:将每个数据点分配到最近的簇中心。 更新簇中心:计算每个簇内所有数据点的均值,作为新的簇中心。 重复步骤 2 和 3,直到簇中心不再显著变化。
核心公式:
簇中心更新: c_new = (1/n) * Σ(x_i)
其中,c_new 是新的簇中心,x_i 是簇内的数据点,n 是簇内数据点的数量。
模型训练过程
初始化簇中心。 将数据点分配到最近的簇中心。 更新簇中心。 重复步骤 2 和 3,直到收敛。
模型调优经验
选择合适的 K 值:可以使用肘部法则或轮廓系数来确定最佳 K 值。 使用较大的 mini-batch 大小:可以提高算法的稳定性,但过大的 mini-batch 大小可能导致过拟合。 调整学习率:适当的调整学习率可以提高算法的收敛速度。
优缺点
优点:
简单易实现,计算效率高。 对噪声和异常值不敏感。
缺点:
对 K 值的选择敏感。 可能陷入局部最优解。
应用场景
数据挖掘:如客户细分、文本聚类等。 图像处理:如图像分割、目标检测等。
Python 示例代码
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 variants
背景介绍
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它通过分析数据点之间的密度关系来进行聚类。DBSCAN 变种是在 DBSCAN 基础上进行改进的算法,以解决其在处理高维数据和噪声数据时的局限性。
一句话通俗概括原理
DBSCAN 通过寻找密度较高的区域来识别聚类,将低密度区域视为噪声。
算法原理及核心公式
原理
核心点:如果一个点周围存在足够多的点(至少为 MinPts),则该点为核心点。 邻域:以核心点为中心,以 ε 为半径的球体内包含的点集合为邻域。 聚类:连接核心点形成聚类。
核心公式
MinPts:最小邻域点数。 ε:邻域半径。
模型训练过程
初始化:设置 MinPts 和 ε。 遍历数据点:
如果是核心点,则创建新的聚类。 如果不是核心点,则将其归入最近的核心点所属的聚类。
模型调优经验
MinPts:根据数据集的特点进行调整,通常从较小的数值开始,逐渐增加。 ε:根据数据集的维度和分布进行调整,可以使用肘部法则进行选择。
优缺点
优点
对噪声和异常值不敏感。 可以发现任意形状的聚类。 不需要预先指定聚类数量。
缺点
调参较为复杂。 在高维数据上性能可能下降。
应用场景
数据挖掘:识别数据集中的异常值和聚类。 机器学习:特征选择和降维。 图像处理:图像分割和目标检测。
Python 示例代码
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_)