Matlab中的分位数排序

Quantile sorting in Matlab

我有一个 n-by-1 向量,其中 n = 20000。我想对该向量中的数据进行十分位数排名,这基本上是用其对应的十分位数替换每个元素的值。

我目前是这样做的:

deciles = quantile(X,9);
X = discretize(X,[-inf deciles inf]);

其中 X 是我的数据数组。我这样做是因为我想要 10 组数据,每组数据的数量都相同。

你能验证这个程序吗?或者让我知道是否有更可靠的方法?

您可以通过创建已知大小的简单数据轻松验证您拥有的内容是否正确。

nGroups = 10;
nPerGroup = 10000;

X = linspace(0, 1, nGroups * nPerGroup);

deciles = quantile(X, nGroups - 1);
X = discretize(X,[-inf deciles inf]);

nPerGroup = arrayfun(@(x)sum(X == x), 1:nGroups)
%// 10000   10000   10000   10000   10000   10000   10000   10000   10000   10000

另一种替代方法是对数据进行排序,然后重新整形,使列数成为所需组的数量。这种方法将仅依赖于内置函数

X = linspace(0, 1, nGroups * nPerGroup);
Y = reshape(sort(X), [], nGroups);

每一列都是一个不同的组。