import numpy as np
def distance(x,y):
return sum((x-y)**2)
def kmeans(data, k, epoch=1000):
n = data.shape[0]
rd = np.random.choice(n,k,replace=False)
center = [data.iloc[rd].values[i] for i in range(k)] # 初始化簇中心
start=0
last_ans = [1 for _ in range(n)]
while start<epoch: # 迭代到达指定轮数时停止
res = [[] for _ in range(k)]
ans = []
for i in range(n):
mi = 0
min_dis = distance(data.iloc[[i]].values[0], center[0])
for j in range(1,k):
dis=distance(data.iloc[[i]].values[0], center[j]) # 计算每个样本到每个簇中心的距离
if dis<min_dis:
mi=j # 更新每个样本所属的簇中心
min_dis=dis
res[mi].append(np.array(data.iloc[[i]])[0]) # 将每个样本归到所属的簇里
ans.append(mi)
if ans==last_ans: # 簇中心不再变化时迭代停止
start+=1
break
else:
last_ans=ans
center=[sum(col)/len(col) for col in res] # 更新簇中心
start+=1
return ans
从代码中可以看出k-means平均时间复杂度在O(k*n*start), start是迭代次数。