kmeans及其python实现

k-means算法的基础是最小误差平方和准则,代价函数是:

 式中uc(i)是第c族的质心坐标(均值)

伪代码如下:

创建k个点作为初始的质心点(随机选择)

当任意一个点的簇分配结果发生改变时:

           对数据集中的每一个数据点:

                          对每一个质心:

                                           计算质心与数据点的距离

                         将数据点分配到距离某质心最近的簇

          对每一个簇,计算簇中所有点的均值,并将均值作为质心

代码如下:

import numpy as np
 
# 加载数据
def loadDataSet(fileName):
    data = np.loadtxt(fileName,delimiter='\t')
    return data
 
# 欧氏距离计算
def distEclud(x,y):
    return np.sqrt(np.sum((x-y)**2))  # 计算欧氏距离
 
# 从数据集中随机选择k个点作为质心centroid初始值
def randCent(dataSet,k):
    m,n = dataSet.shape
    centroids = np.zeros((k,n))
    for i in range(k):
        index = int(np.random.uniform(0,m)) 
        centroids[i,:] = dataSet[index,:]
    return centroids
 
# k均值聚类主函数
def KMeans(dataSet,k):
    m = dataSet.shape[0]  #行的数目
    # 第一列存样本属于哪一簇,第二列存样本的到簇的中心点的误差
    clusterAssment = np.mat(np.zeros((m,2)))
    #np.mat()和np.array()功能类似,前者是矩阵,后者是数组
    #将矩阵转化为数组直接在矩阵后加.A即可,见下面

    clusterChange = True   #迭代是否终止
 
    # 第1步 初始化centroids
    centroids = randCent(dataSet,k)

    while clusterChange:
        clusterChange = False
 
        # 遍历所有的样本(行数)
        for i in range(m):
            minDist = float('inf')
            minIndex = -1
 
            # 遍历所有的质心
            #第2步 找出最近的质心
            for j in range(k):
                # 计算该样本到质心的欧式距离
                distance = distEclud(centroids[j,:],dataSet[i,:])
                if distance < minDist:
                    minDist = distance
                    minIndex = j
            # 第 3 步:更新每一个样本所属的簇
            if clusterAssment[i,0] != minIndex:
                clusterChange = True
                clusterAssment[i,:] = minIndex,minDist**2

        #第 4 步:所有样本遍历完之后,更新质心
        for j in range(k):
            pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]  # 获取簇类所有的点
            centroids[j,:] = np.mean(pointsInCluster,axis=0)   # 对矩阵的行求均值,作为质心的最新坐标

    return centroids,clusterAssment

参考:

https://www.cnblogs.com/ahu-lichang/p/7161613.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值