聚类分析概念

聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术。聚类分析也叫分类分析,或者数值分类。聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或者相似度将其划分成若干个组,划分的原则是组内距离最小化而组间(外部)距离最大化。聚类和分类的不同在于:聚类所要求划分的类是未知的。

距离量度

不同的距离量度会对距离的结果产生影响,常见的距离量度如下所示:

聚类研究分析的方法

1.层次的方法(hierarchical  method)2.划分方法(partitioning method)3.基于密度的方法(density-based method)DBSCAN4.基于网格的方法(grid-based method)5.基于模型的方法(model-based method)

K-means算法

K-means算法是经典的聚类分析划分方法之一。其优缺点如下:

优点:
原理简单
速度快
对大数据集有比较好的伸缩性缺点:
需要指定聚类 数量K
对异常值敏感
对初始值敏感

受离群点的影响较大,由于其迭代每次的中心点到全部样本点的距离和的平均值。
以欧式距离来衡量距离大小,使用误差平方和(Sum of the Squared Error,SSE)作为聚类的目标函数:

k表示k个聚类中心,ci表示第几个中心,dist表示的是欧几里得距离。该公式表示求每个点到自己所属聚类中心的距离之和。即先把每个点到自己聚类中心的距离求出来,然后将所有距离相加。要让SSE最小,需每个点到自己聚类中心的距离最短。

由上可以看出,簇的最佳质心是簇中各点的均值。

K-means算法思想如下:

任选k个初始点作为质心
repeat  :数据集中每一个数据点每一个初始质心计算数据点与质心的距离将数据点分配到距离最近的簇对每个簇计算簇的均值,将均值作为簇的新的质心
until:任一数据点的簇分配结果没有发生改变,或者达到最大迭代次数

具体实现代码如下:
(光看代码没用,可将下面代码直接copy到IDE中跑下,看看效果。也可通过IDE单步运行功能看看程序的具体的走向)

#-*- coding: utf-8 -*-
#python实现聚类
#import numpy as np
from numpy import *#加载数据集
def loadDataSet(fileName):dataMat = []fr = open(fileName)for line in fr.readlines():"""strip()将line行开头和结尾的空白符号删掉。split('\t') 函数以‘\t’为切分符号对每行切分split函数返回的结果是一个列表,赋值给curLine """curLine = line.strip().split('\t')"""#map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。"""fltLine = map(float, curLine)dataMat.append(fltLine)return dataMat#计算欧式距离的函数
def countDist(vecA,vecB):return sqrt(sum(power(vecA-vecB,2)))#测试countDist
# vecA,vecB = np.array([1,2]),np.array([3,4])
# x = countDist(vecA,vecB)
# print(x)#随机设置k个质心
def randCent(dataSet,k):n = shape(dataSet)[1]#初始化一个k行n列的二维数组,数组初始值全部为0,然后用mat函数将其转化为矩阵centroids = mat(zeros([k,n]))for j in range(n):minj = min(dataSet[:,j])rangej = float(max(dataSet[:,j])-minj)centroids[:, j] = mat(minj + rangej * random.rand(k, 1))return centroids#k-Means算法核心部分
def kMeans(dataSet, k, distMeas=countDist, createCent=randCent):#将函数distEclud和randCent作为参数传进来,可以更好的封装kMeans函数m = shape(dataSet)[0] """ clusterAssment是一个m行2列的矩阵,第一列存放每个样本所属聚类中心的下标,第二列存放该样本与该聚类中心的距离"""clusterAssment = mat(zeros((m,2)))centroids = createCent(dataSet, k)clusterChanged = Truewhile clusterChanged:clusterChanged = False#下面两个for循环计算每一个样本到每一个聚类中心的距离for i in range(m):   #遍历样本minDist = inf     #inf表示无穷大,-inf表示负无穷minIndex = -1for j in range(k): #遍历聚类中心distJI = distMeas(centroids[j,:],dataSet[i,:])if distJI < minDist:minDist = distJI; minIndex = jif clusterAssment[i,0] != minIndex:clusterChanged = TrueclusterAssment[i,:] = minIndex,minDist**2print(centroids)for cent in range(k):     #重新计算聚类中心,cent从0遍历到kptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]  #nonzero函数:返回不为0元素的行列下标组成的元组"""  #clusterAssment[:,0]:取得clusterAssment中第0列元素。#clusterAssment[:,0].A:转置成一个1行m列的行矩阵#clusterAssment[:,0].A==cent :将行矩阵中每一个元素与cent进行比较,得到一个1行m列、元素取值为True和false的矩阵,元素为true表示该样本是第cent个聚类中心的点#nonzero(clusterAssment[:,0].A==cent)[0]:获得元素值为True的元素下标,这些下标集合即为所有属于cent类的样 本下标#整句含义:取得数据集中属于第cent个簇的样本集"""centroids[cent,:] = mean(ptsInClust, axis=0)return centroids, clusterAssment#显示结果
def show(dataSet, k, centroids, clusterAssment):from matplotlib import pyplot as pltnumSamples, dim = dataSet.shape  #dataSet.shape返回两个值,分别赋给numSamples和dimmark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']  #样本集的显#示样式for i in range(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'))  #加载数据集。若没有源数据,可用下面两句随机生成数据dataMat = random.rand(100,2) #随机生成100行2列的数据dataMat = mat(dataMat)myCentroids, clustAssing = kMeans(dataMat,4)print(myCentroids)show(dataMat, 4, myCentroids, clustAssing)if __name__ == '__main__':""" python代码按照顺序从头到尾执行,不执行def开头的函数,def函数只有被调用时才执行。本句意思是:判断正在执行的程序是否有主函数,若有,则不执行下面这行语句;若没有,则调用main函数"""main()

参考:
k-means聚类算法python实现
数据挖掘-聚类分析(Python实现K-Means算法)

聚类分析原理(及Python实现K-means代码详解)相关推荐

  1. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  2. python画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  3. python实现二分查找代码+详解

    python实现二分查找代码+详解 一.规定函数值 函数输入值 li=[1,2,3,4,5,6,7,8,9]#输入的集合 val=4#要查找的值 函数内部值 left=0#代表集合中第一个值的位置 r ...

  4. 曲率高斯滤波去噪python实现(附代码详解)

    曲率高斯滤波去噪python实现(附代码详解) 曲率滤波的理论基础可以参考下曲率滤波的理论基础和应用,这篇博客介绍的思想完美的避开了一大堆数学公式,简直是我的福音,但还是要细看的,不然很容易忽略重点, ...

  5. Python爬虫实现--微博模拟登陆--涉及到的知识点,python包,实现代码详解。

    之前写过一篇关于爬虫的文章,其中提到了用python requests包请求网页,并用beautifulsoup解析. https://blog.csdn.net/qq_40589051/articl ...

  6. 独家总结 | KNN算法Python实现(附代码详解及注释)

    ↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍KNN算法的基本原理,这篇就不再赘述(公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践 ...

  7. 独家总结 | 决策树算法Python实现(附代码详解及注释)

    ↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍过决策树基本原理机器学习经典算法决策树原理详解(简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践才是王道,今天小编就附上小编自己在学习 ...

  8. python提取excel数据-代码详解:使用Python从不同表格中提取数据

    常用的表格数据存储文件格式--CSV,Microsoft Excel,Google Excel . Python通常称为粘合语言.这个名称归因于人们逐渐开发出的大量接口库和特征,也得益于广泛的使用和良 ...

  9. linux下运行python unitest_Python单元测试unittest代码详解

    前言 编写函数或者类时,还可以为其编写测试.通过测试,可确定代码面对各种输入都能够按要求的那样工作.本次我将介绍如何使用Python模块unittest中的工具来测试代码. 测试函数 首先我们先编写一 ...

  10. python爬取地图上的经纬度_使用高德开放平台api批量爬取所需经纬度及位置信息(平台教程和python多进程、多线程代码详解)...

    2019.3.20更新(将代码升级为非阻塞式多进程,效率极大提升) 2019.6.28更新 (将代码模块化,复用性更强,使用更高效的线程池进行爬取) 之前写爬虫对链家某地区全部二手房信息进行了获取并存 ...

最新文章

  1. ICLR2020 | StructBERT : 融合语言结构的BERT模型
  2. linux su、su -和sudo的区别
  3. 选化学可否报计算机专业,选课选物化生报什么专业前景好
  4. js中的全局变量和局部变量
  5. gis如何加入emf图片_当GIS运用于建筑遗产保护
  6. [Java基础]抽象类和接口名作为形参和返回值
  7. python语言输入两个数_python的函数输入两个参数吗
  8. java JVM剖析
  9. Jasmine基础API
  10. 图片无损放大软件Topaz Gigapixel AI for Mac
  11. WindowsXP相关设置对应的注册表位置
  12. S7-200SMART与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)
  13. oracle数据库year函数怎么用,数据库 year函数
  14. catia曲面扫掠命令详解_4.3.3.15-扫掠曲面之二次曲线_两条引导线扫略
  15. Zookeeper介绍、原理及应用
  16. Reactor模式详解及 三种模式演变
  17. 微信小程序+.NET(六) 科大讯飞语音接口-tts语音生成
  18. HDMI 数据包简析
  19. 25岁前必读的25本书
  20. 上海云计算课程——上海市信息技术培训中心云计算工程师课程 云安全 云平台 云计算技术 云计算概念

热门文章

  1. 计算字符串的相似度-两种解法
  2. SpringMVC环境搭建——HelloWorld
  3. 全球网速最快的地方在哪里?中国固定宽带网速增长超美国!
  4. Django__WSGI
  5. 《UNIX网络编程 卷1:套接字联网API(第3版)》——8.2 recvfrom和sendto函数
  6. 信息安全系统设计基础_exp3
  7. erlang学习笔记3 gen_event
  8. java 基础--类与对象的创建,引用,static静态方法的创建与使用,static变量
  9. 清理数据_Python数据清理终极指南(2020版)
  10. python安装request方法mac_Mac下python3使用requests库出现No module named 'requests'解决方法...