深度学习基础课程1笔记-Kmeans算法(聚类)

本篇内容是xxxx深度学习基础课程视频上的,如有侵权,请与我联系,谢谢!
一,理论知识
K-means算法是聚类中的经典算法,数据挖掘十大经典算法之一。
算法接受参数k,然后将事先输入的n个数据对象划分k个聚类;同一聚类中的对象相似度较高;不同聚类中的对象相似度较小。
算法思想:
以空间中k个点为中心点进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果
算法描述:
1)适当选择c个类的出市中心;
2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;
3)利用均值等方法更新该类的中心值;
4)对于所有的c个聚类中心,如果利用2)3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
停止条件:
1)各类点不再发生变化
2)变化小于一定的阈值
3)循环达到一定的次数
举例:
这里写图片描述
将以上数据分为两类(k=2)
这里写图片描述
1) 先选择上图红色五角星的两个点作为初始中心点
2)计算每个点到中心点的距离
这里写图片描述
上图D0第一行0 1 3.61 5 表示4个点到中心点c1(1,1)的距离,第二行 1 0 2.83 4.24表示4个点到中心点c2的距离
3)根据点离中心点最近原则进行分类,第一次迭代分类结果如下:
这里写图片描述
4)根据分类结果,重新确定中心点坐标,
因为第一类只有1个点c1(1,1),所以中心点坐标还是它,c2有3个点,新的中心点左边为:
这里写图片描述
更新后分类结果如下图:
5)再计算每个点到中心点的距离,结果如下
这里写图片描述
根据距离中心点较小的原则归类,结果如下:
这里写图片描述
6)根据新的分类结果,更新中心点坐标如下:
这里写图片描述
分类结果如下:
这里写图片描述
7)再计算各点到中心点的距离,根据最小距离进行归类,发现各类的点已经没有变化了。
这里写图片描述
8)于是得到最终的分类结果:
这里写图片描述

二,代码实现

import numpy as np


def kmeans(X,k,maxIt):

    #返回X的行列数
    numPoints,numDim=X.shape

    #在X列的基础上多加入一列,为了放类的标签
    dataSet =np.zeros((numPoints,numDim+1))
    #不算最后一列,其他行列赋值为X的值
    dataSet[:,:-1]=X

    #随机产生中心点
    centroids=dataSet[np.random.randint(numPoints,size=k),:]
    # centroids=dataSet[0:2,:]

    centroids[:,-1]=range(1,k+1)

    iterations=0
    oldCentroids=None

    #旧中心点和新中心点不相等,循环次数没达到指定次数
    while not shouldStop(oldCentroids,centroids,iterations,maxIt):
        print ("iteration: \n",iterations)   #第几轮
        print("dataSet: \n",dataSet)         #数据集
        print ("centroids \n",centroids)     #中心点


        oldCentroids=np.copy(centroids)      #将中心点拷出,不能直接用=号
        iterations+=1                        #轮数加1

        updateLabels(dataSet,centroids)      #更新标签

        centroids=getCentroids(dataSet,k)    #获取中心点

    return dataSet                           #返回数据集

#判断要不要停止
def shouldStop(oldCentroids,centroids,iterations,maxIt):
    if iterations>maxIt:
        return True
    return np.array_equal(oldCentroids,centroids)

#更新每个点的类标签
def updateLabels(dataSet,centroids):
    numPoints,numDim=dataSet.shape
    for i in range(0,numPoints):
        #当前行最后一列
        dataSet[i,-1]=getLabelFromClosestCentroid(dataSet[i,:-1],centroids)

#比较当前行和每一个中心点距离,选择最近的距离,将其归为该中心点的类
def getLabelFromClosestCentroid(dataSetRow,centroids):
    label=centroids[0,-1]; #中心点的类标签
    minDist=np.linalg.norm(dataSetRow-centroids[0,:-1])  #先让它等于第一个中心点的距离
    for i in range(1,centroids.shape[0]):
        dist=np.linalg.norm(dataSetRow-centroids[i,:-1]) #从第二个中心点开始判断
        if dist<minDist:   #更新最小值
            minDist=dist
            label=centroids[i,-1]   #保存标签
    print ("minDist",minDist)
    return label

#更新中心点坐标
def getCentroids(dataSet,k):
    result=np.zeros((k,dataSet.shape[1]))
    for i in range(1,k+1):
        oneCluster=dataSet[dataSet[:,-1]==i,:-1]
        result[i-1,:-1]=np.mean(oneCluster,axis=0)
        result[i-1,-1]=i
    return result

x1=np.array([1,1])
x2=np.array([2,1])
x3=np.array([4,3])
x4=np.array([5,4])
testX=np.vstack((x1,x2,x3,x4))

result=kmeans(testX,2,10)
print("final result:")
print(result)

结果:
这里写图片描述
这里写图片描述

欢迎扫码关注我的微信公众号

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-means聚类算法是一种常用的数据聚类算法,它通过计算样本之间的距离来将数据分成K个簇。SPSS是一款统计分析软件,也提供了K-means聚类算法的实现功能。 在SPSS中,使用K-means算法进行聚类分析的步骤如下: 1. 首先,打开数据文件,并选择要进行聚类分析的变量。 2. 然后,选择"分析"菜单下的"分类"选项,再选择"K-均值聚类"。 3. 在弹出的对话框中,将待分析的变量移动到"变量"框中,并设置聚类的数量K。 4. 可以选择对初始聚类中心进行优化,方法是勾选"K-means算法初始化K个聚类中心"选项。 5. 最后,点击"确定"按钮,SPSS会进行计算并生成聚类结果。 K-means算法对分类问题的处理简单、快速,并且在处理大数据集时相对高效。在选择初始聚类中心时,算法的基本原则是让初始聚类中心之间的相互距离尽可能远,以保证聚类结果的准确性。 至于K值的确定,可以使用层次聚类方法进行讨论和选择。层次聚类是一种将数据层次化分组的方法,它可以帮助确定最佳的K值。 综上所述,K-means聚类算法是一种常用的数据聚类方法,在SPSS中可以方便地进行实现和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [清风数学建模学习笔记——K-means聚类模型详解及SPSS操作流程](https://blog.csdn.net/weixin_43819566/article/details/113794705)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [聚类算法:K-means聚类与系统(层次)聚类SPSS操作](https://blog.csdn.net/yanyanwenmeng/article/details/105794136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值