栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

《数据挖掘》-- 不放回简单抽样

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《数据挖掘》-- 不放回简单抽样

不放回简单抽样

题目:设有一组数据:[11,13,16,19,27,36,43,54,62,75],现在想要从中不放回随机抽样5个数据,每个数据被抽中的概率分别为[0.1,0.05,0.05,0.05,0.05,0.1,0.1,0.1,0.1,0.3]。
抽样过程如下。

  1. 根据待抽样数据的概率,计算以数组形式表示的累计分布概率cdf,并规范化。
    计算:cdf=[0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.7,1]
    规范化:cdf/=cdf[-1],得到:[0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.7,1]
    归一化的处理 需要cdf每次都除以cdf列表的最后一个数据,本例中就是除以1
  2. 根据还需抽样的个数,生成[0,1]的随机数数组x。
    [0.04504848 0.5299489 0.0734825 0.52341745 0.17316974]
  3. 将x中的随机数按照cdf值升序找到插入位置,形成索引数组new。
    [0 7 0 7 2]
    比如随机数组x中大于0.04504848的最小数是0.1,下标为0;大于0.5299489的最小数是0.6,下标为7
  4. 找出数组new中不重复的索引位置,作为本次抽样的位置索引。
    [0 7 2]
  5. 在概率数组p中,将已经抽样的索引位置置0。
    P=[0.,0.05,0.,0.05,0.05,0.1,0.1,0.,0.1,0.3]
  6. 重复上述步骤,直到输出指定数目的样本。
    第二轮依旧先累计P,按照一样的步骤进行,第一次抽样抽了3个,这次随机数数组x的个数应该为2个
    最终被抽中的样本在原数组中的位置索引:[0 7 2 9 5]
    抽样结果:[11 54 16 75 36]
    代码如下:
import numpy as np
# 抽样个数
size = 5
# 概率数组
p = np.array([0.1, 0.05, 0.05, 0.05, 0.05, 0.1, 0.1, 0.1, 0.1, 0.3])
# 已抽样下标数组 全零数组
found = np.zeros(size, dtype=np.int)
# 样本
populations = np.array([11, 13, 16, 19, 27, 36, 43, 54, 62, 75])
# 已抽样的个数
n_uniq = 0
while n_uniq < size:
    # 生成0-1随机数数组  有几个没抽样就是几
    x = np.random.rand(size - n_uniq)
    # 计算累计概率
    cdf = np.cumsum(p)
    # 规范化
    cdf /= cdf[-1]
    # 找随机数组的位置索引
    new = cdf.searchsorted(x, side='right')
    # 去掉重复的位置索引
    _, unique_indices = np.unique(new, return_index=True)
    unique_indices.sort()
    new = new.take(unique_indices)
    found[n_uniq:n_uniq + new.size] = new
    # 更新抽样个数
    n_uniq += new.size
    #  已抽样的索引位置置零
    if n_uniq > 0:
        p[found[0:n_uniq]] = 0
samplings0 = populations[found]
print(samplings0)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275284.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号