【机器学习】K均值算法 - 性能分析

K均值算法是最基础的一种聚类算法。具体算法描述就不提了,资料实在太多,这里说一下它的特点和局限性。

 

一、K均值的特点

1、容易陷入局部最小值

之所以陷入局部最小值,是因为初始值设置的有问题,即初始的K个base点在属性空间中的位置直接影响了最终的聚类结果。所以可以随机多次进行K均值聚类,选取各种不同的初始值,产生不同的聚类结果。选择一个代价函数(代价函数就是总的距离差的平方和)最小的一个,作为最终的结果。

 

如果根据计算机自主随机初始化,虽然根据概率统计有几率遍历所有可能的聚类结果,但是这样的代价依然比较大。此时可以采取一些措施减少一些不必要的K均值聚类。我们知道,之所以聚类的结果不同,主要是因为K个base点之间的距离有较大影响,所以我们可以人为地去调整每两个K样本之间的距离最小,而另外一些则比较大。因此,一种较好的添加人为初始化,所构造的knn的次数是K(K-1)。如果是纯初始化,则次数应当更多

 

2、计算距离的方法

如果是离散属性,直接计算属性差值,如果是连续属性,则计算归一化距离,因为在计算距离时应当保证所有属性的公平对待。如果需要区别对待,则需要在属性上加一个权值。

该算法的复杂度就在于每次都要计算距离,这个计算量也是比较大的。

 

二、代码

直接使用sklearn中的包。当然我们可以自己去造轮子,而且有这样的事例代码,但是代价是泛化性能不好,局限性太强,运行速度太慢,没有性能优化。

 

参数解释:

(1)n_clusters : 整数类型,指将当前的数据分成多少类,默认是8类。

(2)init : 可选的取值有'k-means++', 'random' 或一个ndarray类型。它指的是初始化中心base点的方法。'k-means++' 是指以函数库内部优化的方法选取初始化点,这种方法可以减少尝试的次数。'random' 是指从样本集中随机选择一些样本点作为base值。另外一种就是直接给定一个ndarray类型的矩阵,这个矩阵是 (n_clusters, n_features) 维的,也就是说,可以不指定样本点,而是直接在属性空间中随机指定,灵活性大大增加。

(3)n_init : 整数类型,默认值是10,指的是K-means算法运行的次数,即选取不同的初始值,得到聚类结果的次数,选取10次运行中效果最好的一次,评价标准是inertia,就是上面所述的代价函数。

(4)max_iter : 整数类型,默认是300,指的是每次运行算法最大的迭代次数。

(5)tol : 浮点数,默认是1e-4,指的是前后两次迭代,inertia的差值,如果小于tol,则停止迭代,即代价精度。

(6)precompute_distances: 有两种取值,'auto',或者布尔类型的True,False。这个指的是预先计算样本点之间的距离。如果预先计算,则算法运行更快,但是空间消耗较大。所谓的预先计算precompute,就是把运算时,之前计算过的一些距离记录下来,之后处理时用到了,就不用再计算了,典型的一种空间换时间的方法。

     其中,'auto' 指的是当 n_samples * n_clusters > 12000000时才进行预计算,否则不计算。这对应着额外的100M的内存。True即指总是要采用这种方法提升速度,False 就是内存太珍贵,总是不用这种方法。当然,我们也可以在源代码中修改这个auto中的数值。

(7)verbose : 默认是0,可选取其它整数。显示详细的训练信息。

(8)random_state : 和其它机器学习算法中使用随机状态的参数相同,主要是为了给算法提供不同的选取随机数的方法,以实现数据的复现,更新等等。

(9)copy_x : 布尔类型,默认是True。该参数影响的是样本数据的中心化。如果选择True,则样本数据正常处理,没有任何影响。如果为False,数据就会被中心化,所谓中心化就是求出每一个属性的期望,然后用样本的该属性值减去期望值,得到的数据就是中心化的数据。但是当选择False的时候,数据仅仅是在处理时经过了中心化,但并不会改变样本数据集中本来的面目。

(10)n_jobs : 整数,指的是计算机运行的作业数。一个cpu在一个时刻只能运行一个job作业。如果参数选择为-1,那么计算机中所有的CPU都参与了该算法的训练。如果取1,即只有1个CPU在运行,也就是单进程,并且Python解释器是单线程的,也就是说单线程运行。如果参数小于-1,那么(计算机中CPU的个数+1+n_jobs)即是计算机中运行的作业数。比如我的计算机是4核的,参数取值为-2,此时有3个CPU参与了此次训练。

(11)algorithm : 可选的值有"auto", "full" or "elkan", 默认是"auto"。指选择哪种算法进行训练。如果使用经典的EM算法,参数选"full"。"elkan" variation是什么算法,我也不知道,根据sklearn包的说明,可知该算法必须在满足距离的三角不等式前提下使用,如果不满足,则不可使用。一般不用在稀疏数据上。"auto" 指的是在稠密数据上选择"elkan",稀疏数据上选择EM算法。

该方法的属性解释:

cluster_centers_ : array, [n_clusters,n_features]显示训练完成后的聚类中心

labels_ :每个样本点聚类的结果

inertia_ : 代价函数,样本点到其自己类中心点的距离之和。

 

from sklearn.cluster import KMeans
from sklearn import datasets
import numpy as np
import pylab as pl

print "+++++++++++++++++++ 第一个例子 +++++++++++++++++++++"
X1 = np.array([[1, 2], [1, 4], [1, 0],
               [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0, verbose=3).fit(X1)
print "聚类的标签:", kmeans.labels_
Y1 = kmeans.labels_

xx = np.array([[0, 0], [4, 4]])
yy = kmeans.predict(xx)
print "预测未知样本属于哪一类:", yy
print "指出每一类的聚类中心:\n", kmeans.cluster_centers_

pl.scatter(xx[:, 0],  # 正类的支持向量
           xx[:, 1],  # 反类的支持向量
           s=120,  # 点的半径大小
           facecolors='blue')  # face colors,支持向量的样本点的颜色
pl.scatter(X1[:, 0],  # 样本集的 x 轴数据
           X1[:, 1],  # 样本集的 y 轴数据
           c=Y1,  # 分类结果集
           s=60,
           cmap=pl.cm.Paired)  # cmap 确定颜色
pl.axis('tight')
pl.show()

print "+++++++++++++++++++ 第二个例子 +++++++++++++++++++++"

X2 = datasets.load_iris()
kmeans = KMeans(n_clusters=3, init='k-means++', algorithm='elkan', random_state=0,copy_x=False).fit(X2.data)
print "聚类的标签:", kmeans.labels_
Y = kmeans.labels_3
for i in xrange(150):
    if Y[i] == 1:
        Y[i] = 0
    elif Y[i] == 0:
        Y[i] = 1
a = 0
print Y
print X2.target
for _ in xrange(150):
    if Y[_] == X2.target[_]:
        pass
    else:
        a += 1
precision = float(len(Y) - a) / len(Y)
print "聚类的精度:", precision



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值