首页 > 编程 > Python > 正文

Python实现的KMeans聚类算法实例分析

2020-02-16 00:24:47
字体:
来源:转载
供稿:网友

本文实例讲述了Python实现的KMeans聚类算法。分享给大家供大家参考,具体如下:

菜鸟一枚,编程初学者,最近想使用Python3实现几个简单的机器学习分析方法,记录一下自己的学习过程。

关于KMeans算法本身就不做介绍了,下面记录一下自己遇到的问题。

一 、关于初始聚类中心的选取

初始聚类中心的选择一般有:

(1)随机选取

(2)随机选取样本中一个点作为中心点,在通过这个点选取距离其较大的点作为第二个中心点,以此类推。

(3)使用层次聚类等算法更新出初始聚类中心

我一开始是使用numpy随机产生k个聚类中心

Center = np.random.randn(k,n)

但是发现聚类的时候迭代几次以后聚类中心会出现nan,有点搞不清楚怎么回事

所以我分别尝试了:

(1)选择数据集的前K个样本做初始中心点

(2)选择随机K个样本点作为初始聚类中心

发现两者都可以完成聚类,我是用的是iris.csv数据集,在选择前K个样本点做数据集时,迭代次数是固定的,选择随机K个点时,迭代次数和随机种子的选取有关,而且聚类效果也不同,有的随机种子聚类快且好,有的慢且差。

def InitCenter(k,m,x_train):  #Center = np.random.randn(k,n)  #Center = np.array(x_train.iloc[0:k,:]) #取数据集中前k个点作为初始中心  Center = np.zeros([k,n])         #从样本中随机取k个点做初始聚类中心  np.random.seed(5)            #设置随机数种子  for i in range(k):    x = np.random.randint(m)    Center[i] = np.array(x_train.iloc[x])  return Center

二 、关于类间距离的选取

为了简单,我直接采用了欧氏距离,目前还没有尝试其他的距离算法。

def GetDistense(x_train, k, m, Center):  Distence=[]  for j in range(k):    for i in range(m):      x = np.array(x_train.iloc[i, :])      a = x.T - Center[j]      Dist = np.sqrt(np.sum(np.square(a))) # dist = np.linalg.norm(x.T - Center)      Distence.append(Dist)  Dis_array = np.array(Distence).reshape(k,m)  return Dis_array

三 、关于终止聚类条件的选取

关于聚类的终止条件有很多选择方法:

(1)迭代一定次数

(2)聚类中心的更新小于某个给定的阈值

(3)类中的样本不再变化

我用的是前两种方法,第一种很简单,但是聚类效果不好控制,针对不同数据集,稳健性也不够。第二种比较合适,稳健性也强。第三种方法我还没有尝试,以后可以试着用一下,可能聚类精度会更高一点。

def KMcluster(x_train,k,n,m,threshold):  global axis_x, axis_y  center = InitCenter(k,m,x_train)  initcenter = center  centerChanged = True  t=0  while centerChanged:    Dis_array = GetDistense(x_train, k, m, center)    center ,axis_x,axis_y,axis_z= GetNewCenter(x_train,k,n,Dis_array)    err = np.linalg.norm(initcenter[-k:] - center)    print(err)    t+=1    plt.figure(1)    p=plt.subplot(3, 3, t)    p1,p2,p3 = plt.scatter(axis_x[0], axis_y[0], c='r'),plt.scatter(axis_x[1], axis_y[1], c='g'),plt.scatter(axis_x[2], axis_y[2], c='b')    plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')    p.set_title('Iteration'+ str(t))    if err < threshold:      centerChanged = False    else:      initcenter = np.concatenate((initcenter, center), axis=0)  plt.show()  return center, axis_x, axis_y,axis_z, initcenter            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表