使用python实现权重抽样
假设k个变量:
x
j
;
(
i
=
1
,
2
,
.
.
.
k
)
x_j;(i=1,2,...k)
xj;(i=1,2,...k)
的取值概率(权重为)
w
j
;
(
i
=
1
,
2
,
.
.
.
k
)
w_j;(i=1,2,...k)
wj;(i=1,2,...k)
首先使用python的numpy.random.uniform(0,1)生成0到1之间的满足均匀分布的随机数
y
y
y
则当
∑
j
=
1
i
−
1
w
j
≤
y
<
∑
j
=
1
i
w
j
\sum_{j=1}^{i-1}w_j\le y < \sum_{j=1}^{i}w_j
j=1∑i−1wj≤y<j=1∑iwj
则输出i,即选取的变量为
x
i
x_i
xi
代码如下:
#! C:/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
---------------------------------------------------------
Name:geneticAlgorithm
Description:
Author:qinlinjian
Date:2022-07-12
---------------------------------------------------------
Change Activity:2022-07-12
"""
__author__ = "qin"
__version__ = "1.0.0"
import numpy as np
"""
返回一个索引数字
"""
def weight_sampling(w_list):
ran = np.random.uniform(0,1)
sum=0
for i in range(len(w_list)):
sum+=w_list[i]
if(ran<sum):
return i
if __name__ == '__main__':
w_list = [0.25,0.6,0.15]
num_list=[]
for i in range(1000000):
num_list.append(weight_sampling(w_list))
account_list = [num_list.count(0),num_list.count(1),
num_list.count(2)]# 进行计数
print(account_list)
print("选取第一个数的概率:",account_list[0] / sum(account_list))
print("选取第二个数的概率:",account_list[1] / sum(account_list))
print("选取第三个数的概率:",account_list[2] / sum(account_list))
输出结果:
[249459, 601092, 149449]
选取第一个数的概率: 0.249583
选取第二个数的概率: 0.601123
选取第三个数的概率: 0.149294
如结果所示,选取到的变量的概率是符合一开始所设定的权重。