首页 文章

对相似数据进行分组以最大化组内相关性并最小化组间相关性

提问于
浏览
0

所以这是我的问题 . 我每天有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

I need a way to group them so that the intra-group correlation is maximized and inter-group correlation is minimized.

因此,例如,我可以随机将它们分组为 two groups 如下:(s1,s2,s3,s4)和(s5,s6,s7,s8)问题是,一些股票可能彼此相关,有些股票可能相互关联也许不会 .

所以我的解决方案是:

得到一个相关矩阵(假设Pearson的方法工作正常)

cor_df <- cor(df)

按相应系数= 1熔化(展平)相关列表并删除重复项和相关系数为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"]),]

然后我对扁平矩阵进行编号,删除重复(偶数编号)和相关系数= 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

任何人都可以解释或指导我具体寻找什么?

这是一个很长的问题......感谢阅读!

1 回答

  • 0

    使用分层聚类 .

    通过平均关联,您可以优化平均相关性 .

相关问题