기계 학습 (Machine Learning) - 계층 적 클러스터링 (클러스터 이론)

계층 적 클러스터링 (클러스터 이론)

클러스터링은 미지의 데이터 세트의 라벨 다수이고 내부 데이터 비교적 유사한 카테고리 내의 데이터는 소분류 유사도 데이터 있도록 다양한 종류의 복수의 데이터 세트에 존재하는 데이터에 따른 자율 속하는 학습.

알고리즘 단계

1. K의 중심점 초기화

2. 각 시료의 거리에 따라 카테고리를 할당

각 카테고리 (해당 범주의 모든 샘플의 업데이트 평균) 3. 업데이트 중심점

4. 정지 상태가 될 때까지 위의 두 단계를 반복합니다

 

특정 조건을 충족 할 때까지 데이터 분해 수준의 주어진 집합에 대한 계층 적 클러스터링 방법은 기존의 계층 적 클러스터링 알고리즘은 두 가지 범주로 나누어 져 있습니다 :

응집 계층 적 클러스터링

AGNES 알고리즘 ==> 상향식 (bottom-up) 전략.

응집성 (응고)의 중첩 (중첩)

초기에 각 오브젝트가 클러스터로, 다음에 따른 클러스터 특정 조건 단계 (두 개의 클러스터들 간의 유사성 메트릭)에 의해 결합되는 공정은 두 클러스터 사이의 거리가 가장 가까운 두 개의 서로 다른 클러스터로 구성 될 수있다 데이터 포인트의 유사성을 결정하는 단계; 클러스터 병합 프로세스가 반복 클러스터의 개수까지하면 모든 오브젝트를 충족.


아그네스 범주, 다음 클러스터로 각 과일을 넣어하는 것입니다.

 

포인트 선택을 병합 :

  • 두 클러스터 사이의 최대 거리 (완료)

  • 두 클러스터 사이의 최소 거리 (워드)

  • 두 클러스터 사이의 평균 거리 (평균)

적합한 쇄 클러스터링은보다 적합한 스트립.

코드 :

연계 : 전체, 단어, 평균

오기 NP AS NumPy와
 오기 AS MPL하기 matplotlib
 임포트 PLT의 AS matplotlib.pyplot
 #가 AGNES 호출 
로부터 sklearn.cluster 오기 AgglomerativeClustering
 에서 sklearn.neighbors 오기 kneighbors_graph   # K # KNN 접 계산 
오기 DS의 sklearn.datasets AS
 #가 비정상 차단 
임포트 경고 나타내는가 
경고를 나타낸다 .filterwarnings는 ( ' 무시 ' )
 #에 설정된 속성이 중국어 왜곡 방지 
mpl.rcParams [ ' font.sans serif- ' ] = [U ' SimHei을' ] 
Mpl.rcParams [ ' axes.unicode_minus는 ' ] = 거짓
 #의 아날로그 데이터 생성을 600 개의 데이터가 생성 
(0) np.random.seed 
n_clusters의 = 4. 
N = 1000 
DATAl, Y1 = ds.make_blobs (N_SAMPLES = N, n_features을 2 =, = 중심점 ((-... 1 ,. 1), (1 ,. 1), (1, -1), (-1, -1)) random_state = 0) 
n_noise = INT (0.1 * N) 
R & LT = np.random.rand (n_noise 2 ) 
MIN1, MIN2 = np.min (DATAl, 축 = 0) 
MAX1, MAX2가 = np.max (DATAl, 축 = 0) 
R & LT [: 0] = R & LT [0 : * (MAX1 - MIN1) + MIN1 
R & 중위 [:1] = R [1 :, * (MAX2 - min2) + min2 
data1_noise = np.concatenate ((DATA1, R), 축 = 0) 
y1_noise = np.concatenate ((Y1, [4] * n_noise))
 # 拟合月牙形数据 
DATA2, Y2 = ds.make_moons (N_SAMPLES = N, 소음 = .05 ) 
DATA2 = np.array (DATA2) 
n_noise = INT (0.1 * N) 
R = np.random.rand (n_noise 2 ) 
min1, min2 = np.min (DATA2 축 = 0) 
max1, MAX2 = np.max (DATA2 축 = 0) 
R [:, 0] = R [:, 0] * (max1 - min1) + min1 
R [:, 1] = R [1 :, * (MAX2 - min2) +MIN2 
data2_noise = np.concatenate ((DATA2, R & LT), 축 = 0) 
y2_noise = np.concatenate ((Y2, * 3.] n_noise)) 
DEF expandBorder (A, B) : 
    D = (B - A) 0.1 *
     리턴 D, B + - D 
# # 페인트 
# 주어진 컬러 도면 
㎝-mpl.colors.ListedColormap = ([ ' #의 FF0000 ' , ' # 00FF00 ' , ' #의 0000FF ' , ' #의 d8e507를 ' , ' #의 F0F0F0 ' ]) 
plt.figure (figsize= (14, 12이다) facecolor는 = ' W ' ) 
연결기는 = ( " " , " 완료 " , " 보통 " )   # 리스트에 여러 가지 방법의 거리의 값을 직접 재순환 
을 위해 , (n_clusters 인덱스 , 데이터, Y)  열거 (((4 DATAl, Y1), (4 , data1_noise, y1_noise), 
                                               ( 2, DATA2, Y2)는, (2 , data2_noise, y2_noise))) :
     #의 전술 한 대표 개의 4 여러 홀수 행, 세번째 파라미터 (오른쪽 숫자 왼쪽부터 1) 서브 영상의 수가 나타내는 
    plt.subplot을 (4 ,. 4 * 인덱스 1 + 4.  )
    plt.scatter (데이터 [: 0] 데이터 [: . 1, Y = C = CMAP㎝-) 
    plt.title (U ' 원본 데이터 ' , fontSize는 = 17. ) 
    plt.grid (B 트루 = LS = ' : ' ) 
    MIN1, MIN2 = np.min (데이터 축 = 0) 
    MAX1, MAX2 = NP. 맥스 (데이터 축 = 0) 
    plt.xlim (expandBorder (MIN1, MAX1)) 
    plt.ylim (expandBorder (MIN2, MAX2)) 
    # 거리와 (일곱 개 샘플의 가장 가까운 거리를 계산) 카테고리의 범주를 계산 - 바람직한 AGENS 알고리즘은 반복적 연산 처리의 점 사이의 거리를 계산할 필요로하지 않는다 
    = kneighbors_graph (데이터 연결 N_NEIGHBORS의 = 7, 모드 =. ' 거리 ' , 메트릭 = ' 민코프 스키 ' 참), p = 2, include_self = 
    연결 = (연결 + connectivity.T)
     에 대한 I, 링크 열거 (결합) :
         #의 #의进行建模,并传值 
        AC = AgglomerativeClustering (n_clusters의 =의 n_clusters 친화력 = ' 유클리드 ' , 
                                     연결성 = 연결, 링크 = 연결기) 
        ac.fit (데이터) 
        Y = ac.labels_ 
        plt.subplot ( 4, 4, 난 + 2 + 4 * 인덱스) 
        plt.scatter (데이터 [:, 0] 데이터 [:, 1, Y = C, = cmap를 cm) 
        plt.title (결합, 글꼴 크기 = 17 )
        plt.grid (b = TRUE, LS의 = ' : ' ) 
        plt.xlim (expandBorder (min1, max1)) 
        plt.ylim (expandBorder (min2, MAX2)) 
plt.tight_layout ( 0.5, RECT = (0, 0, 1, 0.95 )) 
plt.show ()

아그네스 다른 연결 방법의 결과를 사용 :

 

 

분할 계층 적 클러스터링 (의사 결정 트리와 유사)

DIANA 알고리즘 ==> 하향식 전략.

분열 (분할) 분석 (분석)

모든 개체 일부 설정된 규칙 클러스터에 넣고, 따른 우선 서서히 분해 가 종료 조건에 도달 할 때까지 (예를 사용 kmeans 같은) 더 작은 클러스터로 (클러스터 또는 클러스터 거리 임계치의 수에 도달 할 때).

1 클러스터로 데이터 큐 모든 샘플을 2 개의 서브 클러스터 (클러스터 두 중심 초기화)로 분할하고, 상기 서브 클러스터가 큐에 추가 될 때까지, 세 번째 단계 루프 반복 중지 상태에 도달 할 때 ( 클러스터 번호 , 최소 제곱 오차 , 반복 횟수 )

분리 점을 선택합니다 :

  • 각 클러스터 오류

  • 각 클러스터 SSE (바람직하게는이 전략)

  • 데이터 샘플 클러스터의 양까지 선택

패킷 빵과 유사한 DIANA

 

AGNES 和 DIANA

  • 간단하고 쉬운 이해하기

  • 통합 포인트 / 분할 포인트 선택이 쉽지 않다

  • 결합 운영 / 분류는 취소 할 수 없습니다 (닫지 빵 컷)

  • 큰 데이터 세트에 적합하지

  • 执行效率较低O(t*n2),t为迭代次数,n为样本点数

AGNES的优化

BIRCH(掌握)

BIRCH算法(平衡迭代削减聚类法):

聚类特征使用3元组进行一个簇的相关信息,通过构建满足分枝因子和簇直径限制的聚类特征树来求聚类,聚类特征树其实是一个具有两个参数分枝因子和类直径的高度平衡树;分枝因子规定了树的每个节点的子女的最多个数,而类直径体现了对这一类点的距离范围;非叶子节点为它子女的最大特征值;

聚类特征树的构建可以是动态过程的,可以随时根据数据对模型进行更新操作。

 三元组

 

BIRCH的构造

 

 

从根节点到叶子节点一层一层的取判断,

优缺点:

  • 适合大规模数据集,线性效率;

  • 只适合分布呈凸形或者球形的数据集、需要给定聚类个数和簇之间的相关参数

代码实现:

库参数:

  1. threshold 类直径

  2. branshing_factor 分支因子

  3. n_clusters 簇个数

 
from itertools import cycle
from time import time
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as colors
​
from sklearn.cluster import Birch
from sklearn.datasets.samples_generator import make_blobs
​
## 设置属性防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
## 产生模拟数据
xx = np.linspace(-22, 22, 10)
yy = np.linspace(-22, 22, 10)
xx, yy = np.meshgrid(xx, yy)
n_centres = np.hstack((np.ravel(xx)[:, np.newaxis],
                       np.ravel(yy)[:, np.newaxis]))
# 产生10万条特征属性是2,类别是100,符合高斯分布的数据集
X, y = make_blobs(n_samples=100000, n_features=2, centers=n_centres, random_state=28)
# 创建不同的参数(簇直径)Birch层次聚类
birch_models = [
    Birch(threshold=1.7, n_clusters=None),
    Birch(threshold=0.5, n_clusters=None),
    Birch(threshold=1.7, n_clusters=100)
]
# threshold:簇直径的阈值,    branching_factor:大叶子个数
# 我们也可以加参数来试一下效果,比如加入分支因子branching_factor,给定不同的参数值,看聚类的结果
## 画图
final_step = [u'直径=1.7;n_lusters=None', u'直径=0.5;n_clusters=None', u'直径=1.7;n_lusters=100']
​
plt.figure(figsize=(12, 8), facecolor='w')
plt.subplots_adjust(left=0.02, right=0.98, bottom=0.1, top=0.9)
colors_ = cycle(colors.cnames.keys())
cm = mpl.colors.ListedColormap(colors.cnames.keys())
​
for ind, (birch_model, info) in enumerate(zip(birch_models, final_step)):
    t = time()
    birch_model.fit(X)
    time_ = time() - t
    # 获取模型结果(label和中心点)
    labels = birch_model.labels_
    centroids = birch_model.subcluster_centers_
    n_clusters = len(np.unique(centroids))
    print("Birch算法,参数信息为:%s;模型构建消耗时间为:%.3f秒;聚类中心数目:%d" % (info, time_, len(np.unique(labels))))
​
    # 画图
    subinx = 221 + ind
    plt.subplot(subinx)
    for this_centroid, k, col in zip(centroids, range(n_clusters), colors_):
        mask = labels == k
        plt.plot(X[mask, 0], X[mask, 1], 'w', markerfacecolor=col, marker='.')
        if birch_model.n_clusters is None:
            plt.plot(this_centroid[0], this_centroid[1], '*', markerfacecolor=col, markeredgecolor='k', markersize=2)
    plt.ylim([-25, 25])
    plt.xlim([-25, 25])
    plt.title(u'Birch算法%s,耗时%.3fs' % (info, time_))
    plt.grid(False)
​
# 原始数据集显示
plt.subplot(224)
plt.scatter(X[:, 0], X[:, 1], c=y, s=1, cmap=cm, edgecolors='none')
plt.ylim([-25, 25])
plt.xlim([-25, 25])
plt.title(u'原始数据')
plt.grid(False)
​
plt.show()

运行结果:

Birch算法,参数信息为:直径=1.7;n_lusters=None;模型构建消耗时间为:2.510秒;聚类中心数目:171Birch算法,参数信息为:直径=0.5;n_clusters=None;模型构建消耗时间为:6.689秒;聚类中心数目:3205Birch算法,参数信息为:直径=1.7;n_lusters=100;模型构建消耗时间为:3.013秒;聚类中心数目:100

Process finished with exit code 0

 

CURE(没人用)

CURE算法(使用代表点的聚类法):

该算法先把每个数据点看成一类,然后合并距离最近的类直至类个数为所要求的个数为止。但是和AGNES算法的区别是:取消了使用所有点或用中心点+距离来表示一个类

而是从每个类中抽取固定数量、分布较好的点作为此类的代表点,并将这些代表点乘以一个适当的收缩因子,使它们更加靠近类中心点。

代表点的收缩特性可以调整模型可以匹配那些非球形的场景,而且收缩因子的使用可以减少噪音对聚类的影响。

 

找几个特殊的点来代替整个类别中的样本

优缺点:能够处理非球形分布的应用场景采用随机抽样和分区的方式可以提高算法的执行效率

추천

출처www.cnblogs.com/TimVerion/p/11229542.html