数据挖掘 | [无监督学习——聚类] K-means聚类及python代码实现——利用sklearn

K-Means

  • K-平均法
    • 方法
    • 流程
  • python代码实现
  • 一些参考

相关文章:
数据挖掘 | [关联规则] 利用apyori库的关联规则python代码实现
数据挖掘 | [有监督学习——分类] 决策树基本知识及python代码实现——利用sklearn
数据挖掘 | [有监督学习——分类] 朴素贝叶斯及python代码实现——利用sklearn
数据挖掘 | [无监督学习——聚类] 凝聚层次聚类及python代码实现——利用sklearn

K-平均法

  • 算法:k-平均。划分的k-平均算法基于簇中对象的平均值。
  • 输入:簇的数目k和包含n个对象的数据集。
  • 输出:k个簇,使平方误差准则最小。

方法

  • 任意选择k个对象作为初始的簇中心;
  • repeat
  • 根据簇中对象的平均值,将每个对象(重新)赋给最类似的簇;
  • 更新簇的平均值,即计算每个簇中对象的平均值;
  • until准则不再发生变化

流程

  1. 随机选择k个对象,每个对象初始地代表了一个簇的平均值或质心。
  2. 对于剩余的每个对象,根据它与各个簇中心的距离,将它赋给最近的簇,然后重新计算每个簇的平均值(质心)。
  3. 这个过程不断重复,直到准则函数收敛为止(趋于恒定)。准则函数采用平方误差和。

python代码实现


import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics

data_pd=pd.read_csv('csv数据路径',sep=',')
data_arr=np.array(data_pd)   #将dataframe转换成array

#生成属性数据集和结果数据集
dataMat = np.mat(data_arr)
X = dataMat[:,0:40]
#X=X.A
y1 = dataMat[:,40]
y1=y1.A   #将numpy中的matrix(矩阵)数据类型转换为numpy中的array(数组)数据类型
#print(type(y1))
#print(type(y1[0]))

# 此时y1是数组类型,而数组中每一个元素又是一个数组,有两层
# 调用sklearn中模型评估方法metrics时会报错,该方法要求数据为一层
y=[]
for i in y1:
    for j in i:
        y.append(j)
#print(y)

# 建立聚类模型对象,实例化
kmeans = KMeans(n_clusters=3)
# 训练聚类模型
kmeans.fit(X)
print(kmeans)

# 预测聚类模型
pre_y = kmeans.predict(X)
print(pre_y)

#以下借鉴了:https://blog.csdn.net/tonydz0523/article/details/84659905
### 模型效果指标评估 ###
inertias = kmeans.inertia_ # 样本距离最近的聚类中心的总和

adjusted_rand_s = metrics.adjusted_rand_score(y, pre_y) # 调整后的兰德指数

mutual_info_s = metrics.mutual_info_score(y, pre_y) # 互信息

adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y, pre_y) # 调整后的互信息

homogeneity_s = metrics.homogeneity_score(y, pre_y) # 同质化得分

completeness_s = metrics.completeness_score(y, pre_y) # 完整性得分

v_measure_s = metrics.v_measure_score(y, pre_y) # V-measure得分

silhouette_s = metrics.silhouette_score(X, pre_y, metric='euclidean') # 平均轮廓系数

calinski_harabasz_s = metrics.calinski_harabasz_score(X, pre_y) # Calinski 和 Harabaz 得分

df_metrics = pd.DataFrame([[inertias, adjusted_rand_s,mutual_info_s, adjusted_mutual_info_s, homogeneity_s,
                            completeness_s,v_measure_s, silhouette_s ,calinski_harabasz_s]],
                            columns=['ine','tARI','tMI','tAMI','thomo','tcomp','tv_m','tsilh','tc&h'])

#dataframe输出有时候会省略中间的变量,下面这行代码是为了让它能够全部显示
pd.set_option('display.max_columns',None)  
print(df_metrics)

输出的结果:

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
       n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',
       random_state=None, tol=0.0001, verbose=0)
[0 0 1 ... 0 1 0]
             ine      tARI       tMI      tAMI     thomo     tcomp      tv_m  \
0  227591.599037  0.251631  0.395101  0.359422  0.359655  0.361503  0.360576   

      tsilh         tc&h  
0  0.172903  1312.807975  

一些参考

关于模型检验我是借鉴的大佬的文章,大家可以去大佬文章看具体解释,或者看sklearn有关聚类评估的帮助文档。更多有关k-means的知识也可以看sklearn有关k-means的帮助文档

你可能感兴趣的:(数据挖掘·初学者,聚类,数据挖掘,python,机器学习,大数据)