将相似数据分组以最大化组内相关性并最小化组间相关性
所以这是我的问题。 我每天有2000股的回报数据,下面是它的小样本 (s1到s8,第1天到第15天)将相似数据分组以最大化组内相关性并最小化组间相关性
我会打电话给我的数据“df”。
> df[1:15,1:8]
s1 s2 s3 s4 s5 s6 s7 s8
1 -0.026410 -0.001030 -0.0027660 0.0126500 -0.030110 0.001476 -0.008271 -0.005299
2 -0.018990 -0.013680 -0.0092050 -0.0008402 -0.002739 -0.014170 -0.006091 -0.011920
3 0.004874 0.024140 -0.0002107 -0.0084770 -0.006825 -0.001448 -0.002724 -0.003132
4 0.019300 -0.004649 0.0223400 0.0080200 -0.008197 -0.015270 0.004064 -0.008149
5 0.010350 -0.010650 0.0087780 0.0059960 -0.001390 -0.006454 0.018990 0.002822
6 0.028650 0.010490 0.0157200 -0.0004123 0.019750 -0.005902 0.004261 0.019110
7 0.004203 -0.002682 -0.0099840 -0.0070060 -0.025670 -0.014550 -0.016700 -0.011580
8 -0.042170 -0.019490 -0.0023140 -0.0083030 -0.018170 0.021160 -0.006864 -0.009438
9 0.017250 0.026600 0.0031630 -0.0069090 0.035990 0.008429 0.001500 -0.011830
10 -0.037400 -0.022370 0.0088460 0.0012690 -0.050820 -0.025300 -0.028040 -0.023790
11 -0.091140 -0.018830 0.0052160 -0.0403000 0.001410 -0.007050 -0.024340 -0.013110
12 -0.051620 0.004791 0.0336000 -0.0094320 -0.018320 -0.019490 -0.044080 -0.024020
13 0.007711 0.002158 -0.0177400 0.0090470 -0.004346 -0.001562 -0.096030 0.015840
14 0.041440 -0.001072 -0.0168400 0.0180300 -0.012980 -0.015280 0.059780 0.014730
15 -0.042620 -0.025560 -0.0180200 -0.0115200 0.033320 -0.015150 -0.014580 -0.012710
我需要一种方法将它们分组,以使组内相关性最大化,并且组间相关性被最小化。
因此,例如,我可以将它们成两组随机如下: (S1,S2,S3,S4)和(S5,S6,S7,S8) 问题是,一些股票可能相互关联,有些可能不相关。
所以我的解决办法是:
获得相关矩阵(假设皮尔森的方法正常工作)
cor_df <- cor(df)
熔体(扁平化)相关列表按降序排列,并删除相关系数重复和行= 1(使用重塑库)
cor_df_melt <- melt(cor_df)
names(cor_df_melt)[1] <- "x1"
names(cor_df_melt)[2] <- "x2"
names(cor_df_melt)[3] <- "corr"
cor_df_ordered <- cor_df_melt[order(-cor_df_sample_melt["corr"]),]
然后,我编号扁平矩阵,删除重复项(偶数编号)和行与correlat离子系数= 1
cor_df_numbered <- cbind(row=c(1:nrow(cor_df_ordered)),cor_df_ordered)
cor_df_ready <- cor_df_numbered[cor_df_numbered$row%%2==0&cor_df_numbered$corr%%2!=1,2:4]
在此之后,我与很好地订购相关系数的数据帧的每对以降序准备如下:
> cor_df_ready
x1 x2 corr
63 s7 s8 0.49223783
57 s1 s8 0.42518667
50 s2 s7 0.42369762
49 s1 s7 0.40824283
58 s2 s8 0.40395569
42 s2 s6 0.40394894
54 s6 s7 0.39408677
62 s6 s8 0.38536734
34 s2 s5 0.36882709
53 s5 s7 0.36066870
45 s5 s6 0.35734278
59 s3 s8 0.34295713
51 s3 s7 0.34163733
61 s5 s8 0.33264868
9 s1 s2 0.32812763
41 s1 s6 0.31221715
18 s2 s3 0.30692909
43 s3 s6 0.29390325
33 s1 s5 0.28845243
35 s3 s5 0.27859972
17 s1 s3 0.25039209
52 s4 s7 0.12989487
60 s4 s8 0.12095196
25 s1 s4 0.10902471
26 s2 s4 0.09471694
44 s4 s6 0.08039435
36 s4 s5 0.06957264
27 s3 s4 0.06027389
(顺便说一句我不知道为什么行号是这样无序的...任何人都可以解释吗?)
从这里,我的直觉是对顶级配对具有最高相关系数0.49223783(s7,s8),他们必须在同一组。
所以从我的cor_df_ready数据帧,我选择了与“S7”包括所有对和提取的4股出现在列表的顶部(S7,S8,S2,S1),并将它们命名为组1
然后我从我的cor_df_ready中排除了包括(s7,s8,s2,s1)在内的所有行,并重复该过程以提出第二个组(s3,s4,s5,s6)。
在这个例子中,我不必重复这个过程,因为只剩下最后一组了。
然后,我得到每个组的相关矩阵,并加入每相关系数的总和:
group1_cor <- cor(group1)
group2_cor <- cor(group2)
cor_sum <- sum(group1_cor) + sum(group2_cor)
然后我得到各组中的每一行的平均值,以及计算出的相关矩阵的总和对于这两个组的意思,并命名为cor_sum_mean。
最后,我计算:cor_sum_mean/cor_sum
的直觉是,组内被最大化相关性将最大化cor_sum其中基团之间的最小化的相关性也将最小化cor_sum_mean。
我想得到尽可能大的cor_sum(组内相关性)和尽可能小的cor_sum_mean(组内相关性)。
使用我的方法对整个数据,我分2000股成10组,我得到了什么是
#cor_sum = 131923.1
#cor_sum_mean = 83.1731
#cor_sum_mean/cor_sum = 0.0006305
我知道我能得到cor_sum_mean/cor_sum到0.000542(或更小),但我只是卡住了。
我搜索谷歌,stackoverflow,交叉验证,我得到的机器学习/时间序列聚类/分类可能是我正在寻找的答案的想法。
以下两个预发布的问题似乎是有益的,但我只是开始了解数据的科学,所以我有一个很难理解他们....
https://stats.stackexchange.com/questions/9475/time-series-clustering/19042#19042
https://stats.stackexchange.com/questions/3238/time-series-clustering-in-r
任何人都可以请解释或指导我在具体寻找什么?
这是一个很长的问题......感谢您的阅读!
使用层次聚类。
通过平均关联,您可以优化平均相关性。