2017-08-09 127 views
1

我有一個創建了大熊貓的相關性矩陣(基於多種金融工具的時間序列)查找集羣和集羣的最核心要素,即是:Python的 - 從相關矩陣

enter image description here

(見以下數據)

我想通過相關元素對結果進行聚類。我已經成功地做到這一點通過使用閾值法:

# 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)) 

這將返回相關文書的清單:

[{'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學習文檔,我開始覺得可能是創建羣集不輸入閾值,我覺得這太武斷了像DBscanaffinity propagation的一些更復雜的方式,或網絡中的另一種算法x

問題1)是我正在嘗試解決的問題,但我認爲這將需要更好地理解可用於時間序列分析相關特定任務的不同聚類算法 - 因此存在問題2)。

如果有人有解決方案1),這將是非常棒的。 或者,指向什麼算法最適合聚類相關矩陣元素並對結果執行分析(如查找最中心元素)的指針會很好。

數據:

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_) 

回答

0

在過濾:過濾器,以替代的方式是使用Serrano's disparity filter。您可以找到一個與networkx兼容的解決方案here。基本上,對於每個節點,它都會根據均勻分佈的零假設測試所有相鄰邊權重。您可以設置一個閾值並僅保留那些在該值處顯着的邊緣。

在檢測集羣上:有許多方法可以在沒有篩選的情況下檢測加權網絡中的社區,直到您擁有多個連接組件。一種開箱即用的方法,在網絡兼容的實現中運行得很好(並且處理權重)是Louvain algorithm

在檢測集羣中的重要節點時:如果您已經過濾並找到集羣,那麼可以通過加權度或接近度中心性簡單地對集羣內的節點進行排序。 Networkx有一個convenient function用於給出一個節點列表的子圖。