算法简介
由于具有出色的速度和良好的可扩展性,Kmeans聚类算法算得上是最著名的聚类方法。Kmeans算法是一个重复移动类中心点的过程,把类的中心点,也称重心(centroids),移动到其包含成员的平均位置,然后重新划分其内部成员。k是算法计算出的超参数,表示类的数量;Kmeans可以自动分配样本到不同的类,但是不能决定究竟要分几个类。k必须是一个比训练集样本数小的正整数。有时,类的数量是由问题内容指定的。例如,一个鞋厂有三种新款式,它想知道每种新款式都有哪些潜在客户,于是它调研客户,然后从数据里找出三类。也有一些问题没有指定聚类的数量,最优的聚类数量是不确定的。后面我将会详细介绍一些方法来估计最优聚类数量。
Kmeans的参数是类的重心位置和其内部观测值的位置。与广义线性模型和决策树类似,Kmeans参数的最优解也是以成本函数最小化为目标。Kmeans成本函数公式如下:
步骤
输入是样本集,聚类的簇树k,最大迭代次数N
输出是簇划分
1) 从数据集D中随机选择k个样本作为初始的k个质心向量:
2)对于n=1,2,...,N
a) 将簇划分C初始化为
b) 对于i=1,2...m,计算样本和各个质心向量的距离,将标记最小的为所对应的类别。此时更新
c) 对于j=1,2,...,k,对中所有的样本点重新计算新的质心
e) 如果所有的k个质心向量都没有发生变化,则转到步骤3)
3) 输出簇划分
算法实现
import pandas as pd
import numpy as np
import random
#计算聚簇中心
def reCent(inpudata):
mu=np.mean(inpudata, axis=0) # axis=0,计算每一列的均值
return mu
#计算距离
def distance(x,y):
distance=np.dot(x,y.T)
return distance
def knn(inputdata,k):
#随机选择聚簇中心
cxin=[]
y=[]
n=random.sample(range(len(inputdata)), k)
for i in n:
cxin.append(inputdata[i])
cxin=np.array(cxin)
#计算距离
n=0
for x in inputdata:
d=[distance(x,j) for j in cxin]
y.append(d.index(min(d)))
n+=1
for jb in range(n):
if y[jb]==y[-1]:
test=np.array([inputdata[jb],cxin[y[-1]]]) #更换
cxin[y[-1]]=reCent(test)