当前位置:   article > 正文

python数据挖掘——聚类_python 数组 聚类

python 数组 聚类

划分聚类

Kmeans

原理

(1)任意选择k个对象作为初始的簇中心;(2)根据距离(欧式距离)中心最近原则,将其他对象分配到相应类中;(3) 更新簇的质心,即重新计算每个簇中对象的平均值;(4) 重新分配所有对象,直到质心不再发生变化

 

 调包实现

  1. import time
  2. import pandas as pd
  3. from sklearn import preprocessing
  4. data = pd.read_csv("/.../iris.csv")
  5. iris = data.iloc[:,:4] # 获取iris数据
  6. target = data.iloc[:,4:] # 单独存放species属性
  7. # 预处理
  8. # 将species转换成数字
  9. class_encoder = preprocessing.LabelEncoder()
  10. target['species'] = class_encoder.fit_transform(target['species'].values)
  1. # K-means
  2. from sklearn.cluster import KMeans
  3. # 将数据聚为3类
  4. kms = KMeans(n_clusters = 3)
  5. # 训练数据
  6. kms.fit(iris)
  7. # 预测结果
  8. kms_label = kms.labels_
  9. kms_label = pd.DataFrame(kms_label,columns=["聚类结果"])
  10. kms_iris = iris.copy()
  11. kms_iris["聚类结果"] = kms_label
  12. kms_iris

参数调优

  1. # 肘方法确定参数
  2. SSE_list = []
  3. for n in range(1,10):
  4. kms = KMeans(n_clusters=n)
  5. kms.fit(iris)
  6. SSE_list.append(kms.inertia_)
  7. plt.xlabel = "n_clusters"
  8. plt.ylabel = "SSE"
  9. plt.plot(range(1,10),SSE_list,"o-")

 

结果可视化

  1. kms_cc = pd.DataFrame(kms.cluster_centers_,
  2. index=[0,1,2],
  3. columns=['sepal_length','sepal_width','petal_length','petal_width'])
  4. kms_iris = pd.concat([kms_iris,kms_cc])
  5. fig = plt.figure()
  6. ax = fig.add_subplot()
  7. ax.scatter(x=kms_iris.iloc[:150,1:2],y=kms_iris.iloc[:150,3:4],c=kms.labels_,label=[1,2,0])
  8. ax.scatter(x=kms_iris.iloc[150:,1:2],y=kms_iris.iloc[150:,3:4],c=[0,1,2],marker='*')
  9. plt.show()

自己实现 

  

  

 

  

K-Medoids

不采用簇中对象的平均值作为参照点,  而是选用簇中位置最中心的对象,  即中心点作为参照点

PAM算法

反复地用非代表对象替代代表对象,以改进聚类的质量

CLARA算法

随机地抽取多个样本,针对每一个样本寻找代表对象medoids,并进行全部数据对象的聚类,然后从中选择质量最好的聚类结果作为最终结果,并分配其余对象。


层次聚类

分裂型层次聚类法

分割最不相似的两个部分,从所有的对象归属在唯一的一个簇中开始,逐层向下分解,直到每一个对象形成一个簇。

凝聚型AGNES

(1)首先将每一个对象独立地作为一个簇。 (2)然后根据各个簇之间的相似程度(距离)逐层向上聚结,形成越来越大的簇。 (3)最终形成包含全部对象的唯一的一个簇,也可以在满足一定的聚结终止条件时终止聚结。 

 代码实现

  1. # AGNES聚类
  2. from sklearn.cluster import AgglomerativeClustering
  3. # 将数据聚为3类
  4. ac = AgglomerativeClustering(linkage='complete',n_clusters=3)
  5. # 训练数据
  6. ac.fit(iris)
  7. # 得到结果
  8. ac_label = ac.labels_
  9. ac_label = pd.DataFrame(ac_label,columns=["聚类结果"])
  10. ac_iris = iris.copy()
  11. ac_iris["聚类结果"] = ac_label
  12. # 数据匹配
  13. ac_iris["聚类结果"].loc[ac_iris["聚类结果"]==2] = 'x'
  14. ac_iris["聚类结果"].loc[ac_iris["聚类结果"]==0] = 2
  15. ac_iris["聚类结果"].loc[ac_iris["聚类结果"]==1] = 0
  16. ac_iris["聚类结果"].loc[ac_iris["聚类结果"]=='x'] = 1
  17. ac_iris

 层次聚类树

  1. # 层次聚类树
  2. from scipy.cluster import hierarchy
  3. plt.figure(figsize=(15,5))
  4. # 生成聚类树
  5. Z = hierarchy.linkage(ac_iris,method='weighted',metric='euclidean')
  6. hierarchy.dendrogram(Z)
  7. plt.show()

 BIRCH算法

假设在给定的一个簇中,有n个m维的数据点,i = 1, 2, ..., n

该簇的聚类特征向量CF = (N, LS, SS):(1) N是该类中的数据点数目;(2) LS是该n个数据点的线性和,即 \sum_{i=1}^{N}x_{i};(3) SS是该n个数据点的平方和,即 \sum_{i=1}^{N}x_{i}^{2}


密度聚类

DBSCAN

关键概念:核心对象、直接密度可达、密度可达、密度相连、簇与噪声

调包实现

  1. # DBSCAN
  2. from sklearn.cluster import DBSCAN
  3. # 设置邻域半径为0.81,MinPts为10
  4. db = DBSCAN(eps=0.81, min_samples=10)
  5. # 训练数据
  6. db.fit(iris)
  7. # 得到结果
  8. db_label = db.labels_
  9. db_label = pd.DataFrame(db_label,columns=["聚类结果"])
  10. db_iris = iris.copy()
  11. db_iris["聚类结果"] = db_label
  12. db_iris

由于聚类是无监督学习,聚类结果可能与本身的标签不匹配,所以还需要做数据匹配。下图还没有做数据匹配,可以通过颜色看出聚类结果与本身标签并不对应。 

参数调优

  1. # 确定最佳参数
  2. db_list = []
  3. for each_eps in np.arange(0.01,10,0.10):
  4. for each_minpts in range(5,11):
  5. db = DBSCAN(eps=each_eps,min_samples=each_minpts)
  6. # 训练模型
  7. db.fit(iris)
  8. db_label = db.labels_
  9. db_label = pd.DataFrame(db_label,columns=["聚类结果"])
  10. n = pd.DataFrame(db.labels_).value_counts().size-1 # 簇数
  11. db_iris = iris.copy()
  12. db_iris["聚类结果"] = db_label
  13. try:
  14. score = silhouette_score(db_iris,db.labels_) # 轮廓系数
  15. db_list.append({'eps':each_eps,'min_samples':each_minpts,
  16. 'n_clusters':n,'轮廓系数':score})
  17. except:
  18. continue

  

所以设置邻域半径为0.81,MinPts为10

 自己实现(待完善)

 

 

  

OPTICS算法

优先选择最小的\varepsilon值密度可达的对象, 以便高密度的聚类能被首先完成


聚类评价

下图是已经做过数据匹配之后的结果,p4是原分类结果

 兰德系数

FMI 

 

DBI 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/719940
推荐阅读
相关标签
  

闽ICP备14008679号