从 android kotlin 中的数组采样

Sampling from an array in android kotlin

我需要一个想法来做这件事。我不擅长数学。 也许它内置了我还没有找到的功能。

我有一个包含 2048 个数据的数组。 我需要从中获得 250 的价值。

我在想

2048/250 = 8.19

这意味着,我对数组中 8 个位置的每个增量取值。

有这个功能吗?

据我所知,我认为问题在于平衡迭代和采样的随机性。

所以天真的方法

dataSet.indexedMapNotNull { i, data ->
    if (i % 8 == 0) data else null
}

那将 运行 遍历所有数组,因此您只需要 250 次迭代,而不是 dataSet.size 次迭代。那么,如果我们迭代 250 次,并且对于每一次迭代,我们取第 8 次呢?

val sample = mutableListOf<DataType>()
for (i in 1..250) {
    val positionInDataSet = (i * 8) - 1 //minus one adjust the index for the size
    val case = dataSet[positionInDataSet]
    sample.add(case)
}

另一种选择是简单地使用集合中的复制方法,但问题是你失去了采样

dataSet.subArray(0, 250)

Sub-array 没有以 pseudo-random 的方式对数据进行采样,而是只得到了前 250 个,这会产生偏差。好处通常是数组复制方法是 N 的对数。

另一种选择是通过不每 8 次获取数据而是随机位置来进一步随机化事物,直到我们达到所需的样本量。

val sample = mutableSetOf<DataType>()

while (sample.size != 250) {
    val randomPosition = Random.nextInt(0, dataSet.size)
    val randomSelection = dataSet[randomPosition]
    sample.add(randomeSelection)

}

这里我们使用集合,因为Set保证元素唯一,所以你的数据集中有完全随机的250个元素。这样做的问题是位置的随机性可能使相同的 randomPosition 不止一次,所以你在数据集上迭代超过 250 次,这甚至可能是阶乘的,在更大的数据集中它会发生并且是被认为是最低性能。