用代码聊算法之k-means算法

一、简介k-means是一种常见的无监督机器学习算法,众所周知,无监督学习的分类往往是需要先聚类再分类的,而k-means算法就是最常见,使用频率最高的聚类算法。其核心思想是把一些未标注的数据(无标签)分类称为k类不相同的簇中(cluster),算法k-means名称中的k就是所分成的簇的数量。而同一簇之中的对象都是有某些相似之处,当簇中的点越相似,我们的分类效果就越好。每个簇的中心点是由该簇
摘要由CSDN通过智能技术生成

一、简介

        k-means是一种常见的无监督机器学习算法,众所周知,无监督学习的分类往往是需要先聚类再分类的,而k-means算法就是最常见,使用频率最高的聚类算法。其核心思想是把一些未标注的数据(无标签)分类称为k类不相同的簇中(cluster),算法k-means名称中的k就是所分成的簇的数量。而同一簇之中的对象都是有某些相似之处,当簇中的点越相似,我们的分类效果就越好。每个簇的中心点是由该簇所有点的欧氏距离的平均值计算而成,因此也就得名means。

k-means除了应用在对无标签的数据进行聚类分类之外,也常常应用于有监督学习进行训练之前的对数据集特征的探索和表征。

k-means算法中的k一般是手动指定的,换句话说k是算法的输入,稍后我们会讨论如何不指定k值的情况下开始我们的算法。

二、数学表示

随机选择k个点作为起始质心(centroid)
循环质心(初始质心开始):
        对于数据集中到每一个点计算其到所有质心到的距离,把它归类于该质心的簇。
        移动质心,把每一簇之中所有点的平均值作新的质心
循环终止条件:
        若某次循环新质心与老质心位置一致,则循环结束

三、代码


1、两个点之间距离(欧氏距离)的计算函数:
def distEclud(vecA,vecB):
    return np.sqrt(sum(vecA-vecB,2))

2、为数据集创建k个随机质心的函数:
def randCent(dataSet,k=2):
    n=np.shape(dataSet)[1]
    centroids=np.matrix(np.zeros(n,k))
    for j in range(n):
        minJ=min(dataSet[:,j])
        rangeJ=float(max(dataSet[:,j])-minJ)
        centroids[:,j]=minJ+rangeJ*np.random.rand(k,1)
    return centroids


3、k-means主算法:
def kmeans (dataSet,k=2,distMess=distEclud,createCent=randCent):
    m=np.shape(dataSet)[0]
    clusterAssment = np.mat(np.zeros((m,2)))
    centroids=createCent(dataSet,k)
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            minDist = np.inf;
            minIndex = -1;
            for j in range(k):
                distJI=distMess(centroids[j,:],dataSet[i,:])
                if distJI<minDist:
                    # 寻找最近的质心
                    minDist=distJI;minIndex=j
            if clusterAssment[i,0] != minIndex:
                clusterChanged = True
                clusterAssment[i,:] = minIndex,minDist**2
        print(centroids)
        for cent in range(k):
            # 更新质心的位置
            ptsInClust = dataSet[np.nonzero()]
            centroids[cent,:]=np.mean(ptsInClust,axis=0)
    return centroids,clusterAssment



四、实现

        上面的python代码是参考《机器学习实战》一书写出的代码,但是在实际工作之中,我们更多的是使用scikit-learn提供的k-means算法,scikit-learn是一个在机器学习领域被广泛应用的科学计算工具包,该项目最早由数据科学家 David Cournapeau 在2007 年发起,需要NumPy和SciPy等其他包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
      

        下面贴出scikit-learn的k-means示例代码[2]

>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...               [4, 2], [4, 4], [4, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
>>> kmeans.cluster_centers_
array([[ 1.,  2.],
       [ 4.,  2.]])

scikit-learn的sklearn.cluster提供了一个完整的k-means算法的实现KMeans,其中参数的含义如下:

1、n_clusters:k值,即聚类簇的数量,该值默认值是8

2、max_iter:每次执行k-means算法单次最大循环次数,即终止条件,以防止迭代次数过多循环仍不结束,在最优解附近徘徊的情况,该值也是可选的,默认值300

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值