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

本文实例为大家分享了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()# 显示

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

时间: 2017-12-18

python机器学习之神经网络(三)

前面两篇文章都是参考书本神经网络的原理,一步步写的代码,这篇博文里主要学习了如何使用neurolab库中的函数来实现神经网络的算法. 首先介绍一下neurolab库的配置: 选择你所需要的版本进行下载,下载完成后解压. neurolab需要采用python安装第三方软件包的方式进行安装,这里介绍一种安装方式: (1)进入cmd窗口 (2)进入解压文件所在目录下 (3)输入 setup.py install 这样,在python安装目录的Python27\Lib\site-packages下,就可

python机器学习实战之树回归详解

本文实例为大家分享了树回归的具体代码,供大家参考,具体内容如下 #-*- coding:utf-8 -*- #!/usr/bin/python ''''' 回归树 连续值回归预测 的 回归树 ''' # 测试代码 # import regTrees as RT RT.RtTreeTest() RT.RtTreeTest('ex0.txt') RT.RtTreeTest('ex2.txt') # import regTrees as RT RT.RtTreeTest('ex2.txt',ops=(

Python机器学习之决策树算法实例详解

本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树.决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,机器学习算法最终将使用这些从数据集中创造的规则.决策树的优点为:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据.缺点为:可能产生过度匹配的问题.决策树适于处理离散型和连续型的数据. 在决策树中最重要的就是如何选取

机器学习的框架偏向于Python的13个原因

13个机器学习的框架偏向于Python的原因,供大家参考,具体内容如下 前言 主要有以下原因: 1. Python是解释语言,程序写起来非常方便 写程序方便对做机器学习的人很重要. 因为经常需要对模型进行各种各样的修改,这在编译语言里很可能是牵一发而动全身的事情,Python里通常可以用很少的时间实现. 举例来说,在C等编译语言里写一个矩阵乘法,需要自己分配操作数(矩阵)的内存.分配结果的内存.手动对BLAS接口调用gemm.最后如果没用smart pointer还得手动回收内存空间.Pytho

python机器学习之决策树分类详解

决策树分类与上一篇博客k近邻分类的最大的区别就在于,k近邻是没有训练过程的,而决策树是通过对训练数据进行分析,从而构造决策树,通过决策树来对测试数据进行分类,同样是属于监督学习的范畴.决策树的结果类似如下图: 图中方形方框代表叶节点,带圆边的方框代表决策节点,决策节点与叶节点的不同之处就是决策节点还需要通过判断该节点的状态来进一步分类. 那么如何通过训练数据来得到这样的决策树呢? 这里涉及要信息论中一个很重要的信息度量方式,香农熵.通过香农熵可以计算信息增益. 香农熵的计算公式如下: p(xi)

python机器学习之神经网络(一)

python有专门的神经网络库,但为了加深印象,我自己在numpy库的基础上,自己编写了一个简单的神经网络程序,是基于Rosenblatt感知器的,这个感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入求和后进行调节.为了便于观察,这里的数据采用二维数据. 目标函数是训练结果的误差的平方和,由于目标函数是一个二次函数,只存在一个全局极小值,所以采用梯度下降法的策略寻找目标函数的最小值. 代码如下: import numpy

python机器学习实战之最近邻kNN分类器

K近邻法是有监督学习方法,原理很简单,假设我们有一堆分好类的样本数据,分好类表示每个样本都一个对应的已知类标签,当来一个测试样本要我们判断它的类别是, 就分别计算到每个样本的距离,然后选取离测试样本最近的前K个样本的标签累计投票, 得票数最多的那个标签就为测试样本的标签. 源代码详解: #-*- coding:utf-8 -*- #!/usr/bin/python # 测试代码 约会数据分类 import KNN KNN.datingClassTest1() 标签为字符串 KNN.datingC

python机器学习之神经网络(二)

由于Rosenblatt感知器的局限性,对于非线性分类的效果不理想.为了对线性分类无法区分的数据进行分类,需要构建多层感知器结构对数据进行分类,多层感知器结构如下: 该网络由输入层,隐藏层,和输出层构成,能表示种类繁多的非线性曲面,每一个隐藏层都有一个激活函数,将该单元的输入数据与权值相乘后得到的值(即诱导局部域)经过激活函数,激活函数的输出值作为该单元的输出,激活函数类似与硬限幅函数,但硬限幅函数在阈值处是不可导的,而激活函数处处可导.本次程序中使用的激活函数是tanh函数,公式如下: tan

Python最火、R极具潜力 2017机器学习调查报告

数据平台 Kaggle 近日发布了 2017 机器学习及数据科学调查报告,这也是 Kaggle 首次进行全行业调查.调查共收到超过 16000 份回复,受访内容包括最受欢迎的编程语言.不同国家数据科学家的平均年龄.不同国家的平均年薪等. 下面主要看看工具使用方面的结果.请注意,该报告包含多个国家的数据,可能存在收集不够全面的情况,仅供参考. 年龄 从全球范围来看,本次调查对象的平均年龄在 30 岁左右.当然,各个国家的数值会有差异,中国的机器学习从业者年龄的中位数是 25 岁. 全球全职工作者为

python机器学习库常用汇总

汇总整理一套Python网页爬虫,文本处理,科学计算,机器学习和数据挖掘的兵器谱. 1. Python网页爬虫工具集 一个真实的项目,一定是从获取数据开始的.无论文本处理,机器学习和数据挖掘,都需要数据,除了通过一些渠道购买或者下载的专业数据外,常常需要大家自己动手爬数据,这个时候,爬虫就显得格外重要了,幸好,Python提供了一批很不错的网页爬虫工具框架,既能爬取数据,也能获取和清洗数据,也就从这里开始了: 1.1 Scrapy 鼎鼎大名的Scrapy,相信不少同学都有耳闻,课程图谱中的很多课

Python 机器学习库 NumPy入门教程

NumPy是一个Python语言的软件包,它非常适合于科学计算.在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础库. 本文是对它的一个入门教程. 介绍 NumPy是一个用于科技计算的基础软件包,它是Python语言实现的.它包含了: 强大的N维数组结构 精密复杂的函数 可集成到C/C++和Fortran代码的工具 线性代数,傅里叶变换以及随机数能力 除了科学计算的用途以外,NumPy也可被用作高效的通用数据的多维容器.由于它适用于任意类型的数据,这使得NumPy可以无缝和

Python机器学习库scikit-learn安装与基本使用教程

本文实例讲述了Python机器学习库scikit-learn安装与基本使用.分享给大家供大家参考,具体如下: 引言 scikit-learn是Python的一个开源机器学习模块,它建立在NumPy,SciPy和matplotlib模块之上能够为用户提供各种机器学习算法接口,可以让用户简单.高效地进行数据挖掘和数据分析. scikit-learn安装 python 中安装许多模板库之前都有依赖关系,安装 scikit-learn 之前需要以下先决条件: Python(>= 2.6 or >= 3

python机器学习库scikit-learn:SVR的基本应用

scikit-learn是python的第三方机器学习库,里面集成了大量机器学习的常用方法.例如:贝叶斯,svm,knn等. scikit-learn的官网 : http://scikit-learn.org/stable/index.html点击打开链接 SVR是支持向量回归(support vector regression)的英文缩写,是支持向量机(SVM)的重要的应用分支. scikit-learn中提供了基于libsvm的SVR解决方案. PS:libsvm是台湾大学林智仁教授等开发设

python机器学习库xgboost的使用

1.数据读取 利用原生xgboost库读取libsvm数据 import xgboost as xgb data = xgb.DMatrix(libsvm文件) 使用sklearn读取libsvm数据 from sklearn.datasets import load_svmlight_file X_train,y_train = load_svmlight_file(libsvm文件) 使用pandas读取完数据后在转化为标准形式 2.模型训练过程 1.未调参基线模型 使用xgboost原生库

Python 数据处理库 pandas 入门教程基本操作

pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有表现力的数据结构,目的是使"关系"或"标记"数据的工作既简单又直观.它旨在成为在Python中进行实际数据分析的高级构建块. 入门介绍 pandas适合于许多不同类型的数据,包括: 具有异构类型列的表格数据,例如SQL表格或Excel数据 有序和无序(不一定是固定频率)时间序列数据.

Python 数据处理库 pandas进阶教程

前言 本文紧接着前一篇的入门教程,会介绍一些关于pandas的进阶知识.建议读者在阅读本文之前先看完pandas入门教程. 同样的,本文的测试数据和源码可以在这里获取: Github:pandas_tutorial. 数据访问 在入门教程中,我们已经使用过访问数据的方法.这里我们再集中看一下. 注:这里的数据访问方法既适用于Series,也适用于DataFrame. 基础方法:[]和. 这是两种最直观的方法,任何有面向对象编程经验的人应该都很容易理解.下面是一个代码示例: # select_da

常用python爬虫库介绍与简要说明

这个列表包含与网页抓取和数据处理的Python库 python网络库 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络库(绑定libcurl). urllib3 – Python HTTP库,安全连接池.支持文件post.可用性高. httplib2 – 网络库. RoboBrowser – 一个简单的.极具Python风格的Python库,无需独立的浏览器即可浏览网页. MechanicalSoup

Python机器学习算法库scikit-learn学习之决策树实现方法详解

本文实例讲述了Python机器学习算法库scikit-learn学习之决策树实现方法.分享给大家供大家参考,具体如下: 决策树 决策树(DTs)是一种用于分类和回归的非参数监督学习方法.目标是创建一个模型,通过从数据特性中推导出简单的决策规则来预测目标变量的值. 例如,在下面的例子中,决策树通过一组if-then-else决策规则从数据中学习到近似正弦曲线的情况.树越深,决策规则越复杂,模型也越合适. 决策树的一些优势是: 便于说明和理解,树可以可视化表达: 需要很少的数据准备.其他技术通常需要

Python机器学习之scikit-learn库中KNN算法的封装与使用方法

本文实例讲述了Python机器学习之scikit-learn库中KNN算法的封装与使用方法.分享给大家供大家参考,具体如下: 1.工具准备,python环境,pycharm 2.在机器学习中,KNN是不需要训练过程的算法,也就是说,输入样例可以直接调用predict预测结果,训练数据集就是模型.当然这里必须将训练数据和训练标签进行拟合才能形成模型. 3.在pycharm中创建新的项目工程,并在项目下新建KNN.py文件. import numpy as np from math import s