【深度学习】一维数组的聚类

news/2024/5/20 9:42:00 标签: 深度学习, 聚类, 人工智能

在学习聚类算法的过程中,学习到的聚类算法大部分都是针对n维的,针对一维数据的聚类方式较少,今天就来学习下如何给一维的数据进行聚类

方案一:采用K-Means对一维数据聚类

Python代码如下:

  
  
  1. from sklearn.cluster import KMeans
  2. import numpy as np
  3. x = np.random.random(10000)
  4. y = x.reshape(-1,1)
  5. km = KMeans()
  6. km.fit(y)

核心的操作是y = x.reshape(-1,1),含义为将一维数据变成只有1列,行数不知道多少(-1代表根据剩下的维度计算出数组的另外一个shape属性值)。

方案二:采用一维聚类方法Jenks Natural Breaks

Jenks Natural Breaks(自然断点分类)。一般来说,分类的原则就是差不多的放在一起,分成若干类。统计上可以用方差来衡量,通过计算每类的方差,再计算这些方差之和,用方差和的大小来比较分类的好坏。因而需要计算各种分类的方差和,其值最小的就是最优的分类结果(但并不唯一)。这也是自然断点分类法的原理。另外,当你去看数据的分布时,可以比较明显的发现断裂之处,这些断裂之处和Jenks Natural Breaks方法算出来也是一致的。因而这种分类法很“自然”。

Jenks Natural Breaks和K Means在一维数据时,完全等价。它们的目标函数一样,但是算法的步骤不完全相同。K Means是先设定好K个初始随机点。而Jenks Breaks则是用遍历的方法,一个点一个点地移动,直到达到最小值。

Natural Breaks算法又有两种:

  • Jenks-Caspall algorithm(1971),是Jenks和Caspall发明的算法。原理就如前所述,实现的时候要将每种分类情况都计算一遍,找到方差和最小的那一种,计算量极大。n个数分成k类,就要从n-1个数中找k-1个组合,这个数目是很惊人的。数据量较大时,如果分类又多,以当时的计算机水平根本不能穷举各种可能性。
  • Fisher-Jenks algorithm(1977),Fisher(1958)发明了一种算法提高计算效率,不需要进行穷举。Jenks将这种方法引入到数据分类中。但后来者几乎只知道Jenks而不知Fisher了。

具体算法实现:

  • Jenks-Caspall algorithm:https://github.com/domlysz/Jenks-Caspall.py
  • Fisher-Jenks algorithm:https://github.com/mthh/jenkspy

和K-Means一样,使用Jenks Natural Breaks需要先确定聚类数量K值。常见的方法是:GVF(The Goodness of Variance Fit)。GVF,翻译过来是“方差拟合优度”,公式如下:

一维数组的<a class=聚类-图片1" width="442" height="298" />

其中,SDAM是the Sum of squared Deviations from the Array Mean,即原始数据的方差;SDCM是the Sum of squared Deviations about Class Mean,即每一类方差的和。显然,SDAM是一个常数,而SDCM与分类数k有关。一定范围内,GVF越大,分类效果越好。SDCM越小,GVF越大,越接近于1。而SDCM随k的增大而大,当k等于n时,SDMC=0,GVF=1。

GVF用于判定不同分类数的分类效果好坏。以k和GVF做图可得:

一维数组的<a class=聚类-图片2" width="544" height="524" />

随着k的增大,GVF曲线变得越来越平缓。特别是在红线处(k=5),曲线变得基本平坦(之前起伏较大,之后起伏较小),k(5)也不是很大,所以可以分为5类。一般来说,GVF>0.7就可以接受了,当然越高越好,但一定要考虑k不能太大。显然,这是一个经验公式,但总比没有好吧。

代码示例:

  
  
  1. from jenkspy import jenks_breaks
  2. import numpy as np
  3.  
  4.  
  5. def goodness_of_variance_fit(array, classes):
  6.     # get the break points
  7.     classes = jenks_breaks(array, classes)
  8.  
  9.     # do the actual classification
  10.     classified = np.array([classify(i, classes) for i in array])
  11.  
  12.     # max value of zones
  13.     maxz = max(classified)
  14.  
  15.     # nested list of zone indices
  16.     zone_indices = [[idx for idx, val in enumerate(classified) if zone + 1 val] for zone in range(maxz)]
  17.  
  18.     # sum of squared deviations from array mean
  19.     sdam = np.sum((array - array.mean()) 2)
  20.  
  21.     # sorted polygon stats
  22.     array_sort = [np.array([array[index] for index in zone]) for zone in zone_indices]
  23.  
  24.     # sum of squared deviations of class means
  25.     sdcm = sum([np.sum((classified - classified.mean()) 2) for classified in array_sort])
  26.  
  27.     # goodness of variance fit
  28.     gvf = (sdam - sdcm) / sdam
  29.  
  30.     return gvf
  31.  
  32.  
  33. def classify(value, breaks):
  34.     for i in range(1, len(breaks)):
  35.         if value < breaks[i]:
  36.             return i
  37.     return len(breaks) - 1
  38.  
  39.  
  40. if name main:
  41.     gvf = 0.0
  42.     nclasses = 2
  43.     array = np.random.random(10000)
  44.     while gvf < .8:
  45.         gvf = goodness_of_variance_fit(array, nclasses)
  46.         print(nclasses, gvf)
  47.         nclasses += 1

参考链接:

  • https://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization
  • https://macwright.org/2013/02/18/literate-jenks.html

方案三:核密度估计Kernel Density Estimation

所谓核密度估计,就是采用平滑的峰值函数(“核”)来拟合观察到的数据点,从而对真实的概率分布曲线进行模拟。核密度估计更多详细内容,可以参考先前的Mean Shift聚类中的相关说明。

使用示例:

  
  
  1. import numpy as np
  2. from scipy.signal import argrelextrema
  3. import matplotlib.pyplot as plt
  4. from sklearn.neighbors.kde import KernelDensity
  5.  
  6. a = np.array([10, 11, 9, 23, 21, 11, 45, 20, 11, 12]).reshape(-1, 1)
  7. kde = KernelDensity(kernel=‘gaussian’, bandwidth=3).fit(a)
  8. s = np.linspace(0, 50)
  9. e = kde.score_samples(s.reshape(-1, 1))
  10. plt.plot(s, e)
  11. plt.show()
  12.  
  13. mi, ma = argrelextrema(e, np.less)[0], argrelextrema(e, np.greater)[0]
  14. print(“Minima:”, s[mi])
  15. print(“Maxima:”, s[ma])
  16. print(a[a < mi[0]], a[(a >= mi[0]) * (a <= mi[1])], a[a >= mi[1]])
  17.  
  18. plt.plot(s[:mi[0] + 1], e[:mi[0] + 1], ‘r’,
  19.          s[mi[0]:mi[1] + 1], e[mi[0]:mi[1] + 1], ‘g’,
  20.          s[mi[1]:], e[mi[1]:], ‘b’,
  21.          s[ma], e[ma], ‘go’,
  22.          s[mi], e[mi], ‘ro’)
  23. plt.show()

输出内容:

  
  
  1. Minima: [17.34693878 33.67346939]
  2. Maxima: [10.20408163 21.42857143 44.89795918]
  3. [10 11  9 11 11 12] [23 21 20] [45]

一维数组的<a class=聚类-图片3" width="380" height="256" />

一维数组的<a class=聚类-图片4" width="380" height="256" />

参考链接:

  • https://en.wikipedia.org/wiki/Kernel_density_estimation
  • http://scikit-learn.org/stable/auto_examples/neighbors/plot_kde_1d.html
  • https://jakevdp.github.io/blog/2013/12/01/kernel-density-estimation/


http://www.niftyadmin.cn/n/5249053.html

相关文章

VueUse工具库

VueUse VueUse不是Vue.use&#xff0c;它是为Vue 2和3服务的一套Vue Composition API的常用工具集&#xff0c;是目前世界上Star最高的同类型库之一。它的初衷就是将一切原本并不支持响应式的JS API变得支持响应式&#xff0c;省去程序员自己写相关代码。 VueUse 是一个基于 …

Java项目开发,业务比较复杂如何减少bug

Java项目开发&#xff0c;业务比较复杂如何减少bug 当Java开发工作涉及复杂业务时&#xff0c;可以采取以下方法来减少bug的数量&#xff1a; 1、深入了解业务需求 充分了解业务需求&#xff0c;与业务人员进行充分的沟通和交流&#xff0c;确保对需求的理解正确。在需求分析…

整数以及浮点数在内存中的存储

一.整数在内存当中的存储 数据在内存中是以十六进制补码的形式进行存储的。 原码表示法简单易懂&#xff0c;适用于乘法&#xff0c;但用原码表示的数进行加减运算比较复杂&#xff0c;当两数相加时&#xff0c;如果同号则数值相加&#xff0c;但是进行减法时要先比较绝对值的…

数据分析基础之《matplotlib(5)—直方图》

一、直方图介绍 1、什么是直方图 直方图&#xff0c;形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念&#xff0c;首先要对数据进行分组&#xff0c;然后统计每个分组内数据元的数量。在坐标系中&#xff0c;横轴标出每个组的端点&#xff0c;纵轴表示频…

Github copilot 在vscode 和pycharm中的使用和一些问题

问题 copilot 代理设置问题 参考 【Copilot】GitHub Copilot could not connect to server. Extension activation failed: “read ECONNRESET“-CSDN博客 开启vpn VScode 设置代理 测试copilot pycharm 代理设置 测试copilot

unity中:搭建在线AR应用

使用Imagine WebAR - Image Tracker插件部署WebGL应用 在使用Imagine WebAR - Image Tracker插件进行WebGL应用开发时&#xff0c;有两个关键知识点需要掌握&#xff1a; 1. 部署到支持HTTPS的服务器 由于WebGL应用需要访问用户的摄像头&#xff0c;因此必须在支持HTTPS的服…

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

自动补全的 select antd react

自动补全的 select antd react 文档&#xff1a;自动补全的 select antd react.note 链接&#xff1a;http://note.youdao.com/noteshare?idf5e4a93d2b9d6be8e459edd4eb86323b&sub19796E9BC04D4ABD9ACE325FDFF59B0E 添加链接描述 import React, { useState, useRef } from…