ITPub博客

首页 > 数据库 > 数据库开发技术 > 7种常见的聚类算法原理及代码实现

7种常见的聚类算法原理及代码实现

原创 数据库开发技术 作者:derekwh 时间:2024-05-05 19:34:37 0 删除 编辑

在机器学习和数据科学领域,聚类分析是一种无监督学习方法,用于将数据集中的样本划分为若干个不相交的子集,即“簇”。每个簇可能对应于一些潜在的概念或类别。下面,我们将介绍7种常见的聚类算法及实现过程。

1.k-means聚类

步骤1:确定一个k值,即希望将数据集划分为k个簇。 

步骤2:从数据集中随机选择k个数据点作为初始质心。 

步骤3:对数据集中的每个点,计算其与每个质心的距离(如欧氏距离),并将其划分到距离最近的质心所属的簇中。 

步骤4:重新计算每个簇的质心。 

步骤5:重复上述过程,直到质心的位置变化小于某个阈值或达到预设的迭代次数。

from pyclustering.cluster.kmeans import kmeans, kmeans_visualizer
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
from pyclustering.samples.definitions import FCPS_SAMPLES
from pyclustering.utils import read_sample
import warnings
import numpy as np
np.warnings = warnings
 
# 加载样本数据
sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
 
# 生成一个初始聚类中心
initial_centers = kmeans_plusplus_initializer(sample, 3).initialize()
 
# 创建具有初始中心的 K-Means 算法实例。
kmeans_instance = kmeans(sample, initial_centers)
 
# 调用聚类算法,进行聚类分析并获取结果
kmeans_instance.process()
clusters = kmeans_instance.get_clusters()
final_centers = kmeans_instance.get_centers()
 
# 对结果可视化
kmeans_visualizer.show_clusters(sample, clusters, final_centers)

2.DBSCAN聚类(密度聚类)

步骤1:初始化:设置半径和最小密度MinPts。 

步骤2:对于每个未被访问的数据点p,如果其邻域内的数据点数量超过MinPts,则p为核心对象,并将其标记为已访问。 

步骤3:对于p的所有密度可达点(即可以通过其他核心对象直接或间接到达的点),将它们标记为已访问,并加入同一个簇中。

步骤4:重复上述过程,直到所有的核心对象都被访问完毕,形成所有的簇。步骤5:所有未被访问的数据点被视为噪声点或离群点。

 
from pyclustering.cluster.dbscan import dbscan
from pyclustering.cluster import cluster_visualizer
from pyclustering.utils import read_sample
from pyclustering.samples.definitions import FCPS_SAMPLES
 
# Sample for cluster analysis.
sample = read_sample(FCPS_SAMPLES.SAMPLE_CHAINLINK)
 
# Create DBSCAN algorithm.
dbscan_instance = dbscan(sample, 0.7, 3)
 
# Start processing by DBSCAN.
dbscan_instance.process()
 
# Obtain results of clustering.
clusters = dbscan_instance.get_clusters()
noise = dbscan_instance.get_noise()
 
# Visualize clustering results
visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, sample)
visualizer.append_cluster(noise, sample, marker='x')
visualizer.show()

3.K-Medians聚类

K-Medians聚类算法是K-Means聚类算法的一个变种。两者的主要区别在于,K-Means使用簇内所有点的均值作为新的质心,而K-Medians则使用簇内所有点的中位数作为新的质心。这种改变使得K-Medians算法对异常值和噪声点更加鲁棒,因为中位数不易受到极端值的影响。

from pyclustering.cluster.kmedians import kmedians
from pyclustering.cluster import cluster_visualizer
from pyclustering.utils import read_sample
from pyclustering.samples.definitions import FCPS_SAMPLES
 
# Load list of points for cluster analysis.
sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
 
# Create instance of K-Medians algorithm.
initial_medians = [[0.0, 0.1], [2.5, 0.7]]
kmedians_instance = kmedians(sample, initial_medians)
 
# Run cluster analysis and obtain results.
kmedians_instance.process()
clusters = kmedians_instance.get_clusters()
medians = kmedians_instance.get_medians()
 
# Visualize clustering results.
visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, sample)
visualizer.append_cluster(initial_medians, marker='*', markersize=10)
visualizer.append_cluster(medians, marker='*', markersize=10)
visualizer.show()

4.K-Medoids聚类

K-Medoids聚类算法是一种基于划分的聚类方法,它的主要思想与K-Means算法类似,都是将数据集划分为K个不相交的子集(即簇),使得每个数据点都属于最近的簇中心。

但K-Medoids与K-Means的主要区别在于,K-Medoids算法选择簇中的一个实际数据点作为簇中心(称为Medoid),而不是像K-Means那样计算簇内所有点的均值作为簇中心。

from pyclustering.cluster.kmedoids import kmedoids
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
from pyclustering.cluster import cluster_visualizer
from pyclustering.utils import read_sample
from pyclustering.samples.definitions import FCPS_SAMPLES
 
# Load list of points for cluster analysis.
sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
 
# Initialize initial medoids using K-Means++ algorithm
initial_medoids = kmeans_plusplus_initializer(sample, 2).initialize(return_index=True)
 
# Create instance of K-Medoids (PAM) algorithm.
kmedoids_instance = kmedoids(sample, initial_medoids)
 
# Run cluster analysis and obtain results.
kmedoids_instance.process()
clusters = kmedoids_instance.get_clusters()
medoids = kmedoids_instance.get_medoids()
 
# Print allocated clusters.
print("Clusters:", clusters)
 
# Display clustering results.
visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, sample)
visualizer.append_cluster(initial_medoids, sample, markersize=12, marker='*', color='gray')
visualizer.append_cluster(medoids, sample, markersize=14, marker='*', color='black')
visualizer.show()

5.X-means聚类

X-means算法的核心思想是在初始的K-means聚类结果基础上,对每一个聚类进行分裂尝试,并评估分裂后的聚类效果。如果某个聚类的分裂能够提高整体的聚类效果(根据BIC或其他标准),则保留这次分裂;否则,撤销这次分裂。这个过程不断迭代,直到满足停止条件为止。

from pyclustering.cluster import cluster_visualizer
from pyclustering.cluster.xmeans import xmeans
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
from pyclustering.utils import read_sample
from pyclustering.samples.definitions import SIMPLE_SAMPLES
 
# Read sample 'simple3' from file.
sample = read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE3)
 
# Prepare initial centers - amount of initial centers defines amount of clusters from which X-Means will
# start analysis.
amount_initial_centers = 2
initial_centers = kmeans_plusplus_initializer(sample, amount_initial_centers).initialize()
 
# Create instance of X-Means algorithm. The algorithm will start analysis from 2 clusters, the maximum
# number of clusters that can be allocated is 20.
xmeans_instance = xmeans(sample, initial_centers, 20)
xmeans_instance.process()
 
# Extract clustering results: clusters and their centers
clusters = xmeans_instance.get_clusters()
centers = xmeans_instance.get_centers()
 
# Print total sum of metric errors
print("Total WCE:", xmeans_instance.get_total_wce())
 
# Visualize clustering results
visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, sample)
visualizer.append_cluster(centers, None, marker='*', markersize=10)
visualizer.show()

6.MBSAS聚类

MBSAS(Modified Bisecting K-Means with a Stopping Criterion based on Silhouette Score Analysis)聚类算法是一种改进的K-means聚类算法,它结合了K-means的思想,并使用轮廓系数(Silhouette Score)作为停止准则来确定最佳的聚类数量。

MBSAS算法的基本思想是通过不断将当前聚类一分为二,并评估每个分裂后的聚类效果,来找到最优的聚类数量。与传统的K-means算法不同,MBSAS算法不需要预先指定聚类数量K,而是根据数据的内在结构自动确定。

在每次分裂过程中,MBSAS算法选择当前聚类中距离最远的两个数据点作为分裂点,并将聚类一分为二。然后,它使用轮廓系数来评估分裂后的聚类效果。轮廓系数是一个介于-1到1之间的值,用于衡量聚类中样本的聚类合理性。值越大,表示聚类效果越好。

from pyclustering.cluster.bsas import bsas_visualizer
from pyclustering.cluster.mbsas import mbsas
from pyclustering.utils import read_sample
from pyclustering.samples.definitions import SIMPLE_SAMPLES
 
# Read data sample from 'Simple02.data'.
sample = read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE2)
 
# Prepare algorithm's parameters.
max_clusters = 5
threshold = 1.0
 
# Create instance of MBSAS algorithm.
mbsas_instance = mbsas(sample, max_clusters, threshold)
mbsas_instance.process()
 
# Get clustering results.
clusters = mbsas_instance.get_clusters()
representatives = mbsas_instance.get_representatives()
 
# Display results.
bsas_visualizer.show_clusters(sample, clusters, representatives)

7.FCM聚类

FCM(Fuzzy C-Means)聚类算法是一种基于模糊集合理论的聚类算法,允许数据点以不同的隶属度同时属于多个聚类。

FCM算法的核心思想是通过对每个数据点计算其对于各个聚类中心的隶属度(或称为模糊划分矩阵),来实现对数据的模糊划分。与传统的硬聚类算法(如K-means)不同,FCM允许数据点以不同的隶属度属于多个聚类,从而能够更好地处理具有重叠和不确定性的数据。

在FCM中,每个数据点对于每个聚类的隶属度是介于0和1之间的值,且所有聚类的隶属度之和为1。这些隶属度值是根据数据点与聚类中心之间的距离(通常使用欧氏距离或其他度量方式)以及模糊参数m(m>1)来计算的。模糊参数m用于控制聚类的模糊程度,m越大,聚类结果越模糊。


from pyclustering.samples.definitions import FAMOUS_SAMPLES
from pyclustering.cluster import cluster_visualizer
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
from pyclustering.cluster.fcm import fcm
from pyclustering.utils import read_sample
 
# load list of points for cluster analysis
sample = read_sample(FAMOUS_SAMPLES.SAMPLE_OLD_FAITHFUL)
 
# initialize
initial_centers = kmeans_plusplus_initializer(sample, 2, kmeans_plusplus_initializer.FARTHEST_CENTER_CANDIDATE).initialize()
 
# create instance of Fuzzy C-Means algorithm
fcm_instance = fcm(sample, initial_centers)
 
# run cluster analysis and obtain results
fcm_instance.process()
clusters = fcm_instance.get_clusters()
centers = fcm_instance.get_centers()
 
# visualize clustering results
visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, sample)
visualizer.append_cluster(centers, marker='*', markersize=10)
visualizer.show()


原文作者:Python学习杂记;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
央企算法工程师,微信公众号: python数智工坊

注册时间:2021-03-14

  • 博文量
    305
  • 访问量
    162415