一文详解4种聚类算法及可视化(Python)

在这篇文章中,基于20家公司的股票价格时间序列数据。根据股票价格之间的相关性,看一下对这些公司进行聚类的四种不同方式。

苹果(AAPL),亚马逊(AMZN),Facebook(META),特斯拉(TSLA),Alphabet(谷歌)(GOOGL),壳牌(SHEL),Suncor能源(SU),埃克森美孚公司(XOM),Lululemon(LULU),沃尔玛(WMT),Carters(CRI)、 Childrens Place (PLCE), TJX Companies (TJX), Victoria’s Secret & Co (VSCO), Macy’s (M), Wayfair (W), Dollar Tree (DLTR), CVS Caremark (CVS), Walgreen (WBA), Curaleaf Holdings Inc. (CURLF)

我们的DataFrame df_combined,包含上述公司413天的股票价格,没有遗漏数据。

目标

我们的目标是根据相关性对这些公司进行分组,并检查这些分组的有效性。例如,苹果、亚马逊、谷歌和Facebook通常被视为科技股,而Suncor和Exxon被视为石油和天然气股。我们将检查我们是否可以得到这些分类,只使用这些公司的股票价格之间的相关性。

使用相关性来对这些公司进行分类,而不是使用股票价格,如果使用股票价格,具有相似股票价格的公司将被集中在一起。但在这里,我们想根据股票价格的行为来对公司进行分类。实现这一目标的一个简单方法是使用股票价格之间的相关性。

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

相关文件及代码都已上传,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88194,备注:来自CSDN + 加群
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

最佳集群数量

寻找集群的数量是一个自身的问题。有一些方法,如elbow方法,可以用来寻找最佳的集群数量。然而,在这项工作中,尝试将这些公司分成4个集群。理想情况下,这四个群组必须是科技股、石油和天然气股、零售股和其他股票。

首先获得我们所拥有的数据框架的相关矩阵。

correlation_mat=df_combined.corr()

定义一个效用函数来显示集群和属于该集群的公司。

# 用来打印公司名称和它们所分配的集群的实用函数
def print_clusters(df_combined,cluster_labels):cluster_dict = {}for i, label in enumerate(cluster_labels):if label not in cluster_dict:cluster_dict[label] = []cluster_dict[label].append(df_combined.columns[i])# 打印出每个群组中的公司 -- 建议关注@公众号:数据STUDIO 定时推送更多优质内容for cluster, companies in cluster_dict.items():print(f"Cluster {cluster}: {', '.join(companies)}")

方法1:K-means聚类法

K-means聚类是一种流行的无监督机器学习算法,用于根据特征的相似性将相似的数据点分组。该算法迭代地将每个数据点分配给最近的集群中心点,然后根据新分配的数据点更新中心点,直到收敛。我们可以用这个算法根据相关矩阵对我们的数据进行聚类。

from sklearn.cluster import KMeans# Perform k-means clustering with four clusters
clustering = KMeans(n_clusters=4, random_state=0).fit(correlation_mat)# Print the cluster labels
cluster_labels=clustering.labels_
print_clusters(df_combined,cluster_labels)

图片

k-means聚类的结果

正如预期的那样,亚马逊、Facebook、特斯拉和Alphabet被聚集在一起,石油和天然气公司也被聚集在一起。此外,沃尔玛和MACYs也被聚在一起。然而,我们看到一些科技股,如苹果与沃尔玛聚集在一起。

方法2:聚和聚类法Agglomerative Clustering

聚合聚类是一种分层聚类算法,它迭代地合并类似的聚类以形成更大的聚类。该算法从每个对象的单独聚类开始,然后在每一步将两个最相似的聚类合并。

from sklearn.cluster import AgglomerativeClustering# 进行分层聚类
clustering = AgglomerativeClustering(n_clusters=n_clusters, affinity='precomputed', linkage='complete').fit(correlation_mat)# Display the cluster labels
print_clusters(df_combined,clustering.labels_)

图片

分层聚类的结果

这些结果与我们从k-means聚类得到的结果略有不同。我们可以看到一些石油和天然气公司被放在了不同的聚类中。

方法3:亲和传播聚类法 AffinityPropagation

亲和传播聚类是一种聚类算法,不需要事先指定聚类的数量。它的工作原理是在成对的数据点之间发送消息,让数据点自动确定聚类的数量和最佳聚类分配。亲和传播聚类可以有效地识别数据中的复杂模式,但对于大型数据集来说,计算成本也很高。

from sklearn.cluster import AffinityPropagation# 用默认参数进行亲和传播聚类
clustering = AffinityPropagation(affinity='precomputed').fit(correlation_mat)# Display the cluster labels
print_clusters(df_combined,clustering.labels_)

图片

亲和传播聚类的结果

有趣的是,这个方法发现四个聚类是我们数据的最佳聚类数量。此外,我们可以观察到,石油和天然气公司被聚在一起,一些科技公司也被聚在一起。

方法4:DBSCAN聚类法

DBSCAN是一种基于密度的聚类算法,它将那些紧密排列在一起的点聚在一起。它不需要事先指定聚类的数量,而且可以识别任意形状的聚类。该算法对数据中的离群值和噪声具有鲁棒性,可以自动将它们标记为噪声点。

from sklearn.cluster import DBSCAN# Removing negative values in correlation matrix
correlation_mat_pro = 1 + correlation_mat# Perform DBSCAN clustering with eps=0.5 and min_samples=5
clustering = DBSCAN(eps=0.5, min_samples=5, metric='precomputed').fit(correlation_mat_pro)# Print the cluster labels
print_clusters(df_combined,clustering.labels_)

图片

DBScan聚类的结果

在这里,与基于亲和力的聚类不同,DBScan方法将5个聚类确定为最佳数量。还可以看出,有些集群只有1或2家公司。

可视化

同时检查上述四种聚类方法的结果,以深入了解它们的性能,可能是有用的。最简单的方法是使用热图,公司在X轴上,聚类在Y轴上。

def plot_cluster_heatmaps(cluster_results, companies):# 从字典中提取key和valuemethods = list(cluster_results.keys())labels = list(cluster_results.values())# 定义每个方法的热图数据heatmaps = []for i in range(len(methods)):heatmap = np.zeros((len(np.unique(labels[i])), len(companies)))for j in range(len(companies)):heatmap[labels[i][j], j] = 1heatmaps.append(heatmap)# Plot the heatmaps in a 2x2 gridfig, axs = plt.subplots(nrows=2, ncols=2, figsize=(12, 12))for i in range(len(methods)):row = i // 2col = i % 2sns.heatmap(heatmaps[i], cmap="Blues", annot=True, fmt="g", xticklabels=companies, ax=axs[row, col])axs[row, col].set_title(methods[i])plt.tight_layout()plt.show()companies=df_combined.columns
plot_cluster_heatmaps(cluster_results, companies)

图片

所有四种方法的聚类结果

然而,当试图比较多种聚类算法的结果时,上述的可视化并不是很有帮助。找到一个更好的方法来表示这个图将会很有帮助。

结论

在这篇文章中,我们探讨了四种不同的方法,根据20家公司的股票价格之间的相关性来进行聚类。其目的是以反映这些公司的行为而不是其股票价格的方式对其进行聚类。尝试了K-means聚类、Agglomerative聚类、Affinity Propagation聚类和DBSCAN聚类方法,每种方法都有自己的优点和缺点。结果显示,这四种方法都能以符合其行业或部门的方式对公司进行聚类,而一些方法的计算成本比其他方法更高。基于相关性的聚类方法为基于股票价格的聚类方法提供了一个有用的替代方法,可以根据公司的行为而不是股票价格来聚类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45232.shtml

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

相关文章

计算机毕设项目之基于django+mysql的疫情实时监控大屏系统(前后全分离)

系统阐述的是一款新冠肺炎疫情实时监控系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体…

多线程实现与管理

进程与线程 进程 : 进程是操作系统进行资源分配的最小单位,每执行一个程序、一条命令操作系统都会启动一个进程,进程是一个程序的执行过程,当程序启动时,操作系统会把进程的代码加载到内存中,并为新进程分配…

uni-app根据经纬度逆解析详细地址

uni-app中的getLocation()方法可以获取到用户当前的地理位置(经纬度)、速度。 但是返回参数中的address在app中才会显示,小程序中不会显示,所以我们需要进行逆解析其地址,解析出它的地址信息。 1.首先要在腾讯位置服务…

如何正确地设置Outlook SMTP发送电子邮件(wordpress配置)

如何正确地设置Outlook SMTP发送电子邮件(wordpress配置) 作者:虚坏叔叔 博客:https://pay.xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 正在寻找正确的Outlook SMTP设置&#xff1f…

LRU 算法

LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。 力扣(LeetCode&#xff09…

自动方向识别式 TXB型电平转换芯片

大家好,这里是大话硬件。 在上一篇文章分析了LSF型的电平转换芯片,LSF型电平转换芯片最常见是应用在I2C总线上。I2C为OD型总线,LSF使用时增加电阻。 对于不是OD型总线的电平转换,比如UART,SPI,普通GPIO口信号,这些信号在进行双向电平转换使用什么样的芯片呢? 从上面…

面试之快速学习STL-deuqe和list

1. deque deque 容器用数组(数组名假设为 map)存储着各个连续空间的首地址。也就是说,map 数组中存储的都是指针如果 map 数组满了怎么办?很简单,再申请一块更大的连续空间供 map 数组使用,将原有数据&…

每天一道leetcode:433. 最小基因变化(图论中等广度优先遍历)

今日份题目: 基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如,&quo…

博弈论 | 斐波那契博弈

斐波那契博弈 博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达…

计算机提示mfc120u.dll缺失(找不到)怎么解决

在计算机领域,mfc120u.dll是一个重要的动态链接库文件。它包含了Microsoft Foundation Class (MFC) 库的特定版本,用于支持Windows操作系统中的应用程序开发。修复mfc120u.dll可能涉及到解决与该库相关的问题或错误。这可能包括程序崩溃、运行时错误或其…

13.实现业务功能--板块信息

目录 获取在首页中显示的版块 1. 实现逻辑 2. 创建扩展 Mapper.xml 3. 修改 DAO 4. 创建 Service 接口 5. 实现 Service 接口 6. 生成测试方法 7. 实现 Controller 8. 实现前端页面 在数据库中执行以下 SQL 语句: INSERT INTO t_board (id, name, article…

浅析Linux SCSI子系统:调试方法

文章目录 SCSI日志调试功能scsi_logging_level调整SCSI日志等级 SCSI trace events使能SCSI trace events方式一:通过set_event接口方式二:通过enable 跟踪trace信息 相关参考 SCSI日志调试功能 SCSI子系统支持内核选项CONFIG_SCSI_LOGGING配置日志调试…

kafka晋升之路-理论+场景

kafka晋升之路 一:故事背景二:核心概念2.1 系统架构2.2 生产者(Producer)2.2.1 生产者分区2.2.2 生产者分区策略 2.3 经纪人(Broker)2.3.1 主题(Topic)2.3.2 分区(Partit…

WPS-RCE

版本&#xff1a; WPS Office 2023 个人版 < 11.1.0.12313 WPS Office 2019 企业版 < 11.8.2.12085 原理&#xff1a; Office 中的 WebExtension&#xff08;通常称为 Office 插件或 Office 应用程序&#xff09;是一种用于扩展 Microsoft Office 功能的技术。Office …

回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一…

FPGA应用学习笔记-----布线布局优化

优化约束&#xff1a; 设置到最坏情况下会过多 布局和布线之间的关系&#xff1a; 最重要的是与处理器努力的&#xff0c;挂钩允许设计者调整处理器努力的程度 逻辑复制&#xff1a; 不能放置多个负载&#xff0c;只使用在关键路径钟 减少布线延时&#xff0c;但会增加面积&a…

阿里云故障洞察提效 50%,全栈可观测建设有哪些技术要点?

本文根据作者在「TakinTalks 稳定性社区 」公开分享整理而成 #一分钟精华速览# 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“…

SpringBoot + MyBatis-Plus构建树形结构的几种方式

1. 树形结构 树形结构&#xff0c;是指&#xff1a;数据元素之间的关系像一颗树的数据结构。由树根延伸出多个树杈 它具有以下特点&#xff1a; 每个节点都只有有限个子节点或无子节点&#xff1b;没有父节点的节点称为根节点&#xff1b;每一个非根节点有且只有一个父节点&a…

整理mongodb文档:批量操作

个人博客 整理mongodb文档:批量操作 个人公众号&#xff0c;求关注&#xff0c;文章如有不明&#xff0c;请指出。 文章概叙 本文讲的是关于bulkwrite的用法&#xff0c;依旧是在shell下使用。 关于批量操作 Performs multiple write operations with controls for order …

【Linux命令详解 | wget命令】 wget命令用于从网络下载文件,支持HTTP、HTTPS和FTP协议

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 基本文件下载2. 递归下载整个网站3. 限制下载速率4. 防止SSL证书校验5. 断点续传6. 指定保存目录7. 自定义保存文件名8. 增量下载9. 使用HTTP代理10. 后台下载 总结 简介 在编程世界中&#xff0c;处理网络资源是…