A-无监督学习算法示例:层次聚类

层次聚类基本原理
 

⼀种针对小样本精确聚类的聚类算法:层次聚类法。所谓更更加精准,⼀方面是指该聚类方法在执行过程中全程保持透明,另⼀面则是在真实的应用场景中,针对数据量不大(数千行左右)的数据,层次聚类往会有一个⾮常好的聚类效果

 

其首先会计算所有数据中最邻近的点,将其归为一个簇,然后取其质心作为簇的代表,参与到下一次最邻近点的选取的过程当中,简单来说就是不断的两两合并直到合并为一个簇为止

 


1:计算两两元素的邻近度

2: repeat

3: 合并最接近的两个簇

4: 更更新邻近性矩阵,以反映新的簇和原来簇或元素之间的邻近度

5: Until 仅剩下⼀一个簇

In [2]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
 
In [4]:
from sklearn.datasets import load_iris
iris = load_iris()
In [6]:
iris.data
In [7]:
iris.target

Out[7]:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
In [8]:
from sklearn.cluster import AgglomerativeClustering
agClustering = AgglomerativeClustering(n_clusters=3)
In [9]:
agClustering.fit(iris.data)
Out[9]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
            connectivity=None, linkage='ward', memory=None, n_clusters=3,
            pooling_func=<function mean at 0x0000027004F287B8>)
In [12]:
agClustering.labels_
Out[12]:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2,
       2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2,
       2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0], dtype=int64)
In [15]:
from sklearn.metrics import accuracy_score  

In [16]:

accuracy_score(iris.target,agClustering.labels_)

Out[16]:

0.23333333333333334