android - 从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)
子阵列没有以伪随机方式对数据进行采样,但只得到了前 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 次,这甚至可能是阶乘,在较大的数据集中它会发生并且被认为是最低性能。
推荐阅读
- c# - C# Unity 队列清空自身
- gitlab - 无法在我的免费帐户中连接到 Gitlab CI 中的容器
- c++ - 如何从 C++ 中的 GetCurrentDirectory() 路径上一层
- eclipse - Spring Boot 在 Eclipse 中使用 log4j2 - NoClassDefFoundError Logback
- c - 没有编译错误,但在 C 中没有得到任何输出
- javascript - 确定具有指定面对模式的相机的设备ID
- c# - 如何解决无效视图状态的问题
- java - 我无法决定为我想要实现的目标存储字符串的最佳方式
- .net-core - 尝试使用通用 HostBuilder 使用 .net core 2 控制台应用程序配置 Serilog
- office-js - 从清单命令 (IE11/Edge) 调用时,window.addEventListener 在 Word 加载项中不起作用