
使用这些基本 REST API 最佳实践构建出色的 API
聚类分析,也称为聚类,是一种无监督的机器学习任务。与监督学习不同,聚类算法仅依赖输入数据,并致力于在特征空间中找到自然的组或群集。这些群集通常是特征空间中的密度区域,其中同一群集的数据点比其他群集更紧密地聚集在一起。聚类在数据分析中扮演着重要角色,有助于深入了解问题域的内在结构和模式。这种分析有时被称为模式发现或知识发现,可以帮助我们洞察数据中隐藏的模式和关联。聚类还可以作为特征工程的一种手段。通过将数据点映射到已标识的群集中,我们可以为现有和新的示例创建新的特征标签。
实际项目中Kmeans聚类应该是最为常用的聚类模型,但其实聚类模型的种类还挺多的,每种聚类模型都有其独特的特性和应用场景。在实际应用中,需要根据具体的数据情况、算力资源和业务需求来选择合适的模型。
在工作或学习中,聚类算法是非常常见的算法之一。这里与大家剖析总结下常用的聚类算法:
亲和力传播是一种基于实例的学习算法,用于聚类。它通过发送消息在数据点之间建立关系,并选择最佳的聚类结果。
训练过程通过不断迭代,为两对数据点之间相似度的输入度量。在数据点之间交换实值消息,直到一组高质量的范例和相应的群集逐渐出现,使数据点之间形成聚类。
优点
缺点
适用于任何需要基于实例学习的聚类任务。
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs
# 生成样本数据
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.4, random_state=0)
# 训练模型
af = AffinityPropagation(preference=-50).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_
n_clusters_ = len(cluster_centers_indices)
print('Estimated number of clusters: %d' % n_clusters_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index (ARI): %0.3f"
% metrics.adjusted_rand_score(labels_true, labels))
print("Adjusted Mutual Information (AMI): %0.3f"
% metrics.adjusted_mutual_info_score(labels_true, labels))
模型原理
聚合聚类是一种自底向上的聚类方法。它从数据点(或称为观测值)的集合开始,然后将这些点视为初始的簇。接着,算法逐步合并这些簇,直到满足某个停止条件,如达到预设的簇数量或达到某个特定的簇大小。在这个过程中,算法通过计算簇之间的距离来确定哪些簇应该被合并。
模型训练
优点
缺点
使用场景
Python示例代码(使用scikit-learn库):
from sklearn.cluster import AgglomerativeClustering # 导入AgglomerativeClustering类
from sklearn import datasets # 导入datasets用于生成样本数据
from sklearn.preprocessing import StandardScaler # 导入StandardScaler进行标准化处理
import matplotlib.pyplot as plt # 导入绘图库
# 生成样本数据
iris = datasets.load_iris() # 使用Iris数据集作为示例
X = iris["data"] # 提取特征矩阵
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X) # 对数据进行标准化处理
# 设置聚类数
n_clusters = 2 # 根据需求设置聚类数
# 创建AgglomerativeClustering对象并拟合数据
clustering = AgglomerativeClustering(n_clusters=n_clusters)
labels = clustering.fit_predict(X) # 获取每个样本点的聚类标签
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射绘制结果图
plt.show() # 显示结果图 ```
模型原理
BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)是一种基于层次的聚类方法。它通过构建一个聚类特征树(Clustering Feature Tree,CF Tree)来组织和存储数据点,并利用该树进行聚类。BIRCH的核心思想是利用聚类特征(Clustering Feature,CF)来描述数据点的聚类信息,并通过逐步合并最相似的聚类对来形成层次聚类。
模型训练
优点
缺点
使用场景
Python示例代码(使用pyclustering库):
from pyclustering.cluster.birch import birch # 导入BIRCH聚类算法
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer # 导入中心初始化器
from pyclustering.samples.definitions import FCPS_SAMPLES # 导入样本数据集
from pyclustering.utils import read_sample # 导入读取样本数据的工具
from pyclustering.view.gplot import gplot # 导入绘图库
from pyclustering.view.dendrogram import dendrogram # 导入层次聚类结果的显示工具
from pyclustering.metrics.pairwise import euclidean_distance # 导入欧氏距离度量函数
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入numpy库进行数组操作
# 读取样本数据集[two_diamonds]
sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
# 使用K-Means++初始化方法为BIRCH算法生成中心点(两个中心点)
initial_centers = kmeans_plusplus_initializer(sample, 2).initialize()
# 创建BIRCH聚类对象并使用中心点初始化其内部结构
birch_instance = birch(sample, initial_centers, dist_metric=euclidean_distance)
# 执行聚类操作
birch_instance.process()
# 获取聚类结果
clusters = birch_instance.get_clusters() # 获取簇的索引列表
# 可视化结果
gplot(birch_instance.get_data(),BirchDataVisualizer(clusters),'birch') # BirchDataVisualizer是用于可视化BIRCH数据的自定义工具类 ```
模型原理
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类方法。它的主要思想是:一个簇是由一个密度足够大的区域所组成的,并且这个区域是核心对象所连接的稠密区域。DBSCAN将簇定义为具有足够高密度的区域,并且通过噪声点将簇与相邻的密度区域分开。
模型训练
优点
缺点
使用场景
Python示例代码(使用scikit-learn库):
from sklearn.cluster import DBSCAN # 导入DBSCAN聚类算法
from sklearn import datasets # 导入datasets用于生成样本数据
import matplotlib.pyplot as plt # 导入绘图库
# 生成样本数据
iris = datasets.load_iris() # 使用Iris数据集作为示例
X = iris["data"] # 提取特征矩阵
# 创建DBSCAN对象并拟合数据
dbscan = DBSCAN(eps=0.3, min_samples=5) # eps是邻域半径,min_samples是形成核心对象的最小点数
labels = dbscan.fit_predict(X) # 获取每个样本点的聚类标签
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射绘制结果图
plt.show() # 显示结果图 ```
模型原理
K-Means聚类是一种基于距离的聚类方法,通过最小化每个数据点到其所属簇中心点的距离之和,将数据点划分为K个簇。算法的主要思想是:每个簇有一个中心点,数据点被分配到最近的中心点所在的簇中。通过迭代更新每个簇的中心点,使得所有数据点到其所属簇的中心点的距离之和最小。
模型训练
优点
缺点
使用场景
Python示例代码(使用scikit-learn库):
from sklearn.cluster import KMeans # 导入K-Means聚类算法
from sklearn import datasets # 导入datasets用于生成样本数据
import matplotlib.pyplot as plt # 导入绘图库
# 生成样本数据
iris = datasets.load_iris() # 使用Iris数据集作为示例
X = iris["data"] # 提取特征矩阵
# 创建K-Means对象并拟合数据
kmeans = KMeans(n_clusters=3) # 假设有3个簇
labels = kmeans.fit_predict(X) # 获取每个样本点的聚类标签
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射绘制结果图
plt.show() # 显示结果图 ```
高斯混合模型是一种概率模型,用于表示数据点集合的混合高斯分布。在聚类任务中,高斯混合模型将数据点划分为K个簇,每个簇的数据点都遵循一个高斯分布(正态分布)。
高斯混合模型的原理基于以下几个假设:
模型训练
优点
缺点
使用场景
Python示例代码(使用scikit-learn库):
from sklearn.mixture import GaussianMixture # 导入高斯混合模型
from sklearn import datasets # 导入datasets用于生成样本数据
import matplotlib.pyplot as plt # 导入绘图库
# 生成样本数据
iris = datasets.load_iris() # 使用Iris数据集作为示例
X = iris["data"] # 提取特征矩阵
# 创建高斯混合模型对象并拟合数据
gmm = GaussianMixture(n_components=3) # 假设有3个簇
labels = gmm.fit_predict(X) # 获取每个样本点的聚类标签
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射绘制结果图
plt.show() # 显示结果图 ```
常用评估指标包括外部评价指标和内部评价指标。外部评价指标是在已知真实标签的情况下评估聚类结果的准确性,而内部评价指标则是在不知道真实标签的情况下评估聚类结果的质量。
外部评价指标:
准确率(accuracy)。即所有的预测正确(TP+TN)的占总数(TP+FP+TN+FN)的比例;
查准率P(precision):是指分类器预测为Positive的正确样本(TP)的个数占所有预测为Positive样本个数(TP+FP)的比例;
查全率R(recall):是指分类器预测为Positive的正确样本(TP)的个数占所有的实际为Positive样本个数(TP+FN)的比例。
F1-score是查准率P、查全率R的调和平均:
调整兰德系数(Adjusted Rand Index, ARI):衡量聚类结果与真实标签的匹配程度,取值范围为[-1,1],值越大表示聚类效果越好。
内部评价指标:
轮廓系数(Silhouette Coefficient):通过计算同类样本间的平均距离和不同类样本间的平均距离来评估聚类效果,取值范围为[-1,1],值越大表示聚类效果越好。
标准化互信息(Normalized Mutual Information, NMI):衡量聚类结果与真实标签的相似性,取值范围为[0,1],值越大表示聚类效果越好。
互信息(Mutual Information, MI):类似于NMI,但不需要对数据进行标准化处理。
聚类评估指标对比:
准确率、召回率和F值:简单易用,但可能不适用于非平衡数据集。
ARI:对异常值不敏感,但计算复杂度较高,且对参数设置敏感。
轮廓系数:考虑了样本间的相对距离,能够更准确地反映聚类效果,但计算复杂度较高。
NMI和MI:能够准确地评估聚类效果,尤其适用于样本分布不均匀的情况,但计算复杂度较高。
在处理实际问题时,可以尝试多种指标,以便更全面地评估聚类效果。同时,虽然存在多种量化聚类质量的指标,但对聚类群的实际评估往往是主观的,并很经常需要结合领域的业务经验。
本文章转载微信公众号@Python人工智能前沿