聚类算法理论

目录

原理与用途

常见的聚类方式

聚类中需要注意的问题:

常见算法以及应用

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数量比较合适。

常见算法以及应用

k -均值聚类

k-均值聚类过程

        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博客_聚类分析

你可能感兴趣的:(机器学习,机器学习,聚类,算法)