首页 > 解决方案 > 从android kotlin中的数组采样

问题描述

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

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

我在想

2048/250 = 8.19

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

有这样做的功能吗?

标签: androidkotlinsample

解决方案


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

所以天真的方法

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)

子阵列没有以伪随机方式对数据进行采样,但只得到了前 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 次,这甚至可能是阶乘,在较大的数据集中它会发生并且被认为是最低性能。


推荐阅读