#K-means聚类

from numpy import *

importmatplotlib.pyplot as plt

plt.ion()#开启交互模式,实时绘制

plt.subplots()

plt.xlim(-6, 6)

plt.ylim(-6, 6)#plt.pause(5)

defloadDataSet(fileName):

dataMat=[]

fr=open(fileName)for line infr.readlines():

curLine= line.strip().split('\t')

fltLine=list(map(float,curLine))

dataMat.append(fltLine)returndataMatdefdistEclud(vecA, vecB):#print("vecA:",vecA,"vecB:",vecB)

return sqrt(sum(power(vecA-vecB, 2))) #欧式距离

#给定数据集构建一个包含k个随机质心的集合#该函数为给定数据集构建一个包含k个随机质心的集合#集合中的值位于min合max之间

defrandCent(dataSet, k):

n= shape(dataSet)[1]

centroids=mat(zeros((k,n)))for j inrange(n):

minJ=min(dataSet[:,j])

rangeJ= float(max(dataSet[:,j]) -minJ)

centroids[:,j]= minJ + rangeJ*random.rand(k,1)returncentroids'''k-均值聚类算法:

该算法会创建k个质心,然后将每个点分配到最近的质心。这个过程重复数次,直到数据点的簇分配结果不再改变为止。

这个接口的缺点是:质心是随机初始化的,虽然最后会通过划分后的点加均值函数重新计算,但质心没有真正的进行最优化收敛

k均值算法收敛(kMeans函数)到了局部最小值,而非全局最小值

一种用于度量聚类效果的指标是SSE(Sum of Squared Error,误差平方和),SSE值越小表示数据点越接近于它们的质心,聚类

效果也就越好。因为对误差取了平方,因此更加重视那些远离中心的点,一种肯定可以降低SSE值的方法是怎加簇的个数,

但这违背了聚类的目标。聚类的目标是在保持簇数目不变的情况下提高簇的质量。'''

def kMeans(dataSet, k, distMeans=distEclud, createCent=randCent):

m=shape(dataSet)[0]

clusterAssment= mat(zeros((m, 2))) #记录每个样本点到质心的最小距离,及最小距离质心的索引

centroids =createCent(dataSet, k)

centroids_mean_before=centroids

plt_scatter(dataSet,centroids,clusterAssment)

clusterChanged=TruewhileclusterChanged:

clusterChanged=Falsefor i in range(m): #样本数据按行遍历

minDist = inf; minIndex = -1 #inf 表示正无穷

for j in range(k): #遍历质心,寻找最近质心

distJI = distMeans(centroids[j,:], dataSet[i,:]) #计算i点到j质心的距离

if distJI

minDist= distJI; minIndex=j #计算出每个样本数据最近的质心点与距离

if clusterAssment[i,0] != minIndex: clusterChanged =True

clusterAssment[i,:]= minIndex,minDist**2plt_scatter(dataSet,centroids_mean_before,clusterAssment)for cent in range(k): #遍历所有的质心并更新它们的取值

ptsInClust = dataSet[nonzero(clusterAssment[:,0].A ==cent)[0]]

centroids[cent,:]= mean(ptsInClust, axis=0)

centroids_mean_before=centroids

plt_scatter(dataSet,centroids,clusterAssment)returncentroids, clusterAssment#二分K-均值算法

'''为了克服k-均值算法收敛于局部最小值的问题,有人提出了另一个称为二分K-均值的算法。

二分k-均值:首先将所有点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续进行划分,

选择哪个簇继续划分取决于对其划分是否可以最大程度降低SSE的值。上述基于SSE的划分过程不断重复,

直到得到用户指定的簇数目为止。'''

def biKmeans(dataSet, k, distMeas=distEclud):

m=shape(dataSet)[0]

clusterAssment= mat(zeros((m,2))) #创建一个m*2的零矩阵

#print('clusterAssment:',clusterAssment)

centroid0 = mean(dataSet, axis=0).tolist()[0] #tolist() 把mat转为list

centList =[centroid0]

plt_scatter(dataSet, mat(centList), clusterAssment)#print('centList:', centList)

for j inrange(m):

clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2 #记录每个点到质心的距离的平方

#print('clusterAssment:',clusterAssment)

while (len(centList)

lowestSSE= inf #正无穷

for i inrange(len(centList)):#以clusterAssment中第一列索引为i的行为索引,找到这些索引对应dataSet的的值返回。通俗讲 就是找出第i个质心关联的点

ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]

centroidMat,splitClustAss= kMeans(ptsInCurrCluster, 2, distMeas)

sseSplit= sum(splitClustAss[:,1])

sseNotSplit= sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1]) #求划分前其余(除i质心之外的)质心的sse值

print("sseSplit, and notSplit:",sseSplit, sseNotSplit)if (sseSplit + sseNotSplit)

bestCentToSplit=i

bestNewCents=centroidMat

bestClustAss=splitClustAss.copy()

lowestSSE= sseSplit + sseNotSplit #所有质心(被分割的质心加没被分割的质心)距离的平方

#更新bestClustAss簇的分配结果

bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] =len(centList)

bestClustAss[nonzero(bestClustAss[:,0].A== 0)[0],0] =bestCentToSplitprint("the bestCentToSplit is:",bestCentToSplit)print("the len of bestClustAss is:", len(bestClustAss))#将bestCentTosplit(最适合分割的质心点),替换为分割后的第0个质心点,分割后生成的另一个质心点通过 append方法添加

centList[bestCentToSplit] = bestNewCents[0,:].tolist()[0] #python3修改

centList.append(bestNewCents[1,:].tolist()[0])#将被分割的质心cluter索引和最小距离平方(minDist**2) 重新赋值

clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:] =bestClustAss

plt_scatter(dataSet, mat(centList), clusterAssment)returnmat(centList),clusterAssment#绘图接口

defplt_scatter(datMat,datCent,cluster):

plt.clf()#清空画布

plt.xlim(-6, 6) #因为清空了画布,所以要重新设置坐标轴的范围

plt.ylim(-6, 6)

m=shape(datMat)[0]

n=shape(datCent)[0]

ms=['^','v','o','s','p','','1','2','3'] #数据点形状

cs=['r','g','b','y','m','c','k','r','g','b'] #数据点的颜色

for i inrange(m):

k=int(cluster[i,0])

plt.scatter(datMat[i,0],datMat[i,1],c=cs[k],marker=ms[k],alpha=0.5)for j inrange(n):

plt.scatter(datCent[j,0],datCent[j,1],c=cs[j],marker='x',alpha=1.0)

plt.pause(0.3)if __name__ == '__main__':

datMat= mat(loadDataSet('testSet.txt'))#myCentroids,clusterAssing = kMeans(datMat, 4)

#plt_scatter(datMat,myCentroids,clusterAssing)

centList,myNewAssments=biKmeans(datMat,4)

plt_scatter(datMat,centList,myNewAssments)

plt.ioff()

plt.show()

二分平均值聚类 java_二分K-均值聚类算法相关推荐

  1. Kmeans++、Mini-Batch Kmeans、Bisecting Kmeans、K中心点(K-Medoids)算法、K众数聚类、核K均值聚类

    Kmeans++.Mini-Batch Kmeans.Bisecting Kmeans.K中心点(K-Medoids)算法.K众数聚类.核K均值聚类 目录 Kmeans++.Mini-Batch Km ...

  2. 图像聚类-K均值聚类

    最近做的一个东西跟这个相关,本来希望是用深度学习对于没有标签的图像数据进行分类,但是通常情况下,深度学习是对有标签的数据进行学习,目的是用来自动提取特征,代替传统的手工提取特征.因此,比较容易想到,对 ...

  3. K均值聚类关于初始聚类中心的探讨(matlab程序)

    对应之前发过的:K均值聚类关于初始聚类中心的探讨,补发MATLAB的程序代码. matlab程序: 1. %利用传统K均值随机选取点聚类 clear all; close all; clc; %生成五 ...

  4. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  5. K均值聚类以及matlab实现

    K均值聚类是最基础的一种聚类方法.K均值聚类,就是把看起来最集中.最不分散的簇标签分配到输入训练样本里.具体而言,通过下式计算簇y的分散情况. 在这里,表示的是满足的y的和. 上式的为簇y的中心,为属 ...

  6. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

  7. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  8. 第十四章聚类方法.14.3K均值聚类

    文章目录 主要内容 k均值聚类的定义 样本空间划分 k均值聚类策略 算法步骤 例题 k均值聚类算法特性 收敛性 初始类的选择 类别数k的选择 k均值聚类缺点改进 本课程来自深度之眼,部分截图来自课程视 ...

  9. 机器学习之K-Means(k均值)算法

    1 K-Means介绍 K-Means算法又称K均值算法,属于聚类(clustering)算法的一种,是应用最广泛的聚类算法之一.所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇, ...

  10. spss聚类分析_SPSS聚类分析 I K均值聚类法案例实操

    - 点击上方"中国统计网"订阅我吧!- 文末领取医疗行业报告 今天想写一下聚类分析方法之一:K-Mean聚类法 01聚类分析模型简介 (1)聚类分析没有过多的统计理论支持,也没有统 ...

最新文章

  1. 解读高效的神经架构搜索ENAS
  2. 线性表的C/C++实现(数据结构 严蔚敏版)
  3. 刘志勇:微博短视频百万级高并发架构
  4. 资深前端开发工程师分享:关于前端学习路线的一些建议
  5. [JZOJ100047] 【NOIP2017提高A组模拟7.14】基因变异
  6. mac上设置新版chrome浏览器跨域
  7. Atitit.gui api自动化调用技术原理与实践
  8. windows 系统开启的端口调研
  9. ABP VNext纯洁版项目模板
  10. JVM中的Xms和Xmx
  11. Mysql 安装PMM监控 (一台主机安装)
  12. 关于SCI论文发表的五不准原则是
  13. 2005-04-28 把爸爸锁在阳台上
  14. 漫威超级战争显示服务器断开,漫威超级战争进不去怎么办
  15. codeforces 300B切题记录
  16. VMware发表新版桌面虚拟化软件View 3
  17. 武林秘籍之Spring AOP 切面编程的简单应用
  18. 计算机应用基础00018课件
  19. H5人脸实名认证-百度云版
  20. CoCa-GAN阅读笔记

热门文章

  1. wxWidgets:wxWebView类用法
  2. wxWidgets:wxScopedCharTypeBuffer< T >类模板用法
  3. boost::property_tree模块自定义 ptree 的 data_type 需要执行的操作
  4. boost::phoenix::function相关的测试程序
  5. boost::pfr::for_each_field相关的测试程序
  6. boost::histogram模块实现自定义二维轴的测试程序
  7. Boost.Flyweight 键值测试的类
  8. GDCM:gdcm::SwapperDoOp的测试程序
  9. Boost:基于Boost的HTTP客户端的程序
  10. ITK:二维高斯混合模型期望最大化