热线电话:13121318867

登录
2020-08-25 阅读量: 1031
数据分析Python聚类

聚类

聚类(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()


42.4673
0
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子