1.Partitioning:
Construct k partitions and iteratively update the partitions
(1)k-means(k-均值)
(2) k-medoids(k-中心点)
2.Hierarchical:(层次聚类)
Create a hierarchy of clusters (dendrogram 树状图)
(1)Agglomerative clustering (bottom-up)
(2)Conglomerative clustering (top-down)
3.Graph-based clustering:
Graph-cut algorithms (Spectral Clustering)
4.Model-based clustering
Mixture of Gaussians
5.Other types:
(1)Non-parametric Bayesian (Latent Dirichlet Allocation)
(2)Expectation Maximisation (EM) algorithm
(3)and many more …
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,是无监督学习
给无标签的数据 (或者称为 instance) 分类
宏观来说这个算法是用来干什么的:
所以,这个算法要做的就是怎么通过训练数据集找到这些分类的中心点
我们要做的就是最小化下面的那个公式
公式的意义: 假如所有的点都被分到了正确的类中,那么所有的点到他们所归属的类中心的距离之和是最小的
结果非常依赖初始化时随机选择,或者说 受初始化时选择k个点的影响特别大
可能某个分类被圈在一个很小的局部范围,并不是全局最优
解决方案:用不同的初始化数据(k个数据),重复聚类过程多次,并选择最佳的最终聚类。那怎么评估聚类的好坏呢?例如,评估维度有:(下一个模块有详细讲解)
– 1. smallest number of iterations before convergence
在聚类中心值收敛前,使用了最少迭代次数
– largest total distance between the final cluster means
最终的的cluster means值相加,值最大,也就是说聚类中心点之间的距离越大越好
离群值对平均值的影响非常大
聚类中心(means)不是集群中的点
解决方案:从每个分类中,分别选择其中数据作为初始化聚类中心
import numpy as np
p1 = np.array([1,2,3])
p2 = np.array([4,5,6])
sum = 0
for i in range(len(p1)):
sum += pow(p2[i]-p1[i],2)
dis = np.sqrt(sum)
print(dis)
#5.196152422706632
def distManhatten(self, x, y):
distance = sum(abs(x-y))
return distance
如果数据features太多(维度很多),需要进行降维处理,降到二维或三维,方便进行图像输出,具体理论介绍在这里
例子实现二维降到一维
import numpy as np
data = np.array([[0.9, 1.0],
[2.4, 2.6],
[1.2, 1.7],
[0.5, 0.7],
[0.3, 0.7],
[1.8, 1.4],
[0.5, 0.6],
[0.3, 0.6],
[2.5, 2.6],
[1.3, 1.1]])
# 各元素与平均值的差值 (defferences)
X = data - np.reshape(np.mean(data,axis=0),(-1,data.shape[1]))
# 协方差矩阵(coveriance matrix )
C = (1/data.shape[0]) * np.dot(X.transpose(),X)
# 特征值(eigenValues)与 特征向量(eigenVectors)
eigenValues, eigenVectors = np.linalg.eigh(C)
print('\neigenValues =', np.round(eigenValues, 2))
print('\neigenVectors =', eigenVectors)
# 取最大特征值对应的特征向量 叫"转换矩阵"
U = (eigenVectors[:, np.argsort(-eigenValues)[0:1]])
print('\nU =', U)
# Principal Component 主成分
PCA = np.dot(X,U).transpose()
print('\nPCA :', PCA)
# eigenValues = [0.03 1.13]
#
# eigenVectors = [[ 0.68075138 -0.73251454]
# [-0.73251454 -0.68075138]]
#
# U = [[-0.73251454]
# [-0.68075138]]
#
# PCA : [[ 0.40200434 -1.78596968 -0.29427599 0.89923557 1.04573848 -0.5295593 # 0.96731071 1.11381362 -1.85922114 0.04092339]]
(聚类效果的评价方式大体上可分为性能度量和距离计算两类。)
cluster中点最多的那个颜色,定为这个cluster的label。在这个cluster 中和label色不同的点,是错误分类。
栗子:
总结下来可以理解为,positive是分在了同一个cluster, negative是分在了不同的cluster。Ture 和 False 指紧跟它的P 和 N 是分类正确还是错误。
相同的例子:
TP + FP: 是不管分类是否正确,被分在了同一个cluster的item pairs
TP: 同一个class的点被正确的分在了同一个cluster中
TN + FN:是不管分类是否正确,被分在了不同的cluster的item pairs
FN:同一个class的点被正确的分在了不同的cluster中
用上面的例子,以及我们在 RI 中得出的的 TP、FP、TN、FN 的值,计算得出: