文章目录
- K-means
- 聚类和分类的区别
- K-means基本概念:
- 常见的距离
- 图解过程
- 初始状态(图a)
- 初始化质心(图b)
- 分配数据点到最近的质心(图c)
- 重新计算质心并迭代
- 聚类效果的评价方式
- 【参数:】
- 【属性】
- python实现
K-means
K-means 是一种“无监督聚类”算法,运行前必须人为指定要把数据分成多少个簇,这个数量用 K 表示。
K 值直接影响聚类结果。K 太小会把不同类的数据强行合并,K 太大会把同类数据拆得过细。
聚类和分类的区别
分类是“有标签的监督学习”,聚类是“无标签的无监督学习”——前者已知“答案”(类别标签)去学规律,后者不知道“答案”,只能靠数据本身的相似性分组。
K-means基本概念:
1.聚成多少个簇:需要指定K的值
K-means里的K是“要分的簇的数量”,必须人为提前定好。比如想把用户分成3类,K就设为3;想分5类,K就设为5。
2.距离的度量:一般采用欧式距离
算法要判断“数据点离哪个质心近”,就得算距离。最常用的距离是欧式距离
3.质心:各向量的均值
质心是每个簇的“中心点”,计算方式是簇内所有数据点的“向量均值”。
这是K-means的核心目标:最小化**“所有簇内数据点到质心的平方距离之和”**。
常见的距离
图解过程
初始状态(图a)
图中有一些绿色的点,代表待聚类的数据集,此时还未确定质心。
初始化质心(图b)
图中出现了两个“×”,这两个“×”就是随机初始化的两个质心,用于开始聚类过程。
分配数据点到最近的质心(图c)
图中的绿色点被分配到了距离各自最近的质心所在的类别,形成了红色的两个簇。同时,根据注释“新的质心为所有类中的数据x值平均”,接下来会重新计算每个簇的质心。
重新计算质心并迭代
重新计算质心后,算法会再次将数据点分配到距离新的质心最近的类别,然后又重新计算质心,如此迭代,直到质心不再发生明显变化或者达到预设的迭代次数等停止条件为止。
聚类效果的评价方式
【参数:】
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
迭代次数。
python实现
importpandasaspdfromsklearn.clusterimportKMeansfromsklearnimportmetrics""" 可视化网站 https://www.naftaliharris.com/blog/visualizing-k-means-clustering/ """#读取文件beer=pd.read_table("data.txt",sep=' ',encoding='utf8',engine='python')#传入变量(列名)X=beer[["calories","sodium","alcohol","cost"]]""" 根据分成不同的簇,自动计算轮廓系数得分 """scores=[]forkinrange(2,10):#寻找合适的K值labels=KMeans(n_clusters=k).fit(X).labels_#从左到右依次进行计算score=metrics.silhouette_score(X,labels)#轮廓系数scores.append(score)print(scores)#绘制得分结果importmatplotlib.pyplotasplt plt.plot(list(range(2,10)),scores)plt.xlabel("Number of Clusters Initialized")plt.ylabel("Sihouette 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)**寻找最佳簇数 K**用循环测试 K=2到9,分别训练 K-means 模型。 对每个 K 计算轮廓系数(衡量簇内紧凑度与簇间分离度)。 记录所有 K 的轮廓系数并绘图,直观看出哪个 K 效果最好。**执行最终聚类** 根据图形或业务需求,选定一个 K(此代码选 K=2)。 用该 K 训练 K-means,得到每个样本的簇标签,并保存到原数据表中。**评估聚类效果**用轮廓系数对最终聚类结果打分,判断聚类质量。