python中在指定概率分布的情况下,为什么设定随机数种子仍影响random.choice的结果? Python中的加权随机样本问题,怎么解决

python\u4e0b\u5173\u4e8enp.random.choice()\u7684\u95ee\u9898

dict\u5bf9\u8c61\u53ea\u6709keys\u51fd\u6570\u3002

\u6211\u4eec\u5e73\u65f6\u6bd4\u8f83\u591a\u4f1a\u9047\u5230\u7684\u4e00\u79cd\u60c5\u666f\u662f\u4ece\u4e00\u5806\u7684\u6570\u636e\u4e2d\u968f\u673a\u9009\u62e9\u4e00\u4e2a, \u5927\u591a\u6570\u6211\u4eec\u4f7f\u7528random\u5c31\u591f\u4e86, \u4f46\u662f\u5047\u5982\u6211\u4eec\u8981\u9009\u53d6\u7684\u8fd9\u5806\u6570\u636e\u5206\u522b\u6709\u81ea\u5df1\u7684\u6743\u91cd, \u4e5f\u5c31\u662f\u4ed6\u4eec\u88ab\u9009\u62e9\u7684\u6982\u7387\u662f\u4e0d\u4e00\u6837\u7684, \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b, \u5c31\u9700\u8981\u4f7f\u7528\u52a0\u6743\u968f\u673a\u6765\u5904\u7406\u8fd9\u4e9b\u6570\u636e
1. \u7b80\u5355\u7ebf\u6027\u65b9\u6cd5
\u4e0b\u9762\u662f\u4e00\u79cd\u7b80\u5355\u7684\u65b9\u6848, \u4f20\u5165\u6743\u91cd\u7684\u5217\u8868(weights), \u7136\u540e\u4f1a\u8fd4\u56de\u968f\u673a\u7ed3\u679c\u7684\u7d22\u5f15\u503c(index), \u6bd4\u5982\u6211\u4eec\u4f20\u5165[2, 3, 5], \u90a3\u4e48\u5c31\u4f1a\u968f\u673a\u7684\u8fd4\u56de0(\u6982\u73870.2), 1(\u6982\u73870.3), 2(\u6982\u73870.5)
\u7b80\u5355\u7684\u601d\u8def\u5c31\u662f\u628a\u6240\u6709\u7684\u6743\u91cd\u52a0\u548c, \u7136\u540e\u968f\u673a\u4e00\u4e2a\u6570, \u770b\u770b\u843d\u5728\u54ea\u4e2a\u533a\u95f4
import random

def weighted_choice(weights):
totals = []
running_total = 0

for w in weights:
running_total += w
totals.append(running_total)

rnd = random.random() * running_total
for i, total in enumerate(totals):
if rnd < total:
return i

2. \u52a0\u901f\u641c\u7d22
\u4e0a\u9762\u8fd9\u4e2a\u65b9\u6cd5\u770b\u8d77\u6765\u975e\u5e38\u7b80\u5355, \u5df2\u7ecf\u53ef\u4ee5\u5b8c\u6210\u6211\u4eec\u6240\u8981\u7684\u52a0\u6743\u968f\u673a, \u7136\u662f\u6700\u540e\u7684\u8fd9\u4e2afor\u5faa\u73af\u8c8c\u4f3c\u6709\u4e9b\u5570\u55e6, Python\u6709\u4e2a\u5185\u7f6e\u65b9\u6cd5bisect\u53ef\u4ee5\u5e2e\u6211\u4eec\u52a0\u901f\u8fd9\u4e00\u6b65
import random
import bisect

def weighted_choice(weights):
totals = []
running_total = 0

for w in weights:
running_total += w
totals.append(running_total)

rnd = random.random() * running_total
return bisect.bisect_right(totals, rnd)

bisect\u65b9\u6cd5\u53ef\u4ee5\u5e2e\u6211\u4eec\u67e5\u627ernd\u5728totals\u91cc\u9762\u5e94\u8be5\u63d2\u5165\u7684\u4f4d\u7f6e, \u4e24\u4e2a\u65b9\u6cd5\u770b\u8d77\u6765\u5dee\u4e0d\u591a, \u4f46\u662f\u7b2c\u4e8c\u4e2a\u4f1a\u66f4\u5feb\u4e00\u4e9b, \u53d6\u51b3\u4e8eweights\u8fd9\u4e2a\u6570\u7ec4\u7684\u957f\u5ea6, \u5982\u679c\u957f\u5ea6\u5927\u4e8e1000, \u5927\u7ea6\u4f1a\u5feb30%\u5de6\u53f3
3. \u53bb\u6389\u4e34\u65f6\u53d8\u91cf
\u5176\u5b9e\u5728\u8fd9\u4e2a\u65b9\u6cd5\u91cc\u9762totals\u8fd9\u4e2a\u6570\u7ec4\u5e76\u4e0d\u662f\u5fc5\u8981\u7684, \u6211\u4eec\u8c03\u6574\u4e0b\u7b56\u7565, \u5c31\u53ef\u4ee5\u5224\u65ad\u51faweights\u4e2d\u7684\u4f4d\u7f6e
def weighted_choice(weights):
rnd = random.random() * sum(weights)
for i, w in enumerate(weights):
rnd -= w
if rnd < 0:
return i

\u8fd9\u4e2a\u65b9\u6cd5\u6bd4\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7adf\u7136\u5feb\u4e86\u4e00\u500d, \u5f53\u7136, \u4ece\u7b97\u6cd5\u89d2\u5ea6\u89d2\u5ea6, \u590d\u6742\u5ea6\u662f\u4e00\u6837\u7684, \u53ea\u4e0d\u8fc7\u6211\u4eec\u628a\u8d4b\u503c\u4e34\u65f6\u53d8\u91cf\u7684\u529f\u592b\u7701\u4e0b\u6765\u4e86, \u5176\u5b9e\u5982\u679c\u4f20\u8fdb\u6765\u7684weights\u662f\u5df2\u7ecf\u6309\u7167\u4ece\u5927\u5230\u5c0f\u6392\u5e8f\u597d\u7684\u8bdd, \u901f\u5ea6\u4f1a\u66f4\u5feb, \u56e0\u4e3arnd\u9012\u51cf\u7684\u901f\u5ea6\u6700\u5feb(\u5148\u51cf\u53bb\u6700\u5927\u7684\u6570)
4. \u66f4\u591a\u7684\u968f\u673a\u6570
\u5982\u679c\u6211\u4eec\u4f7f\u7528\u540c\u4e00\u4e2a\u6743\u91cd\u6570\u7ec4weights, \u4f46\u662f\u8981\u591a\u6b21\u5f97\u5230\u968f\u673a\u7ed3\u679c, \u591a\u6b21\u7684\u8c03\u7528weighted_choice\u65b9\u6cd5, totals\u53d8\u91cf\u8fd8\u662f\u6709\u5fc5\u8981\u7684, \u63d0\u524d\u8ba1\u7b97\u597d\u5b83, \u6bcf\u6b21\u83b7\u53d6\u968f\u673a\u6570\u7684\u6d88\u8017\u4f1a\u53d8\u5f97\u5c0f\u5f88\u591a
class WeightedRandomGenerator(object):
def __init__(self, weights):
self.totals = []
running_total = 0

for w in weights:
running_total += w
self.totals.append(running_total)

def next(self):
rnd = random.random() * self.totals[-1]
return bisect.bisect_right(self.totals, rnd)

def __call__(self):
return self.next()

\u5728\u8c03\u7528\u6b21\u6570\u8d85\u8fc71000\u6b21\u7684\u65f6\u5019, WeightedRandomGenerator\u7684\u901f\u5ea6\u662fweighted_choice\u7684100\u500d
\u6240\u4ee5\u6211\u4eec\u5728\u5bf9\u540c\u4e00\u7ec4\u6743\u91cd\u5217\u8868\u8fdb\u884c\u591a\u6b21\u8ba1\u7b97\u7684\u65f6\u5019\u9009\u62e9\u65b9\u6cd54, \u5982\u679c\u5c11\u4e8e100\u6b21, \u5219\u4f7f\u7528\u65b9\u6cd53
5. \u4f7f\u7528accumulate
\u5728python3.2\u4e4b\u540e, \u63d0\u4f9b\u4e86\u4e00\u4e2aitertools.accumulate\u65b9\u6cd5, \u53ef\u4ee5\u5feb\u901f\u7684\u7ed9weights\u6c42\u7d2f\u79ef\u548c
>>>> from itertools import accumulate
>>>> data = [2, 3, 5, 10]
>>>> list(accumulate(data))
[2, 5, 10, 20]

运行结果是符合p分布的

for循环改成1000次试试,3、2、0出现的次数分别是587、299、114次,符合0.6、0.3、0.1

import numpy as np

i3 = i2 = i0 = 0
for seed in np.arange(1000):
    np.random.seed(seed)
    n = np.random.choice(5,p=[0.1, 0, 0.3, 0.6, 0])
    i3 += n==3
    i2 += n==2
    i0 += n==0
print(i3, i2, i0)

随机种子确实影响结果

但不是影响结果的分布情况,而是影响计算机产生随机数的情况,你运行1000次结果一定和我一样,就是因为我们的随机种子给的都是一样的。

随机种子

我们知道计算机无法产生真正的随机数,是通过算法产生的伪随机数,但具有类似于真正随机数的统计特征,如均匀性、独立性等。

随机种子的作用在于给定这个产生随机数算法的初值。给定后会影响以后产生随机数的具体值是多少,但不影响这些随机数的分布情况。

上面那个程序,如果我们不指定随机种子,那么结果符合p分布,但你与我结果不同,同一段代码多次运行结果也不同。如果指定随机种子,那么结果依然符合p分布,但全天下人运行结果都相同。

如果已知两粒种子(随机种子)和两个生长环境(产生随机数算法)都完完全全一样,那么可以得出长出的两个作物完全一样(忽略量子力学影响)。但这两粒种子无论相同与否都不会影响长出的作物到底是玉米还是高粱(不影响结果分布情况)。



  • 濡備綍鐢python浣垮彉閲忔湇浠庢澶鍒嗗竷?
    绛旓細姝eお鍒嗗竷鍝堝搱 棣栧厛锛屽鏋滄兂瑕佷綘鐨勪竴鍗冧竾涓暟鎹弗鏍兼湇浠庢鎬佸垎甯冿紝閭d箞鍏堢‘瀹氳繖涓鍒嗗竷鐨鏁版嵁锛屼篃灏辨槸鍧囧煎拰鏂瑰樊锛孨(u,o)锛岃繖閲屽潎鍊 u=50锛屾柟宸 o 鐢变綘纭畾锛屾牴鎹鎬鍒嗗竷姒傜巼瀵嗗害鍑芥暟锛屽浜庢瘡涓涓 1~100 涔嬮棿鐨勬暣鏁 x锛岄兘鍙互纭畾瀹冨嚭鐜扮殑姒傜巼 f(x)锛氭鎬佸垎甯冩鐜囧瘑搴﹀嚱鏁 鑰屽叡鏈 10 000 000 ...
  • 杩欎釜鍥鎬庝箞鐢╫rigin鎴python鐢?
    绛旓細绀轰緥鏁版嵁 data = np.random.randn(100)鍒涘缓涓涓姒傜巼瀵嗗害鍥 sns.kdeplot(data)璁剧疆鏍囬鍜岃酱鏍囩 plt.title('姒傜巼瀵嗗害鍥')plt.xlabel('X杞')plt.ylabel('瀵嗗害')鏄剧ず鍥惧舰 plt.show()杩欎釜渚嬪瓙涓紝鎴戜滑浣跨敤浜闅忔満鐢熸垚鐨勬鎬鍒嗗竷鏁版嵁銆傛偍鍙互鏍规嵁闇瑕佹浛鎹㈡垚鑷繁鐨勬暟鎹傛敞鎰忥細鍦ㄤ娇鐢⊿eaborn搴撲箣鍓嶏紝闇瑕...
  • 1鍒100鐨闅忔満鏁
    绛旓細  渚嬪锛屽彲浠ヤ娇鐢╪umpy涓殑randint鍑芥暟鐢熸垚1鍒100涔嬮棿鐨勬暣鏁帮細python import numpy as np num = np銆俽andom銆俽andint(1, 101)缁熻瀛︽柟娉 闄や簡浣跨敤璁$畻鏈虹畻娉曠敓鎴闅忔満鏁板锛岃繕鍙互浣跨敤缁熻瀛︽柟娉曟潵鐢熸垚銆  渚嬪锛屽彲浠ヤ娇鐢ㄥ潎鍖鍒嗗竷鎴栨鎬佸垎甯冩潵鐢熸垚闅忔満鏁般鍦≒ython涓锛屽彲浠ヤ娇鐢...
  • Numpy妯″潡_rand()鍑芥暟銆乺andn()鍑芥暟銆乺andint()鍑芥暟鍒涘缓闅忔満鏁扮粍...
    绛旓細1銆乺and()鍑芥暟锛氬尯闂村唴鐨勬诞鐐规暟闅忔満鏁扮粍rand()鍑芥暟鐢熸垚鐨勬暟缁勪腑锛屾瘡涓厓绱犻兘鍦╗0, 1)鐨勫尯闂村唴锛岃繖瀵逛簬闇瑕佹ā鎷姒傜巼鍒嗗竷鎴栬繘琛岄殢鏈哄疄楠岀殑鍦烘櫙闈炲父鏈夌敤銆備緥濡傦紝鍒涘缓涓涓竴缁撮殢鏈烘暟缁勶細import numpy as npe = np.random.rand(3)print(e)杈撳嚭鐨勬槸涓缁刐0, 1)鑼冨洿鍐呯殑闅忔満娴偣鏁帮紝鏁扮粍褰㈢姸涓(3,)2...
  • python鏁版嵁缁熻鍒嗘瀽
    绛旓細涓嬩緥涓敤瀹冩楠屾鎬佸垎甯冦 (2) 绀轰緥 (3) 缁撴灉鍒嗘瀽  鐢熸垚300涓湇浠嶯(0,1)鏍囧噯姝f鍒嗗竷鐨勯殢鏈鏁,鍦ㄤ娇鐢╧-s妫楠岃鏁版嵁鏄惁鏈嶄粠姝f佸垎甯,鎻愬嚭鍋囪:x浠庢鎬佸垎甯冦傛渶缁堣繑鍥炵殑缁撴灉,p-value=0.9260909172362317,姣鎸囧畾鐨勬樉钁楁按骞(涓鑸负5%)澶,鍒欐垜浠笉鑳芥嫆缁濆亣璁:x鏈嶄粠姝f佸垎甯冦傝繖骞朵笉鏄x鏈嶄粠姝f佸垎甯冧竴瀹...
  • python涓鐢ㄥ彾璐濇柉妯″瀷缁撴灉寰楀嚭1.0姝e父鍚
    绛旓細python涓鐢ㄥ彾璐濇柉妯″瀷缁撴灉寰楀嚭1.0姝e父銆傛牴鎹煡璇㈢浉鍏宠祫鏂欎俊鎭樉绀猴紝璐濆彾鏂柟娉曠敤姒傜巼鍒嗗竷鏉ヨ〃绀鸿繖浜涙ā鍨嬪弬鏁扮殑涓嶇‘瀹氭э紝鎵寰楀嚭鐨勭粨鏋滈兘鏄1銆傝礉鍙舵柉棰勬祴妯″瀷鏄繍鐢ㄨ礉鍙舵柉缁熻杩涜鐨勪竴绉嶉娴嬨
  • 璇讳功绗旇-姒傜巼璐ㄩ噺鍑芥暟
    绛旓細2鍒嗙殑姒傜巼涓0.36锛岃繖浣撶幇浜嗛殢鏈哄彉閲鍒嗗竷鐨澶氭牱鎬с傛荤殑鏉ヨ锛屾鐜囪川閲忓嚱鏁版槸绂绘暎闅忔満鍙橀噺鐨勫熀鐭筹紝瀹冮氳繃鎻愪緵姣忎釜鍙兘缁撴灉鐨勬鐜囷紝甯姪鎴戜滑鐞嗚В鍜岄娴嬮殢鏈轰簨浠剁殑瑙勫緥銆鍦≒ython鐨scipy搴撲腑锛屾垜浠彲浠ラ氳繃stats.binom.pmf鍑芥暟鏉ヨ交鏉捐绠楀拰鍙鍖栬繖浜姒傜巼鍒嗗竷锛岃繖瀵逛簬鐞嗚В鍜屽簲鐢ㄦ鐜囪鏈夌潃涓嶅彲蹇借鐨勪环鍊笺
  • python瀹炵幇璧勪骇閰嶇疆(2)--Blacklitterman 妯″瀷
    绛旓細鍦 python瀹炵幇璧勪骇閰嶇疆(1)---Markowitz 鎶曡祫缁勫悎妯″瀷 涓, 鎴戜滑宸茬粡瑙佽繃濡備綍浣跨敤Markowitz姹傚緱鏈浼樿祫浜ч厤姣. 杩欐槸涓绉嶅湪宸茬煡鏈潵鍚勮祫浜х殑姒傜巼鍒嗗竷,鐒跺悗鍐嶆眰瑙g殑鏂规硶.Markowitz妯″瀷杈撳叆鍙傛暟鍖呮嫭鍘嗗彶鏁版嵁娉曞拰鎯呮櫙鍒嗘瀽娉曚袱绉嶆柟娉,鎯呮櫙鍒嗘瀽娉曠殑缂虹偣鏄富瑙傚洜绱,闅忔剰鎬уお寮,鍥犳浣跨敤鍘嗗彶鏁版嵁娉, 灏嗚祫浜х殑鍧囧煎拰鍗...
  • python涓max鍑芥暟浠涔堟剰鎬
    绛旓細缁殑鎯呭喌涓嬶紝杩橀渶瑕佸姒傜巼瀵嗗害鏈変竴瀹氱殑璁よ瘑锛屼竴瀹氳濂藉ソ鐞嗚В鈥滃瘑搴︹濅簩瀛楋紝杩欐牱浣犲氨鑳界悊瑙d负浠涔堟鐜囧彲浠ョ敱姒傜巼瀵嗗害绉垎寰楀埌浜嗭紝鍋囪x,y鐨勮仈鍚堟鐜囧瘑搴鍒嗗竷涓篺(x,y),閭d箞P(min(x,y)銆python涓max鍑芥暟鎸囩殑鏄渶澶х殑鎰忔濓紝鍙互浣跨敤max鍑芥暟鏉ヨ幏鍙鎸囧畾鍙傛暟鐨勬渶澶у硷紝鍙傛暟鍙互涓哄簭鍒楋紝璇ax鍑芥暟璇硶鏍煎紡锛...
  • 绁炵粡缃戠粶鍩虹閮ㄤ欢-BN灞傝瑙
    绛旓細姝f佸垎甯冿紝浠ュ叾渭锛堜綅缃弬鏁帮級鍜屜冿紙灏哄害鍙傛暟锛夌殑閲嶈鎬э紝甯歌瑙嗕负鏈绠娲佺殑杩炵画鍒嗗竷锛屽叾鏍囧噯褰㈠紡璁颁负 銆傛鎬佸垎甯冪殑榄呭姏鍦ㄤ簬鍏堕氳繃鏈澶х喌鍘熺悊璧嬩簣鏁版嵁鏈灏戠殑鍏堥獙缁撴瀯銆備娇鐢Python搴撳NumPy锛屾垜浠彲浠ラ氳繃np.random.normal杞绘澗鐢熸垚姝f鍒嗗竷鐨勯殢鏈鏁板苟瑙傚療鍏舵洸绾裤傜劧鑰岋紝娣卞害瀛︿範璁粌涓紝Internal Covariate ...
  • 扩展阅读:python按指定条件筛选 ... python循环语句跳出和跳回 ... python提取指定内容 ... python查找表中特定元素 ... python中删除列表中元素 ... [:3]在python中是什么 ... python查找替换特定字符串 ... 怎么输出列表里的元素 ... python去除列表中指定元素 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网