python机器学习实战之K均值聚类


Posted in Python onDecember 20, 2017

本文实例为大家分享了python K均值聚类的具体代码,供大家参考,具体内容如下

#-*- coding:utf-8 -*- 
#!/usr/bin/python 
 
''''' 
k Means K均值聚类 
''' 
# 测试 
# K均值聚类   import kMeans as KM KM.kMeansTest() 
# 二分K均值聚类 import kMeans as KM KM.biKMeansTest() 
# 地理位置 二分K均值聚类 import kMeans as KM KM.clusterClubs() 
from numpy import * 
 
# 导入数据集 
def loadDataSet(fileName):   #  
  dataMat = []        #  
  fr = open(fileName) 
  for line in fr.readlines(): # 每一行 
    curLine = line.strip().split('\t')# 按 Tab键 分割成 列表 
    fltLine = map(float,curLine)   # 映射成 浮点型 
    dataMat.append(fltLine)      # 放入数据集里 
  return dataMat 
 
# 计算欧几里的距离 
def distEclud(vecA, vecB): 
  return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB) 
 
# 初始构建质心(随机) 数据集 质心个数 
def randCent(dataSet, k): 
  n = shape(dataSet)[1] # 样本特征维度 
  centroids = mat(zeros((k,n))) # 初始化 k个 质心 
  for j in range(n):  # 每种样本特征 
    minJ = min(dataSet[:,j]) # 每种样本特征最小值 需要转换成 numpy 的mat 
    rangeJ = float(max(dataSet[:,j]) - minJ)#每种样本特征的幅值范围 
    centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1)) 
    # 在每种样本的最大值和最小值间随机生成K个样本特征值 
  return centroids 
 
# 简单k均值聚类算法  
#    数据集 中心数量  距离算法      初始聚类中心算法  
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): 
  m = shape(dataSet)[0]       # 样本个数 
  clusterAssment = mat(zeros((m,2)))# 样本标记 分配结果 第一列索引 第二列误差 
  centroids = createCent(dataSet, k)# 初始聚类中心 
  clusterChanged = True# 设置质心是否仍然发送变化 
  while clusterChanged: 
    clusterChanged = False 
    for i in range(m): #对每个样本 计算最近的中心 
    # 更新 样本所属关系 
      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 # 保存 所属索引 以及距离平方 用以计算误差平方和 SSE 
    # 更新质心 
    print centroids # 每次迭代打印质心 
    for cent in range(k):#  
      ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]# 数组过滤 得到各个中心所属的样本 
      centroids[cent,:] = mean(ptsInClust, axis=0) # 按列求平均 得到新的中心 
  return centroids, clusterAssment# 返回质心 和各个样本分配结果 
 
def kMeansTest(k=5): 
  MyDatMat = mat(loadDataSet("testSet.txt")) 
  MyCenters, ClustAssing = kMeans(MyDatMat, k) 
 
# bisecting K-means 二分K均值算法 克服局部最优值 
def biKmeans(dataSet, k, distMeas=distEclud): 
  m = shape(dataSet)[0]       # 样本个数 
  clusterAssment = mat(zeros((m,2)))# 样本标记 分配结果 第一列索引 第二列误差 
  centroid0 = mean(dataSet, axis=0).tolist()[0]# 创建一个初始质心 
  centList =[centroid0] # 一个中心的 列表 
  for j in range(m):  # 计算初始误差 
    clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2#每个样本与中心的距离平方 
  while (len(centList) < k):# 中心数俩个未达到指定中心数量 继续迭代 
    lowestSSE = inf    # 最小的 误差平方和 SSE 
    for i in range(len(centList)):# 对于每一个中心 
      ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:] # 处于当前中心的样本点 
      centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas) # 对此中心内的点进行二分类 
      # 该样本中心 二分类之后的 误差平方和 SSE 
    sseSplit = sum(splitClustAss[:,1]) 
      # 其他未划分数据集的误差平方和 SSE 
      sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1]) 
      print "sseSplit, and notSplit: ",sseSplit,sseNotSplit 
      # 划分后的误差和没有进行划分的数据集的误差为本次误差 
      if (sseSplit + sseNotSplit) < lowestSSE: # 小于上次 的 误差  
        bestCentToSplit = i # 记录应该被划分的中心 的索引 
        bestNewCents = centroidMat # 最好的新划分出来的中心 
        bestClustAss = splitClustAss.copy()# 新中心 对于的 划分记录 索引(0或1)以及 误差平方 
        lowestSSE = sseSplit + sseNotSplit # 更新总的 误差平方和 
    # 记录中心 划分 数据 
    bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList) # 现有中心数量 
    bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit# 最应该被划分的中心 
    print 'the bestCentToSplit is: ',bestCentToSplit 
    print 'the len of bestClustAss is: ', len(bestClustAss) 
    # 将最应该被划分的中心 替换为 划分后的 两个 中心(一个替换,另一个 append在最后添加) 
    centList[bestCentToSplit] = bestNewCents[0,:].tolist()[0]# 替换 
    centList.append(bestNewCents[1,:].tolist()[0])      # 添加 
    # 更新 样本标记 分配结果 替换 被划分中心的记录 
    clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:]= bestClustAss 
  return mat(centList), clusterAssment 
 
def biKMeansTest(k=5): 
  MyDatMat = mat(loadDataSet("testSet.txt")) 
  MyCenters, ClustAssing = biKmeans(MyDatMat, k) 
 
####位置数据聚类测试##### 
# 利用雅虎的服务器将地址转换为 经度和纬度 
import urllib 
import json 
def geoGrab(stAddress, city): 
  apiStem = 'http://where.yahooapis.com/geocode?' #  
  params = {} 
  params['flags'] = 'J'    # 设置返回类型为JSON字符串  
  params['appid'] = 'aaa0VN6k' # 注册 帐号后获得 http://developer.yahoo.com 
  params['location'] = '%s %s' % (stAddress, city) # 位置信息 
  url_params = urllib.urlencode(params)# 将字典转换成可以通过URL进行传递的字符串格式 
  yahooApi = apiStem + url_params   # 加入网络地址  
  print yahooApi            # 打印 URL 
  c=urllib.urlopen(yahooApi)      # 打开 URL 
  return json.loads(c.read())     # 读取返回的jason字符串  对位置进行了编码 得到经度和纬度  
 
 
from time import sleep 
def massPlaceFind(fileName): 
  fw = open('places.txt', 'w') # 打开位置信息文件 
  for line in open(fileName).readlines():# 每一行 
    line = line.strip() 
    lineArr = line.split('\t')# 得到列表 
    retDict = geoGrab(lineArr[1], lineArr[2])# 第二列为号牌 第三列为城市 进行地址解码 
    if retDict['ResultSet']['Error'] == 0: 
      lat = float(retDict['ResultSet']['Results'][0]['latitude']) #经度 
      lng = float(retDict['ResultSet']['Results'][0]['longitude'])#纬度 
      print "%s\t%f\t%f" % (lineArr[0], lat, lng) 
      fw.write('%s\t%f\t%f\n' % (line, lat, lng)) #再写入到文件 
    else: print "error fetching" 
    sleep(1)#延迟1s 
  fw.close() 
 
# 返回地球表面两点之间的距离 单位英里 输入经纬度(度) 球面余弦定理 
def distSLC(vecA, vecB):#Spherical Law of Cosines 
  a = sin(vecA[0,1]*pi/180) * sin(vecB[0,1]*pi/180) 
  b = cos(vecA[0,1]*pi/180) * cos(vecB[0,1]*pi/180) * \ 
           cos(pi * (vecB[0,0]-vecA[0,0]) /180) 
  return arccos(a + b)*6371.0 #pi in numpy 
 
 
# 位置聚类测试 画图可视化显示 
import matplotlib 
import matplotlib.pyplot as plt 
 
def clusterClubs(numClust=5): 
  datList = [] # 样本 
  for line in open('places.txt').readlines(): 
    lineArr = line.split('\t') 
    datList.append([float(lineArr[4]), float(lineArr[3])])# 保存经纬度 
  datMat = mat(datList)# 数据集 numpy的mat类型 
  # 进行二分K均值算法聚类 
  myCentroids, clustAssing = biKmeans(datMat, numClust, distMeas=distSLC) 
  fig = plt.figure()# 窗口 
  rect=[0.1,0.1,0.8,0.8] 
  scatterMarkers=['s', 'o', '^', '8', 'p', \ 
          'd', 'v', 'h', '>', '<'] 
  axprops = dict(xticks=[], yticks=[]) 
  ax0=fig.add_axes(rect, label='ax0', **axprops)#轴 
  imgP = plt.imread('Portland.png') # 标注在实际的图片上 
  ax0.imshow(imgP) 
  ax1=fig.add_axes(rect, label='ax1', frameon=False) 
  for i in range(numClust):#每一个中心 
    ptsInCurrCluster = datMat[nonzero(clustAssing[:,0].A==i)[0],:]# 属于每个中心的样本点 
    markerStyle = scatterMarkers[i % len(scatterMarkers)]# 点的类型 画图 
    # 散点图 每个中心的样本点 
    ax1.scatter(ptsInCurrCluster[:,0].flatten().A[0], ptsInCurrCluster[:,1].flatten().A[0], marker=markerStyle, s=90) 
  # 散 点图 每个中心 
  ax1.scatter(myCentroids[:,0].flatten().A[0], myCentroids[:,1].flatten().A[0], marker='+', s=300) 
plt.show()# 显示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 实现堆排序算法代码
Jun 05 Python
python实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
python抽取指定url页面的title方法
May 11 Python
Python错误处理操作示例
Jul 18 Python
python3 读取Excel表格中的数据
Oct 16 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
Anaconda安装pytorch及配置PyCharm 2021环境
Jun 04 Python
Python时间操作之pytz模块使用详解
Jun 14 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 #Python
python机器学习实战之最近邻kNN分类器
Dec 20 #Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 #Python
浅谈Python实现Apriori算法介绍
Dec 20 #Python
利用Python如何生成hash值示例详解
Dec 20 #Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 #Python
python实现神经网络感知器算法
Dec 20 #Python
You might like
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
php学习 字符串课件
2008/06/15 PHP
ini_set的用法介绍
2014/01/07 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
用jquery来定位
2007/02/20 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
js+css实现红包雨效果
2018/07/12 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
python中异常报错处理方法汇总
2016/11/20 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
设置python3为默认python的方法
2018/10/31 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
Python 多进程、多线程效率对比
2020/11/19 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
2014年环卫工作总结
2014/11/22 职场文书
解除处分决定书
2015/06/25 职场文书
校运会加油稿大全
2015/07/22 职场文书
mysql 子查询的使用
2022/04/28 MySQL
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL