聚类
聚类(Clustering):将数据集划分为若干相似对象组成的多个组(group)
或簇(cluster)的过程,使得同一组中对象间的相似度最大化,不同组
中对象间的相似度最小化。或者说一个簇(cluster)就是由彼此相似的
一组对象所构成的集合,不同簇中的对象通常不相似或相似度很低
聚类分析指将物理或抽象对象的集合分组为由类似的对象 组成的多个类的分析过程。它是一种重要的人类行为。
聚类源于很多领域,包括数学,计算机科学,统计学,生 物学和经济学。在不同的应用领域,很多聚类技术都得到 了发展,这些技术方法被用作描述数据,衡量不同数据源 间的相似性,以及把数据源分类到不同的簇中。
聚类的意义:
首先将大规模的、纷繁复杂的数据归档为不同的类别,
进而针对每一类数据,制定不同的管理、分析方式,因
为每一类的数据都是显著不同的。
聚类会从数据中发掘出很多分析和理解的视角,让我们 更深入的把握数据资源的价值、并据此指导生产生活。
聚类与分类的区别:
分类:监督学习,有限类别中的某一类
聚类:无监督学习,不依赖预先定义的类或带类标记的 训练实例,需要由聚类学习算法自动确定标记。聚类是 一种探索性的分析,聚类分析所使用方法的不同,常常 会得到不同的结论。不同研究者对于同一组数据进行聚 类分析,所得到的聚类数未必一致。
聚类基本流程:
对数据进行表示和预处理,包括数据清洗、特征选择或特征抽取
给定数据之间的相似度或相异度及其定义方法
根据相似度,对数据进行划分,即聚类
对聚类结果进行评估
主要聚类方法类别:
K-means
K-均值(K-Means):K均值法是麦奎因(MacQueen,1967)提出的,这 种算法的基本思想是将每一个样本分配给最近中心(均值)的类中。
算法步骤:
先从没有标签的元素集合A中随机取k个元素作为k个子集各自的中心
分别计算剩下的元素到k个子集中心的距离,根据将这些元素分别划归到最 近的子集
根据聚类结果,重新计算中心(子集中所有元素各个维度的算数平均数)
将集合A中全部元素按照新的中心然后再重新聚类
重复以上步骤,直到聚类的结果不再发生变化
代码实现:
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt('data//kmeans.txt',delimiter=' ')
# 设置k值
k = 4
#只动n_clusters参数
model = KMeans(n_clusters=k)
model.fit(data) #聚类结束
model.cluster_centers_ #四个质心
model.labels_ #样本所对应的标签
model.n_iter_ #迭代次数
model.inertia_ #SSE,累加平方误差
#预测,执行分类
model.predict([[1,2]])
可视化:
predictions=model.predict(data)
centers=model.cluster_centers_
# 画样本点
mark = ['or','ob','og','oy']
for i,d in enumerate(data):
plt.plot(d[0],d[1],mark[predictions[i]])
# 画分类中心点
mark = ['*r','*b','*g','*y']
for i,center in enumerate(centers):
plt.plot(center[0],center[1],mark[i],markersize=20)
plt.show()
K-Means算法优化
根据经验:使用多次的随机初始化,计算每一次建模得到代价函数的值,选取代价 函数最小结果作为聚类结果
肘部法则优化k
from sklearn import metrics
silhouette_all=[]
for k in range(2,10):
model = KMeans(n_clusters=k)
model.fit(data)
labels = model.labels_
silhouette_score = metrics.silhouette_score(data, labels, metric='euclidean')
silhouette_all.append(silhouette_score)
plt.plot(range(2,10),silhouette_all)
plt.xlabel('k')
plt.ylabel('silhouette_score')
plt.show()
轮廓系数:Mini Batch K-Means算法
Mini Batch K-Means算法是K-Means算法的变种,采用小批量的数据子集减小计 算时间。这里所谓批是指每次训练算法时所随机抽取的数据子集,采用这些随 机产生的子集进行训练算法,大大减小了计算时间,结果一般只略差于标准算法。
算法的迭代步骤有两步:
从数据集中随机抽取一些数据形成小批量,把他们分配给最近的质心
更新质心
与K均值算法相比,数据的更新是在每一个小样本集上。Mini Batch K-Means比 K-Means有更快的收敛速度,略微降低聚类的效果。
DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise):它将簇定义为密度相连的点组成的最大集合,能够把具有足够高密度的区域划 分为簇,并可在噪声的空间数据库中发现任意形状的聚类
DBSCAN中的几个定义:
Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域
核心对象:如果给定对象Ε邻域内的样本点数大于等于Min-points,则称 该对象为核心对象
直接密度可达:对于样本集合D,如果样本点q在p的Ε邻域内,并且p为核 心对象,那么p到q直接密度可达
密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p=p1,q=pn,假如 pi-1到pi直接密度可达,那么对象p到q密度可达
密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度 可达的,那么p和q密度相联
DBSCAN密度聚类思想:由密度可达关系导出的最大密度相连的样本集合,即为 我们最终聚类的一个类别,或者说一个簇
算法步骤:
指定合适的E和Min-points;
计算所有的样本点,如果p的E邻域里有超过Min-points个点,则创建一个 以p为核心点的新簇;
反复寻找这些核心点直接密度可达(之后能是密度可达)的点,将其加入 到相应簇,对于核心点发生“密度相连”状况的簇,给予合并;
当没有新的点可以被添加到任何簇时,算法结束。
DBSCAN的主要优点有:
不需要输入聚类个数,可以对任意形状的稠密数据集进行聚类,相对的, K-Means之类的聚类算法一般只适用于凸数据集
可以在聚类的同时发现异常点,对数据集中的异常点不敏感
聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有
很大影响
DBSCAN的主要缺点有:
如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差
如果样本集较大时,聚类收敛时间较长
调参相对于传统的K-Means之类的聚类算法稍复杂,需要对距离阈值E,邻域样本数阈值Min-points联合调参
数据集是稠密的,并且数据集不是凸的,DBSCAN会比K-Means聚类效果好很多
代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
%matplotlib inline
x1, y1 = datasets.make_circles(n_samples=2000, factor=.4, noise=.05)#x1为坐标,y1为标签,这里不需要标签
x2, y2 = datasets.make_blobs(n_samples=1000, centers=[[1.2,1.2]], cluster_std=[[.1]])
x = np.concatenate((x1, x2))
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()
from sklearn.cluster import DBSCAN
y_pred = DBSCAN(eps = 0.2,min_samples=50).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()
暂无数据