首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -从关联矩阵中查找集群和集群的最中心元素

Python -从关联矩阵中查找集群和集群的最中心元素
EN

Stack Overflow用户
提问于 2017-08-09 21:00:12
回答 1查看 640关注 0票数 1

我已经创建了一个与熊猫的相关矩阵(基于多个金融工具的时间序列),如下所示:

(请参阅下面的数据)

我想通过相关元素对结果进行聚类。我已经通过使用阈值方法做到了这一点:

代码语言:javascript
复制
# Create a list of correlated pairs
l=list(matrix[(matrix>0.75)|(matrix<-0.75)].stack().index)
li=[item for item in l if item[0]!=item[1]]

# Create a list of groups with correlated instruments
import networkx as nx
gr = nx.Graph(li)
groups=list(nx.connected_components(gr))

这将返回相关仪器的列表:

代码语言:javascript
复制
[{'AIGCI', 'BZ', 'CL', 'HO', 'QM'},
 {'AUD', 'M6A'},
 {'CHF', 'E7', 'EUR', 'M6E'},
 {'EMD', 'ES', 'NQ', 'RTY', 'YM'},
 {'GBP', 'M6B'},
 {'GC', 'MGC', 'SI'},
 {'GF', 'LE'},
 {'KE', 'ZW'},
 {'NIY', 'NKD'},
 {'TN', 'UB', 'ZB', 'ZF', 'ZN', 'ZT'},
 {'ZM', 'ZS'}]

1)现在我想找出对于每个组来说,哪一个是最“核心”的工具,即与其组中的大多数其他人相关和最好相关的工具。

2)深入研究了networkx和scikit learn的文档,我开始认为可能有一些更复杂的方法来创建集群,而不需要输入阈值,我发现阈值太随意了,比如DBscanaffinity propagation,或者networkx的另一种算法

问题1)是我实际上试图解决的问题,但我认为这需要更好地理解可用于时间序列相关性分析的特定任务的不同聚类算法-因此问题2)。

如果有人有一个交钥匙的解决方案,那就太棒了。或者,指向什么算法最适合聚类相关矩阵元素并对结果进行分析(比如找到最中心的元素)将是很好的选择。

数据:

代码语言:javascript
复制
dict_={'AIGCI': {'AIGCI': 1.0,
  'AUD': 0.3233391012080904,
  'BZ': 0.77450612217810844,
  'CAD': 0.37758495673263409,
  'CHF': 0.1148713675671198,
  'CL': 0.75790671332995785,
  'E7': 0.15824972293693412,
  'EMD': 0.20907406346059357,
  'ES': 0.19658499045886685,
  'EUR': 0.15900870599662253},
 'AUD': {'AIGCI': 0.3233391012080904,
  'AUD': 1.0,
  'BZ': 0.16539566069043321,
  'CAD': 0.56525172934861501,
  'CHF': 0.39333882276815396,
  'CL': 0.16369950005905545,
  'E7': 0.41552240077868813,
  'EMD': 0.20167148908243152,
  'ES': 0.24541480412857969,
  'EUR': 0.41986142158397494},
 'BZ': {'AIGCI': 0.77450612217810844,
  'AUD': 0.16539566069043321,
  'BZ': 1.0,
  'CAD': 0.41187046918391457,
  'CHF': -0.0092838918317396726,
  'CL': 0.97045709275661984,
  'E7': 0.0095197228846883777,
  'EMD': 0.20634087929447745,
  'ES': 0.1923482593409139,
  'EUR': 0.012112114472331318},
 'CAD': {'AIGCI': 0.37758495673263409,
  'AUD': 0.56525172934861501,
  'BZ': 0.41187046918391457,
  'CAD': 1.0,
  'CHF': 0.35191789369432458,
  'CL': 0.40972181454072104,
  'E7': 0.31846852856331664,
  'EMD': 0.28026489729302623,
  'ES': 0.29256826563873206,
  'EUR': 0.32757564057495203},
 'CHF': {'AIGCI': 0.1148713675671198,
  'AUD': 0.39333882276815396,
  'BZ': -0.0092838918317396726,
  'CAD': 0.35191789369432458,
  'CHF': 1.0,
  'CL': 0.012688599148050395,
  'E7': 0.8239125068633365,
  'EMD': -0.13725408324352331,
  'ES': -0.1041381030850365,
  'EUR': 0.82474780532058567},
 'CL': {'AIGCI': 0.75790671332995785,
  'AUD': 0.16369950005905545,
  'BZ': 0.97045709275661984,
  'CAD': 0.40972181454072104,
  'CHF': 0.012688599148050395,
  'CL': 1.0,
  'E7': 0.0073086434159336097,
  'EMD': 0.22554220312864581,
  'ES': 0.20407792352963819,
  'EUR': 0.011629405332006879},
 'E7': {'AIGCI': 0.15824972293693412,
  'AUD': 0.41552240077868813,
  'BZ': 0.0095197228846883777,
  'CAD': 0.31846852856331664,
  'CHF': 0.8239125068633365,
  'CL': 0.0073086434159336097,
  'E7': 1.0,
  'EMD': -0.14561549010272393,
  'ES': -0.10852020039517689,
  'EUR': 0.99165451800731141},
 'EMD': {'AIGCI': 0.20907406346059357,
  'AUD': 0.20167148908243152,
  'BZ': 0.20634087929447745,
  'CAD': 0.28026489729302623,
  'CHF': -0.13725408324352331,
  'CL': 0.22554220312864581,
  'E7': -0.14561549010272393,
  'EMD': 1.0,
  'ES': 0.85791959540783203,
  'EUR': -0.13599101777284797},
 'ES': {'AIGCI': 0.19658499045886685,
  'AUD': 0.24541480412857969,
  'BZ': 0.1923482593409139,
  'CAD': 0.29256826563873206,
  'CHF': -0.1041381030850365,
  'CL': 0.20407792352963819,
  'E7': -0.10852020039517689,
  'EMD': 0.85791959540783203,
  'ES': 1.0,
  'EUR': -0.10635681098349807},
 'EUR': {'AIGCI': 0.15900870599662253,
  'AUD': 0.41986142158397494,
  'BZ': 0.012112114472331318,
  'CAD': 0.32757564057495203,
  'CHF': 0.82474780532058567,
  'CL': 0.011629405332006879,
  'E7': 0.99165451800731141,
  'EMD': -0.13599101777284797,
  'ES': -0.10635681098349807,
  'EUR': 1.0}}

import pandas as pd
matrix=pd.DataFrame(dict_)
EN

回答 1

Stack Overflow用户

发布于 2017-11-06 00:30:53

关于过滤:另一种过滤方法是使用Serrano's disparity filter。您可以找到与networkx兼容的解决方案here。基本上,对于每个节点,它针对均匀分布的零假设测试所有相邻的边权重。您可以设置阈值,并仅保留那些在该值有意义的边。

关于检测集群:有许多方法可以检测加权网络中的社区,而无需过滤,直到您拥有多个连接的组件。一种开箱即用的方法是Louvain algorithm,它与networkx兼容的实现可以很好地工作(并处理权重)。

关于检测集群中的重要节点:如果你已经过滤并找到了集群,你可以简单地根据它们的加权程度或接近中心度对集群中的节点进行排名。Networkx有一个convenient function,用于在给定节点列表的情况下获取子图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45591422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档