加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

干货收藏!Python完整代码带你一文看懂抽样

发布时间:2019-09-25 18:36:04 所属栏目:优化 来源:宋天龙
导读:1.什么时候需要抽样 抽样工作在数据获取较少或处理大量数据比较困难的时期非常流行,这主要有以下几方面原因: 数据计算资源不足。计算机软硬件的限制是导致抽样产生的基本原因之一,尤其是在数据密集的生物、科学工程等领域,不抽样往往无法对海量数据进

第3部分:实现等距抽样

  1. data = np.loadtxt('data3.txt') # 导入普通数据文件 
  2. sample_count = 2000 # 指定抽样数量 
  3. record_count = data.shape[0] # 获取最大样本量 
  4. width = record_count / sample_count # 计算抽样间距 
  5. data_sample = [] # 初始化空白列表,用来存放抽样结果数据 
  6. i = 0 # 自增计数以得到对应索引值 
  7. while len(data_sample) <= sample_count and i * width <= record_count - 1: 
  8.  # 当样本量小于等于指定抽样数量并且矩阵索引在有效范围内时 
  9.  data_sample.append(data[int(i * width)]) # 新增样本 
  10.  i += 1 # 自增长 
  11. print(data_sample[:2]) # 打印输出前2条数据 
  12. print(len(data_sample)) # 打印输出样本数量 

首先使用Numpy的loadtxt方法读取数据文件;然后指定抽样样本量为2000,并通过读取原始数据的形状找到最大样本量边界,这可以用来作为循环的终止条件之一;接着通过最大样本量除抽样样本量得到抽样间距;建立一个空列表用于存储最终抽样结果数据,通过一个变量i做循环增长并用来做索引递增,然后进入抽样条件判断过程。

当样本量小于等于指定抽样数量并且矩阵索引在有效范围内时做处理,这里需要注意的是索引从0开始,因此最大数量值减去1得到循环边界,否则会报索引溢出错误。

通过列表的append方法不断追加通过间距得到的新增样本,在本节后面的方法中还会提到列表追加的extend方法,前者用于每次追加1个元素,后者用于批量追加多个元素。

i += 1指的是每次循环都增加1,可以写成i = i + 1。

最后打印输出前2条数据和抽样样本量。

返回结果如下:

  1. [array([-3.08057779, 8.09020329, 2.02732982, 2.92353937, -6.06318211]), array([-2.11984871, 7.74916701, 5.7318711 , 4.75148273, -5.68598747])] 
  2. 2000 

第4部分:实现分层抽样

  1. data2 = np.loadtxt('data2.txt')  # 导入带有分层逻辑的数据 
  2. each_sample_count = 200  # 定义每个分层的抽样数量 
  3. label_data_unique = np.unique(data2[:, -1])  # 定义分层值域 
  4. sample_data = []  # 定义空列表,用于存放最终抽样数据 
  5. sample_dict = {}  # 定义空字典,用来显示各分层样本数量 
  6. for label_data in label_data_unique:  # 遍历每个分层标签 
  7.  sample_list = []  # 定义空列表,用于存放临时分层数据 
  8.  for data_tmp in data2:  # 读取每条数据 
  9.  if data_tmp[-1] == label_data:  # 如果数据最后一列等于标签 
  10.  sample_list.append(data_tmp)  # 将数据加入分层数据中 
  11.  each_sample_data = random.sample(sample_list, each_sample_count) 
  12.  # 对每层数据都随机抽样 
  13.  sample_data.extend(each_sample_data)  # 将抽样数据追加到总体样本集 
  14.  sample_dict[label_data] = len(each_sample_data)# 样本集统计结果 
  15. print(sample_dict)  # 打印输出样本集统计结果 

首先使用Numpy的loadtxt方法导入带有分层逻辑的数据。在该示例中,读取的数据文件中包含了分类标签,放在最后一列。该列分类标签用于做分层抽样的标识。接着通过unique方法获取分层(分类标签)的值域,用于后续做循环处理。然后分别定义了用于存放临时分层数据、最终抽样数据、显示各分层样本数量的空列表和空字典。

下面进入正式的主循环过程,实现分层抽样:

  • 遍历每个分层标签,用来做数据的分层划分,数据一共分为2类标签(0和1)。
  • 读取每条数据并判断数据的分层标签是否与分层标签相同,如果是则将数据加入各分层数据列表中。
  • 当每个分层标签处理完成后会得到该分层标签下的所有数据,此时使用Python内置的random库的sample方法进行抽样。由于抽样结果是一个列表,因此这里使用extend(而不是append)批量追加到最终抽样数据列表中。然后将每个分层标签得到的样本数量,通过len方法对列表长度进行统计,并打印输出各个分层对应的样本数量。结果是每个分层都按照指定数量抽取样本,输出如下:
  1. {0.0: 200, 1.0: 200} 

第5部分:实现整群抽样

  1. data3 = np.loadtxt('data4.txt') # 导入已经划分好整群的数据集 
  2. label_data_unique = np.unique(data3[:, -1]) # 定义整群标签值域 
  3. print(label_data_unique) # 打印输出所有整群标签 
  4. sample_label = random.sample(set(label_data_unique), 2) # 随机抽取2个整群 
  5. sample_data = [] # 定义空列表,用来存储最终抽样数据 
  6. for each_label in sample_label: # 遍历每个整群标签值域 
  7.  for data_tmp in data3: # 遍历每个样本 
  8.  if data_tmp[-1] == each_label: # 判断样本是否属于抽样整群 
  9.  sample_data.append(data_tmp) # 样本添加到最终抽样数据集 
  10. print(sample_label) # 打印输出样本整群标签 
  11. print(len(sample_data)) # 打印输出总抽样数据记录条数 

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读