基本概念
- 聚成多少个簇:需要指定K的值
- 距离的度量:-般采用欧式距离
- 质心:各向量的均值
- 优化目标:
聚类效果的评价方式
轮廓系数:
- a(i):对于第i个元素xi,计算xi与其同一个簇内所有其他元素距离的平均值,表示了簇内的凝聚程度。
- b(i):选取xi外的一个簇,计算xi与该簇内所有点距离的平均距离,遍历其他所有簇,取所有平均值中最小的一个,表示簇间的分离度。
计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数
。
- 轮廓系数范围在[-1,1]之间。该值越大,越合理。
- si接近1,则说明样本i聚类合理;
- si接近-1,则说明样本i更应该分类到另外的簇;
- 若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++’- ‘k-means++’: 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.
- ‘random’: 随机从训练数据中选取初始质心。
- 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
-
n_init
: 整形,缺省值=10
用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。 -
max_iter
:执行一次k-means算法所进行的最大迭代数。 -
Tol
: 与inertia结合来确定收敛条件。 -
precompute_distances
:三个可选值,‘auto’,True 或者 False。预计算距离,计算速度更快但占用更多内存。
- ‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。
- True:总是预先计算距离。
- 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()函数的参数观察聚类的结果的变化,从而达到最优的聚类效果。