Python实现的实现的KMeans聚类算法实例分析聚类算法实例分析
本文实例讲述了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
评论0