K-means聚类算法
来源:互联网 发布:3d动画软件 编辑:程序博客网 时间:2024/06/06 10:40
K-means 是基础的聚类算法之一。它的思想是首先确定需要把样本聚成K个类别。k是需要不断去尝试和选择的。每个簇的中心用簇均值来表示。
伪代码
- 输入:K:簇的数量
D:包含n个对象的数据集 - 输出:k个簇的集合
- 步骤:
1.从D中选择任选k个中心点作为最初的中心点
repeat
2.将D中的数据划分到离中心点最近的簇中
3.重新计算每个簇的均值
until每个对象所属的簇不发生变化。
k-means容易受到初始点的影响。对异常值很敏感。对于离散数据可使用k-众数的方式来选择中心点。可将k-means和k-众数集成为可以处理有连续和离散数据的算法。
下面是copy自《机器学习实战》的Python代码,在Python3.4环境下。其中的数据集是书中自带的数据集
import numpy as npdef loadDataSet(fileName): dataMat=[] fr=open(fileName) for line in fr.readlines(): curLine=line.strip().split('\t') fltLine=list(map(float,curLine)) dataMat.append(fltLine) return dataMat##计算两个样本间的距离def distEclud(vecA,vecB): return np.sqrt(np.sum(np.power(vecA-vecB,2)))##产生随机中心点,dataSet是mat形式def randCent(dataSet,k): n=np.shape(dataSet)[1] centroids=np.mat(np.zeros((k,n))) for j in range(n): minJ=min(dataSet[:,1]) rangeJ=float(max(dataSet[:,1])-minJ) centroids[:,j]=minJ+rangeJ*np.random.rand(k,1) return centroids##kMeansdef kMeans(dataSet,k,distMeans=distEclud,createCent=randCent): m=np.shape(dataSet)[0] clusterAssment=np.mat(np.zeros((m,2))) centroids=createCent(dataSet,k) clusterChanged=True while clusterChanged: clusterChanged=False for i in range(m): minDist=np.inf minIndex=-1 for j in range(k): distJI=distMeans(dataSet[i,:],centroids[j,:]) if minDist>distJI: minDist=distJI minIndex=j if clusterAssment[i,0]!=minIndex: clusterAssment[i,0]=minIndex clusterAssment[i,1]=minDist clusterChanged=True for cent in range(k): ptsInclust=dataSet[np.nonzero(clusterAssment[:,0].A==cent)[0]] #nonzero的用法 centroids[cent,:]=np.mean(ptsInclust,axis=0) return centroids,clusterAssmentdataSet=np.mat(loadDataSet('testSet.txt'))cent,clus=kMeans(dataSet,4)
稍后提供c++版
0 0
- k-means聚类算法
- k-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-MEANS聚类算法
- k-means聚类算法
- K-means聚类算法
- 聚类算法 K-means
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- 聚类算法:K-means
- K-means聚类算法
- K-means聚类算法
- PHP学习实例—2(简易图形计算器)
- 算法导论——lec 08 线性时间排序
- Graph的算法实现: 寻找一幅图的最小生成树(MST)
- 全栈JavaScript之路(十二)了解 Selector API
- mybatis
- K-means聚类算法
- IplImage和cv::Mat的转化
- 线段树ADT
- hdu 4821
- jQuery 模块拖动,拖动层效果
- 初探C++ 深拷贝与浅拷贝
- 震荡波病毒C语言源码
- Ext.Window及其相关组件
- poj 2154 Color 欧拉函数优化的ploya计数