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

在学习聚类算法的过程中,学习到的聚类算法大部分都是针对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,翻译过来是“方差拟合优度”,公式如下:

一维数组的聚类-图片1

其中,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做图可得:

一维数组的聚类-图片2

随着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]

一维数组的聚类-图片3

一维数组的聚类-图片4

参考链接:

  • 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.mzph.cn/news/205978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[python库] mistune库的基本使用

前言 mistune库是一个解析Markdown的利器&#xff0c;使用起来非常简单。当我们想要解析Markdown格式的文档时&#xff0c;只需两步就能将其转换成html格式。如下&#xff1a; import mistune mistune.html(YOUR_MARKDOWN_TEXT)安装方式也非常简单&#xff0c;dddd&#xff1…

JavaSE基础50题:10. 计算1/1-1/2+1/3-……+1/99-1/100的值(两种方法)

概述 计算1/1 - 1/2 1/3 - …… 1/99 - 1/100的值。 当分母为偶数时&#xff0c;符号是负的&#xff0c;放分母为奇数时&#xff0c;符号是负的。 方法一 用 flg 做了一个正负交替 【代码】 public static double func() {double sum 0;int flg 1; //设置正负号的for (i…

CopyOnWriteArraySet怎么用

简介 CopyOnWriteArraySet是一个线程安全的无序集合&#xff0c;它基于“写时复制”的思想实现。它继承自AbstractSet&#xff0c;可以将其理解成线程安全的HashSet。 CopyOnWriteArraySet在读取操作比较频繁、写入操作相对较少的情况下可以提高程序的性能和可靠性。它的线程…

力扣每日一题day29[102. 二叉树的层序遍历]

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建PG开源数据库

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

docker安装node及使用

文章目录 一、安装node二、创建node容器三、进入创建的容器如有启发&#xff0c;可点赞收藏哟~ 一、安装node 查看可用版本 docker search node安装最新版本 docker install node:latest二、创建node容器 docker run -itd --name node-test node–name node-test&#xff1…

NOIP2014提高组第二轮day1 - T3:飞扬的小鸟

#题目链接 [NOIP2014 提高组] 飞扬的小鸟 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度&#xff0c;让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话&#xff0c;便宣告失败…

深度解析 Kafka 消息保证机制

Kafka作为分布式流处理平台的重要组成部分&#xff0c;其消息保证机制是保障数据可靠性、一致性和顺序性的核心。在本文中&#xff0c;将深入探讨Kafka的消息保证机制&#xff0c;并通过丰富的示例代码展示其在实际应用中的强大功能。 生产者端消息保证 1 At Most Once &quo…

ubuntu22.04 显卡驱动最简单的安装方法

1.拉取可选择安装的显卡驱动版本 sudo apt-get purge nvidia* #apt 的 update 和 upgrade 的区别 #apt update 命令只会获得系统上所有包的最新信息&#xff0c;并不会下载或者安装任何一个包。 #apt upgrade 命令来把这些包下载和升级到最新版本。 2.sudo apt update 3.安装…

EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-GRU-Multihead-Attention…

TCP通讯

TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式&#xff0c;也有着优点和缺点 它的优点对比于UDP来说就是可靠一点 因为它的通讯方式是需要先发送消息 看看客户端是否能够接收到消息 如果没有回复消息的话 服务端 就不会发出文件 等待客户端回复消息&#xff0c…

结构体,自定义类型

目录 结构体 结构体的声明 结构体的自引用 结构体的定义和初始化 结构体内存对齐 ​编辑 结构体的对齐规则&#xff1a; 为什么存在内存对齐&#xff1f; 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 枚举 联合&#xff08;共用体…

文件管理:每个文件夹只移入1个文件要怎样操作?批量移动文件技巧

在文件管理过程中&#xff0c;有时要将多个文件分别移动到不同的文件夹中&#xff0c;每个文件夹只包含一个文件。这样的需求可能出现在许多场景中&#xff0c;比如整理文件、备份资料或者进行特定的项目处理。如果每个手动去移动文件就会出现丢失的情况&#xff0c;以及太过耗…

嵌入式系统

嵌入式系统 目前国内一个普遍认同的嵌入式系统定义是&#xff1a;以应用为中心、以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。&#xff08;引用自《嵌入式系统设计师教程》&#xff09; …

48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

文章目录 一、简介二、限流器与熔断器在微服务中的作用1.限流器 &#xff1a; 对某个接口单位时间内的访问量做限制2. 熔断器&#xff1a;当服务连续报错&#xff0c;超过一定阈值时&#xff0c;打开熔断器使得服务不可用 三、具体实现1. 限流器实现逻辑&#xff08;以令牌桶算…

SQL Server——权限管理

一。SQL Server的安全机制 SQL Server 的安全性是建立在认证和访问许可两种安全机制之上的。其中&#xff0e;认证用来确定登录Sal Server 的用户的登录账户和密码是否正确&#xff0e;以此来验证其是否具有连接SQL Server 的权限;访问许可用来授予用户或组能够在数据库中执行哪…

软件设计师中级软考资料大全(一次过)

2023年下半年第一次参加软件设计师中级软考就过了&#xff0c;整理了下自己的备考资料和学习笔记&#xff0c;有需要可以下载 1.软件设计师中级软考全套官方参考资料及辅导书 软件设计师中级软考全套官方参考资料及辅导书 2.软件设计师中级软考历年真题解析(2004-2023) 软…

在springboot中引入参数校验

一、概要 一般我们判断前端传过来的参数&#xff0c;需要对某些值进行判断&#xff0c;是否满足条件。 而springboot相关的参数校验注解&#xff0c;可以解决我们这个问题。 二、快速开始 首先&#xff0c;我用的springboot版本是 3.1.5 引入参数校验相关依赖 <!--1…

2023五岳杯量子计算挑战赛数学建模思路+代码+模型+论文

目录 计算力网络&#xff08;CPN&#xff09;是一种新型的信息基础设施&#xff0c;完整论文代码见文末 问题描述 2.1 问题1 2.2 问题2 2.3 问题3 问题1的解答过程&#xff1a; 问题3的解答过程&#xff1a; 决策优化应用场景&#xff1a;人工智能模型超参数调优 背景信…

ELK(四)—els基本操作

目录 elasticsearch基本概念RESTful API创建非结构化索引&#xff08;增&#xff09;创建空索引&#xff08;删&#xff09;删除索引&#xff08;改&#xff09;插入数据&#xff08;改&#xff09;数据更新&#xff08;查&#xff09;搜索数据&#xff08;id&#xff09;&…