目录
原理与用途
常见的聚类方式
聚类中需要注意的问题:
常见算法以及应用
k -均值聚类
k-均值聚类过程
该算法的特点
算法参数介绍
聚类分析的应用案例
层次聚类
层次聚类的过程
算法特点
参数介绍
层次聚类的应用小案例
特征聚类
聚类是一种无监督学习算法,聚类的过程是一个见李假设的过程,使用聚类之后还需要总结每一类别的基本热证,从而更加清晰了解问题的实质。
目的:分类,一个类别的个体具有尽可能高的同质性,类别之间具有尽可能高的异质性。
原理:假设研究对象均用自变量所构成的高维空间中的“点”来表示,一般规则中距离较小的同一类,距离较大的为另外一个类。
以上的是个体的分类方法,使用距离分类。也可以使用变量分类,对于变量的分类一般使用相似系数(如相关系数)作为距离的测量指标。
用途:
1、设计抽样方案:分层抽样 (比如调研城市经济发展,先聚类划分成几个类别);
2、预分析过程:先通过聚类分析达到简化数据的目的,将众多的个体先聚集成比较好处理的几个类别或者子集,然后再进行后续的多远分析;
3、细分市场、个体消费行为划分。
1、划分聚类:K-Means (中小规模,球形类别、计算速度较快)kmeans :k个族,且每个族中心采用族中所含值的均值计算而成;
2、层次聚类BIRCH:聚类结果丰富、不同层次结果间有嵌套关系 计算量相对较大;
3、基于密度DBSCAN:一个区域中点的密度大过某个阈值,就归于同一类别中,擅长各种特殊形状的类 计算量大;
4、基于网格STNG:将数据空间划分成有限单元,然后基于单元格进行聚类,处理速度快(效果比较差);
5、基于模型:SOM、高斯混合模型。
1、变量选择:只引入不同类别间有显著性差别的变量(无关变量会削弱有效信息,导致严重的错分);
2、共线性问题:相当于某个变量在聚类中的权重大于其他变量,最好进行预处理;
3、变量的标准化:梳理统计算法上要求一律标准化,但标准化后会削弱有用变量的作用,当变量量纲/变异程度相差非常大时候需要进行;
4、距离测量方法:在没有明确准专业知识支持下,首先使用默认值;
5、异常值:影响较大,没有更好解决办法,如果不能避免异常值的影响,则在数据准备过程中加以处理;
6、最佳类别数:2~8数量比较合适。
1、选择距离总和最远的案例作为初始类中心
2、按就近原则将其余案例向选中的点计算距离,并按照距离最近进行归类
3、计算出各个初始类的中心位置(均值)
4、用计算出的中心位置重新计算聚类
5、如此反复循环,直到凝聚点位置收敛位置(收敛的意思是所有的点到中心点的距离都最小)
1、需要知道初始类别、可人为指定初始位置
2、速度较快
3、只能使用连续变量进行聚类
4、衍生:K-中位数聚类
class sklearn.cluster.KMeans(
n_clusters : int,#(default=8)
init : {'k-means++', 'random','ndarray'},#(default='k-means++')
n_init : int,#(default=10)
max_iter : int, #(default=300)
tol : float,#(default=1e-4)
verbose : int, #(default=0)
random_state : int, RandomState instance or None, #(default=None)
copy_x : bool, #(default=True)
algorithm : {"lloyd", "elkan", "auto", "full"}, #(default="lloyd")
)
#一些参数解释
'''
1、n_clusters:聚类类别
2、init:初始类中心位置
'k-means++' : 采用优化后的算法确定类中心
'random' : 随机选取k个案例作为初始类中心
ndarray : (n_clusters, n_features)格式提供的初始类中心位置
3、precompute_distances = 'auto' : {'auto', True, False}
是否预先计算距离,分析速度更快,但需要更多内存
'auto' : 如果n_samples*n_clusters > 12 million,则不事先计算距离
4、algorithm = 'auto' : 'auto', 'full' or 'elkan',具体使用的算法
'full' : 经典的EM风格算法
'elkan' : 使用三角不等式,速度更快,但不支持稀疏数据
'auto' : 基于数据类型自动选择
'''
#KMeans类属性
'''
cluster_centers_ : array, [n_clusters, n_features] 聚类整理之后的中心坐标
labels_ : 类标签
inertia_ : float,各样本和其最近的类中心距离的平方和
'''
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],[10, 2], [10, 4], [10, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print(kmeans.labels_) #数据标签,从结果上看前3个组数据分为一类,后3组数据分为一类
# 输出结果:array([1, 1, 1, 0, 0, 0], dtype=int32)
print(kmeans.predict([[0, 0], [12, 3]])) #数据预测 数据[0, 0]和数据[12, 3] 标签分别为1,0
#array([1, 0], dtype=int32)
print(kmeans.cluster_centers_) #数据中心点位置,数据质心
#array([[10., 2.],[1., 2.]])
(可用树形结构描述)
1、先将所有n个变量/案例看成不同的n类
2、将性质最接近的两类合并成一类
3、从n-1类中找到最接近的两类加以合并
4、依次类推,直到所有的变量/案例被合并为一类
5、使用者根据具体的问题和聚类结果来决定应当分为几类
1、一旦个体被划定类别,其分类结果就不会再进行更改
2、可以对变量或案例进行聚类,变量可以是连续变量或者分类变量,但是不同类型的变量不能同时使用
3、运行速度慢
4、测量距离的方法非常丰富,但是这不是使用该方法的重点
案例聚类使用AgglomerativeClustering
class sklearn.cluster.AgglomerativeClustering(
n_clusters : int or None, default=2
affinity : str or callable, default='euclidean'('euclidean', 'l1', 'l2', 'manhattan', 'cosine', or 'precomputed')
memory : str or object with the joblib.Memory interface, default=None
connectivity : array-like or callable, default=None
compute_full_tree : 'auto' or bool, default='auto'
linkage : {'ward', 'complete', 'average', 'single'}, default='ward'
pooling_func : callable, default=np.mean
distance_threshold : float, default=None
compute_distances : bool, default=False
)
#一些参数解释
'''
1、n_clusters : 聚类的类别数
2、affinity : 使用的距离测量方法
3、linkage = 'ward' 类间距离的计算方法
ward : 使各类的方差总和最小化
average : 使用两个类间所有不同类案例的平均距离
complete : 使用两个类间最远案例的距离
'''
# sklearn.cluster.AgglomerativeClustering类的属性:
'''
labels_ : array [n_samples],各案例的类标签
n_leaves_ : int,聚类树的叶子数(案例数)
n_components_ : int,聚类变量中潜在的成分数
children_ : array-like, shape (n_nodes-1, 2),各非终末节点的子节点列表
'''
from sklearn.cluster import AgglomerativeClustering
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]])
clustering = AgglomerativeClustering().fit(X)
print(clustering)
#AgglomerativeClustering()
print(clustering.labels_) #结果标签
#array([1, 1, 1, 0, 0, 0])
print(pd.DataFrame(clustering.labels_)[0].value_counts()) #每个分类的数量
#1 3
#0 3
使用 FeatureAgglomeration
import numpy as np
from sklearn import datasets, cluster
digits = datasets.load_digits()
images = digits.images
X = np.reshape(images, (len(images), -1))
agglo = cluster.FeatureAgglomeration(n_clusters=32)
print(agglo.fit(X))
#FeatureAgglomeration(n_clusters=32)
X_reduced = agglo.transform(X)
print(X_reduced.shape)
#(1797, 32)
参考文献:
聚类分析(超全超详细版)_葑歆的博客-CSDN博客_聚类分析