一、K-means算法主要过程  

       (1)从数据中选择k个对象作为初始聚类中心;

  (2)计算每个聚类对象到聚类中心的距离来划分;

  (3)再次计算每个聚类中心

  (4)聚类中心不再变化或到最大迭代次数,则停止,否则,重复2、3。

二、K-means算法手写公式化表示

三、K-means算法适用范围

适用于凸数据集,且数据集符合混合高斯分布,这也是由算法特性决定的

四、K-means算法实例

1、数据集介绍,数据是个人工作中的一个数据,是有1万+鞋子的种类,然后想通过价格,人气,配色等看哪些比较类似

2、算法大致过程,读取csv文件,然后对其中一个特征用one-hot-enconding编码,然后做聚类,然后将结果输出到表格

3、具体代码

#-*- coding: utf-8 -*-

import pandas as pd

#参数初始化

inputfile = 'k-means.csv' #销量及其他属性数据

outputfile = 'data_type.xls' #保存结果的文件名

k = 8 #聚类的类别

iteration = 500 #聚类最大循环次数

data = pd.read_csv(inputfile, index_col = 'goods_id') #读取数据
data_zs = 1.0*(data - data.mean())/data.std() #数据标准化

from sklearn.cluster import KMeans

model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分为k类, 并发数4

model.fit(data_zs) #开始聚类

#简单打印结果

r1 = pd.Series(model.labels_).value_counts() #统计各个类别的数目

r2 = pd.DataFrame(model.cluster_centers_) #找出聚类中心

r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向), 得到聚类中心对应的类别下的数目

r.columns = list(data.columns) + [u'类别数目'] #重命名表头

print(r)

#详细输出原始数据及其类别

r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #详细

#输出每个样本对应的类别

r.columns = list(data.columns) + [u'聚类类别'] #重命名表头

r.to_excel(outputfile) #保存结果

五、K-means算法优缺点

K-Means的主要优点有:

   (1)原理比较简单,实现也是很容易,收敛速度快。

   (2)聚类效果较优。

   (3)算法的可解释度比较强。

   (4)主要需要调参的参数仅仅是簇数k。

K-Means的主要缺点有:

   (1)K值的选取依靠经验

   (2)对于不是凸的数据集比较难收敛

    (3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。

    (4)采用迭代方法,得到的结果只是局部最优。

    (5)对噪音和异常点比较的敏感。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐