python手写kmeans

from numpy import *
from pandas import *

def randomCenters(dataSet,k):
    n = shape(dataSet)[1]
    print "shape",shape(dataSet)
    centers = mat(zeros((k,n)))
    for j in range(n):
        minJ = min(dataSet[:,j])
        print "dataSet[:,j]", dataSet[:,j]
        rangeJ = float(max(dataSet[:,j]) - minJ)
        centers[:,j] = minJ+rangeJ+random.rand(k,1)
        print "centers[:,j] ", centers[:,j]
    return centers

def calcDist(A,B):
    return sqrt(sum(power((A-B),2)))

def kMeans(dataSet, k):
    n = shape(dataSet)[0]
    m = shape(dataSet)[1]
    #初始化距离矩阵
    distMat = mat(zeros((n,2)))
    print "distMat",distMat
    randomCents = randomCenters(dataSet, k)
    centerChanged = True
    while centerChanged:
        centerChanged = False
        for i in range(n):
            minDist = inf
            minIndex = -1
            for j in range(k):
                #对每一个点,计算它到质心的距离
                distMean = calcDist(dataSet[i,:], randomCents[j,:])
                if distMean<minDist:
                    minDist = distMean
                    minIndex = j
            if distMat[i,0] == minIndex:
                centerChanged = True
            #其实是将它所属的质心记录下来
            distMat[i,0] = minIndex
            distMat[i,1] = distMean
        print randomCents
        #相当于打标签
        dataNew = column_stack((dataSet, distMat[:,0]))
        print "dataNew", dataNew
        # 可以理解为增加表头
        dataUse = DataFrame(dataNew)
        print "dataUse", dataUse
        for i in range(k):
            dataMean = dataUse[dataUse[m] == i]
            l = []
            for j in range(m):
                means = mean(dataMean[j])
                l.append(means)
            randomCents[i] = l
    return randomCents, distMat


c1 = [1,2]
c2 = [10,11]
c3 = [2,3]
c4 = [9,10]
dataTest = mat([c1,c2,c3,c4])
print "dataTest",dataTest
kMeans(dataTest,2)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值