算法优缺点:

优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
使用数据类型:数值型数据

算法思想

k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。

1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好。另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚类你可能就会考虑分成三类(L,M,S)等

2.然后我们需要选择最初的聚类点(或者叫质心),这里的选择一般是随机选择的,代码中的是在数据范围内随机选择,另一种是随机选择数据中的点。这些点的选择会很大程度上影响到最终的结果,也就是说运气不好的话就到局部最小值去了。而且该算法对非球状簇的分类比较差。这里有两种处理方法,一种是多次取均值,另一种则是后面的改进算法(bisecting K-means)

3.终于我们开始进入正题了,接下来我们会把数据集中所有的点都计算下与这些质心的距离,把它们分到离它们质心最近的那一类中去。完成后我们则需要将每个簇算出平均值,用这个点作为新的质心。反复重复这两步,直到收敛我们就得到了最终的结果。

函数

loadDataSet(fileName)
从文件中读取数据集
distEclud(vecA, vecB)
计算距离,这里用的是欧氏距离,当然其他合理的距离都是可以的
randCent(dataSet, k)
随机生成初始的质心,这里是虽具选取数据范围内的点
kMeans(dataSet, k, distMeas=distEclud, createCent=randCent)
kmeans算法,输入数据和k值。后面两个事可选的距离计算方式和初始质心的选择方式
show(dataSet, k, centroids, clusterAssment)
可视化结果

#coding=utf-8
from numpy import * def loadDataSet(fileName):
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
fltLine = map(float, curLine)
dataMat.append(fltLine)
return dataMat #计算两个向量的距离,用的是欧几里得距离
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #随机生成初始的质心(ng的课说的初始方式是随机选K个点)
def randCent(dataSet, k):
n = shape(dataSet)[1]
centroids = mat(zeros((k,n)))
for j in range(n):
minJ = min(dataSet[:,j])
rangeJ = float(max(array(dataSet)[:,j]) - minJ)
centroids[:,j] = minJ + rangeJ * random.rand(k,1)
return centroids def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0]
clusterAssment = mat(zeros((m,2)))#create mat to assign data points
#to a centroid, also holds SE of each point
centroids = createCent(dataSet, k)
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m):#for each data point assign it to the closest centroid
minDist = inf
minIndex = -1
for j in range(k):
distJI = distMeas(centroids[j,:],dataSet[i,:])
if distJI < minDist:
minDist = distJI; minIndex = j
if clusterAssment[i,0] != minIndex:
clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2
print centroids
for cent in range(k):#recalculate centroids
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster
centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean
return centroids, clusterAssment def show(dataSet, k, centroids, clusterAssment):
from matplotlib import pyplot as plt
numSamples, dim = dataSet.shape
mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
for i in xrange(numSamples):
markIndex = int(clusterAssment[i, 0])
plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])
mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
for i in range(k):
plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12)
plt.show() def main():
dataMat = mat(loadDataSet('testSet.txt'))
myCentroids, clustAssing= kMeans(dataMat,4)
print myCentroids
show(dataMat, 4, myCentroids, clustAssing) if __name__ == '__main__':
main()

参考链接:http://www.cnblogs.com/MrLJC/p/4127553.html

最新文章

  1. 阿里云slb和ucloud负载均衡ulb添加ssl证书将http服务https化的配置详解
  2. PHPCMS系统使用的弹出窗口插件artDialog
  3. asp.net web api [FromBody]参数
  4. 华为HG8240光猫-破解-联通-2016-telnet-http
  5. Mac电脑手动清理
  6. 解决CENTOS7虚拟机更改静态IP无法启动
  7. displaytag 添加超链接
  8. Windows下搭建deepnet环境
  9. SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF
  10. canvas浅谈 实现简单的自旋转下落
  11. jquery 图片自动无缝滚动
  12. 【转】解决Android 6.0 NoSuchContextException 和WEBVIEW_undefined 的问题
  13. 使用Rancher的RKE快速部署Kubernetes集群
  14. Cookie的存储、获取、删除操作
  15. ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper create failed after 4 attempts
  16. MongoDB基础之 安装
  17. application/json 与 application/x-www-form-urlencoded的简单比较
  18. 20155314 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践
  19. 《Spring1之第十次站立会议》
  20. luogu P2992 [USACO10OPEN]三角形计数Triangle Counting

热门文章

  1. 蓝牙bluez学习(1) Stack Architecture
  2. 交互式数据可视化-D3.js(四)形状生成器
  3. 在不使用ssr的情况下解决Vue单页面SEO问题
  4. 一直被用错的6种SQL 错误用法
  5. python 以及 pywin32添加注册表
  6. springMVC model传对象数组 jq 获取
  7. CF 977 F. Consecutive Subsequence
  8. 异常 Failed to bind NettyServer on /10.133.7.216:29105, cause: Failed to bind to: /0.0.0.0:29105
  9. Android渐变GradientDrawable叠加组合环ring
  10. asp.net 页面缓存、数据缓存