【K-means聚类是如何实现的?】

基本概念

  1. 聚成多少个簇:需要指定K的值
  2. 距离的度量:-般采用欧式距离
  3. 质心:各向量的均值
  4. 优化目标:
    在这里插入图片描述

聚类效果的评价方式

轮廓系数
、

  • a(i):对于第i个元素xi,计算xi与其同一个簇内所有其他元素距离的平均值,表示了簇内的凝聚程度
  • b(i):选取xi外的一个簇,计算xi与该簇内所有点距离的平均距离,遍历其他所有簇,取所有平均值中最小的一个,表示簇间的分离度

计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数

在这里插入图片描述

  1. 轮廓系数范围在[-1,1]之间。该值越大,越合理。
  2. si接近1,则说明样本i聚类合理;
  3. si接近-1,则说明样本i更应该分类到另外的簇;
  4. 若si 近似为0,则说明样本i在两个簇的边界上。

K-means聚类参数介绍

class sklearn.cluster.KMeans(n_clusters=8,
init=’k-means++’,
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances=’auto’,
verbose=0,
random_state=None,
copy_x=True,
n_jobs=None,
algorithm=’auto’)[source]

【参数】:

  • n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】

  • init:参初始化的方法,默认为’k-means++’

    1. ‘k-means++’: 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.
    2. ‘random’: 随机从训练数据中选取初始质心。
    3. 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
  • n_init: 整形,缺省值=10
    用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

  • max_iter :执行一次k-means算法所进行的最大迭代数。

  • Tol: 与inertia结合来确定收敛条件。

  • precompute_distances:三个可选值,‘auto’,True 或者 False。

    预计算距离,计算速度更快但占用更多内存。

    1. ‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。
    2. True:总是预先计算距离。
    3. False:永远不预先计算距离。
  • verbose:整形,默认值=0

  • random_state :随机状态,随机种子

  • copy_x:布尔型,默认值=True
    当我们precomputing distances时,将数据中心化(也就是数据归一化)会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

  • algorithm:‘auto’,‘full’ or ‘elkan’.默认为’auto’

  • full:采用经典的EM算法

  • elkan:通过使用三角不等式从而更有效,但不支持稀疏数据

  • auto:数据稀疏选择full模式,数据稠密选择elkan模式

【属性】:

  • cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标
  • Labels_:
    每个点的分类标签。
  • inertia_:float形
    每个点到其簇的质心的距离之和。
  • n_iter_ : int
    迭代次数。

K-means实验文件

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


#读取文件
beer=pd.read_table("data.txt",sep=' ',encoding='utf8',engine='python')
#传入变量(列名)
X=beer[["calories","sodium","alcohol","cost"]]

"""
根据分成不同的簇,自动计算轮廓系数得分
"""
scores=[]
#寻找合适的K值
for k in range(2,10):
    labels=KMeans(n_clusters=k).fit(X).labels_  #从左到右依次进行计算
    score=metrics.silhouette_score(X,labels)  #轮廓系数
    scores.append(score)
print(scores)

#绘制得分结果
import matplotlib.pyplot as plt

plt.plot(list(range(2,10)),scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihousette Score")
plt.show()
#聚类
km=KMeans(n_clusters=2).fit(X)  #K值为2【分为2类】
beer['cluster']=km.labels_

#对聚类结果进行评分
"""
采用轮廓系数评分
X:数据集    scaled_cluster:聚类结果
score:非标准化聚类结果的轮廓系数
"""
score=metrics.silhouette_score(X,beer.cluster)
print(score)

【运行结果】:在这里插入图片描述

可以通过调节KMeans()函数的参数观察聚类的结果的变化,从而达到最优的聚类效果。


  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值