简单抽样算法介绍

本文介绍了三种数据采样方法:平均随机抽样、分类抽样及按百分比分类抽样,帮助理解如何从大量数据中选取有代表性的样本进行分析。

 

我们要分析数据,当面对大量数据的时候,不可能每个数据都看一遍,就需要用到一些采样方法。通过采样得到的数据了解数据的规律和特征。

 

1、平均随机抽样

     有10000个数据,任意随机抽取100条。

2、分类抽样

     有10000个数据,有10个类目,每类1000条,可以考虑每个种类抽取50条。

 

3、分类、按照百分比抽样

    如果有10000个数据。假如是身高数据,按照正态分布。那么根据正态分布,对每个高度取一定的样本,做分析。

### Java 实现分层抽样算法 分层抽样是一种统计学方法,它通过对总体按照某些特征进行分组(即分层),然后在每一层中独立抽取样本。这样可以确保每一分层都有足够的代表性[^4]。 以下是基于 Java 的分层抽样的实现代码示例: #### 基于权重的分层抽样 假设我们有一组带权重的数据,并希望通过这些权重来决定每个数据被选中的概率[^5]。 ```java import java.util.*; public class StratifiedSampling { public static List<Integer> stratifiedSample(Map<Integer, Double> dataWithWeights, int k) { // 创建一个新的列表存储加权后的 R 值 List<Map.Entry<Integer, Double>> entries = new ArrayList<>(dataWithWeights.entrySet()); // 计算每个数据的新 R 值 for (Map.Entry<Integer, Double> entry : entries) { double r = Math.random(); // 生成一个 [0,1) 的随机数 double adjustedR = Math.pow(r, 1 / entry.getValue()); // 权重越大,调整后的 R 越接近 1 entry.setValue(adjustedR); } // 对新 R 值降序排序 entries.sort((o1, o2) -> Double.compare(o2.getValue(), o1.getValue())); // 返回前 K 个键值对应的样本 List<Integer> result = new ArrayList<>(); for (int i = 0; i < Math.min(k, entries.size()); i++) { result.add(entries.get(i).getKey()); } return result; } public static void main(String[] args) { // 构造带有权重的数据集 Map<Integer, Double> dataWithWeights = new HashMap<>(); dataWithWeights.put(1, 3.0); // 数据项及其权重 dataWithWeights.put(2, 1.0); dataWithWeights.put(3, 2.0); dataWithWeights.put(4, 4.0); int sampleSize = 2; // 抽取两个样本 List<Integer> samples = stratifiedSample(dataWithWeights, sampleSize); System.out.println("Selected Samples: " + samples); } } ``` #### 解析 上述代码实现了基于权重的分层抽样逻辑: - 输入是一个 `Map<Integer, Double>` 类型的数据结构,其中键表示数据项,值表示其对应权重。 - 每个数据项会生成一个 `[0,1)` 的随机数 \( R \),并将其调整为 \( R^{1/n} \),这里 \( n \) 是该数据项的权重。 - 经过调整后,权重较大的数据更可能具有较高的排名。 - 排序后选取前 \( k \) 个数据作为最终样本。 --- ### 注意事项 1. **输入验证**:应确保权重均为正数且不为空。 2. **性能考虑**:如果数据量较大,则需优化排序部分的时间复杂度。 3. **扩展性**:可以通过修改权重计算方式支持更多复杂的场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值