最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Python中的隨機采樣和概率分布

 更新時間:2021年12月06日 08:38:36   作者:Orion's Blog  
Python中包含了很多概率算法,包括基礎(chǔ)的隨機采樣以及許多經(jīng)典的概率分布生成。本文主要介紹了我們在機器學(xué)習(xí)中常用的概率函數(shù)。感興趣的同學(xué)可以了解一下

?Python(包括其包Numpy)中包含了了許多概率算法,包括基礎(chǔ)的隨機采樣以及許多經(jīng)典的概率分布生成。我們這個系列介紹幾個在機器學(xué)習(xí)中常用的概率函數(shù)。先來看最基礎(chǔ)的功能——隨機采樣。

1. random.choice

如果我們只需要從序列里采一個樣本(所有樣本等概率被采),只需要使用random.choice即可:

import random
res1 = random.choice([0, 1, 2, 3, 4])
print(res1) # 3

2. random.choices(有放回)

當然,很多時候我們不只需要采一個數(shù),而且我們需要設(shè)定序列中每一項被采的概率不同。此時我們可以采用random.random.choices函數(shù), 該函數(shù)用于有放回的(即一個數(shù)據(jù)項可以被重復(fù)采多次)對一個序列進行采樣。其函數(shù)原型如下:

random.choices(population, weights=None, *, cum_weights=None, k=1)

population: 欲采樣的序列

weights: 每個樣本被賦予的權(quán)重(又稱相對權(quán)重),決定每個樣本被采的概率,如[10, 0, 30, 60, 0]

cum_weights: 累積權(quán)重,相對權(quán)重[10, 0, 30, 60, 0]相當于累積權(quán)重[10, 10, 40, 100, 100]

我們從[0, 1, 2, 3, 4]中按照相對權(quán)重采樣3個樣本如下:

res2 = random.choices([0, 1, 2, 3, 4], weights=[10, 0, 30, 60, 0], k=3)
# 注意population不是關(guān)鍵字參數(shù),在函數(shù)調(diào)用時不能寫成population=[0,1,2,3,4]來傳參
# 關(guān)于關(guān)鍵字參數(shù)和位置參數(shù),可以參看我的博客《Python技法2:函數(shù)參數(shù)的進階用法》https://www.cnblogs.com/orion-orion/p/15647408.html
print(res2) # [3, 3, 2]

從[0, 1, 2, 3, 4]中按照累積權(quán)重采樣3和樣本如下:

res3 = random.choices([0, 1, 2, 3, 4], cum_weights=[10, 10, 40, 100, 100], k=3)
print(res3) # [0, 3, 3]

注意,相對權(quán)重weights和累計權(quán)重cum_weights不能同時傳入,否則會報TypeError異常'Cannot specify both weights and cumulative weights'

3. numpy.sample(無放回)

random.sample是無放回,如果我們需要無放回采樣(即每一項只能采一次),那我們需要使用random.sample。需要注意的是,如果使用該函數(shù),將無法定義樣本權(quán)重。該函數(shù)原型如下:

random.sample(population, k, *, counts=None)?

population: 欲采樣的序列

k: 采樣元素個數(shù)

counts: 用于population是可重復(fù)集合的情況,定義集合元素的重復(fù)次數(shù)。sample(['red', 'blue'], counts=[4, 2], k=5)等價于sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)

我們無放回地對序列[0, 1, 2, 3, 4]采樣3次如下:

res3 = random.sample([0, 1, 2, 3, 4], k=3)
print(res3) # [3, 2, 1]

無放回地對可重復(fù)集合[0, 1, 1, 2, 2, 3, 3, 4]采樣3次如下:

res4 = random.sample([0, 1, 2, 3, 4], k=3, counts=[1, 2, 2, 2, 1])
print(res4) # [3, 2, 2]

如果counts長度和population序列長度不一致,會拋出異常ValueError:"The number of counts does not match the population"。

4.rng.choices 和 rng.sample

還有一種有放回采樣實現(xiàn)方法是我在論文[1]的代碼[2]中學(xué)習(xí)到的。即先定義一個隨機數(shù)生成器,再調(diào)用隨機數(shù)生成器的choices方法或sample方法,其使用方法和random.choice/random.sample函數(shù)相同。

rng_seed = 1234
rng = random.Random(rng_seed)
res5 = rng.choices(
     population=[0,1,2,3,4],
     weights=[0.1, 0, 0.3, 0.6, 0],
     k=3,
)
print(res5) # [3, 3, 0]

res6 = rng.sample(
     population=[0, 1, 2, 3, 4],
     k=3,
)
print(res6) # [4, 0, 2]

這兩個函數(shù)在論文[1]的實現(xiàn)代碼[2]中用來隨機選擇任務(wù)節(jié)點client:

def sample_clients(self):
        """
        sample a list of clients without repetition

        """
        rng_seed = (seed if (seed is not None and seed >= 0) else int(time.time()))
        self.rng = random.Random(rng_seed)

        if self.sample_with_replacement:
            self.sampled_clients = \
                self.rng.choices(
                    population=self.clients,
                    weights=self.clients_weights,
                    k=self.n_clients_per_round,
                )
        else:
            self.sampled_clients = self.rng.sample(self.clients, k=self.n_clients_per_round)

5. numpy.random.choices

從序列中按照權(quán)重分布采樣也可以采用numpy.random.choice實現(xiàn)。其函數(shù)原型如下:

random.choice(a, size=None, replace=True, p=None)

a: 1-D array-like or int ? 如果是1-D array-like,那么樣本會從其元素中抽取。如果是int,那么樣本會從np.arange(a)中抽取;

size: int or tuple of ints, optional ? 為輸出形狀大小,如果給定形狀為(m,n,k),那么m×n×k的樣本會從中抽取。默認為None,即返回一個單一標量。

replace: boolean, optional ? 表示采樣是又放回的還是無放回的。若replace=True,則為又放回采樣(一個值可以被采多次),否則是無放回的(一個值只能被采一次)。

p: 1-D array-like, optional ? 表示a中每一項被采的概率。如果沒有給定,則我們假定a中各項被采的概率服從均勻分布(即每一項被采的概率相同)。

從[0,1,2,3,4,5]中重復(fù)/不重復(fù)采樣3次如下:

import numpy as np
res1 = np.random.choice(5, 3, replace=True)
print(res1) # [1 1 4]

res2 = np.random.choice(5, 3, replace=False)
print(res2) # [2 1 4]

同樣是[0,1,2,3,4,5]中重復(fù)/不重復(fù)采樣3次,現(xiàn)在來看我們?yōu)槊總€樣本設(shè)定不同概率的情況:

res3 = np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
print(res3)  # [2 3 3]

res4 = np.random.choice(5, 3, replace=False, p=[0.1, 0, 0.3, 0.6, 0])
print(res4) # [3 2 0]

參考文獻

https://github.com/omarfoq/FedEM

https://www.python.org/

https://numpy.org/

到此這篇關(guān)于淺析Python中的隨機采樣和概率分布的文章就介紹到這了,更多相關(guān)Python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python技巧分享之如何將字符串轉(zhuǎn)回DataFrame格式

    Python技巧分享之如何將字符串轉(zhuǎn)回DataFrame格式

    平常我們使用pandas,一般使用的是DataFrame和Series,但個別交換數(shù)據(jù)的時候,只能使用字符串,那如何再將字符串再轉(zhuǎn)回DataFrame格式呢,本文就來和大家講講解決辦法
    2023-06-06
  • 使用Python編寫文件重復(fù)檢查器的完整代碼

    使用Python編寫文件重復(fù)檢查器的完整代碼

    在日常工作中,我們經(jīng)常需要處理大量文件,但有時候會遇到文件重復(fù)的情況,為了有效管理文件并避免重復(fù)占用存儲空間,我們可以編寫一個簡單的Python程序來檢查文件夾中是否存在重復(fù)文件,本文將介紹如何使用Python和其庫來編寫一個文件重復(fù)檢查器
    2024-08-08
  • Python如何使用type()函數(shù)查看數(shù)據(jù)的類型

    Python如何使用type()函數(shù)查看數(shù)據(jù)的類型

    這篇文章主要介紹了Python如何使用type()函數(shù)查看數(shù)據(jù)的類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python獲取當前日期和時間的方法

    python獲取當前日期和時間的方法

    這篇文章主要介紹了python獲取當前日期和時間的方法,涉及Python操作日期與時間的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 詳解Python中enumerate函數(shù)的使用

    詳解Python中enumerate函數(shù)的使用

    Python?的?enumerate()?函數(shù)就像是一個神秘的黑箱,它具有非常有用的高級用法。本文就來為大家詳細講一下它的使用,需要的可以參考一下
    2022-08-08
  • Pyqt5將多個類組合在一個界面顯示的完整示例

    Pyqt5將多個類組合在一個界面顯示的完整示例

    這篇文章主要給大家介紹了關(guān)于Pyqt5將多個類組合在一個界面顯示的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • Python?Pandas實現(xiàn)將嵌套JSON數(shù)據(jù)轉(zhuǎn)換DataFrame

    Python?Pandas實現(xiàn)將嵌套JSON數(shù)據(jù)轉(zhuǎn)換DataFrame

    對于復(fù)雜的JSON數(shù)據(jù)進行分析時,通常的做法是將JSON數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為Pandas?DataFrame,所以本文就來看看將嵌套JSON數(shù)據(jù)轉(zhuǎn)換為Pandas?DataFrame的具體方法吧
    2024-01-01
  • python自動保存百度盤資源到百度盤中的實例代碼

    python自動保存百度盤資源到百度盤中的實例代碼

    這篇文章主要介紹了python自動保存百度盤資源到百度盤中的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • python如何獲取服務(wù)器硬件信息

    python如何獲取服務(wù)器硬件信息

    這篇文章主要為大家詳細介紹了python獲取服務(wù)器硬件信息的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 如何理解python中數(shù)字列表

    如何理解python中數(shù)字列表

    在本篇文章里小編給大家分享的是關(guān)于python中數(shù)字列表知識點詳解,有興趣的朋友們可以參考下。
    2020-05-05

最新評論

外汇| 乌拉特中旗| 西吉县| 益阳市| 乐业县| 白河县| 黑水县| 平利县| 乳源| 富川| 温宿县| 任丘市| 巴楚县| 台北市| 康马县| 广河县| 大同市| 博野县| 包头市| 舟曲县| 南漳县| 金门县| 遂昌县| 云和县| 霍山县| 方正县| 宕昌县| 连州市| 仙桃市| 同江市| 渭源县| 安岳县| 土默特左旗| 滨海县| 红河县| 响水县| 措勤县| 桐柏县| 正宁县| 抚顺县| 利川市|