質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

4回答

500閲覧

python romdom関数の一様分布に重みをかけたい

onosan

総合スコア59

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/06/30 00:14

1か月を30日として、1か月に2回行動をとるとします。行動を20種類として、random関数を使って、以下のような関数を作成しました。元々、この関数は行動1から行動20までを一様分布でランダムに行動を発生させるつもりでした。ですので、各行動の出現頻度は、全体100% ÷ 20 = 5%になるように設計されているのですが、
これを行動19と行動20をそれぞれ、全体の20%ずつ発生させるためにはどうすればよいでしょうか。random関数で調べて重みのかけ方がわかりませんでした。
ご教授いただけますと幸いです。

python

1def random_part(): 2 days = 30 3 actions = 20 4 do_day = 2 5 do_action = 1 6 7 s = np.hstack([ 8 np.ones((do_day, do_action)), 9 np.zeros((do_day, actions - do_action)), 10 ]) 11 12 # shuffle column wise 13 idx = np.random.rand(*s.shape).argsort(axis=1) 14 s = np.take_along_axis(s, idx, axis=1) 15 16 # shuffle row wise 17 s = np.vstack([s, np.zeros((days-do_day, actions))]).astype(int) 18 np.random.shuffle(s) 19 20 # dataframe 21 df = pd.DataFrame(s, columns=[f'行動{i+1}' for i in range(actions)]) 22 return df

何卒、よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

※ 値を重複して抽出しない様に numpy.random.choicereplace=False を指定

python

1import numpy as np 2import pandas as pd 3 4pd.set_option('display.unicode.east_asian_width', True) 5 6def random_part(): 7 days = 30 8 actions = 20 9 do_day = 2 10 do_action = 1 11 12 s = np.zeros((days, actions), dtype=int) 13 p = np.r_[np.resize(0.6/(actions-2), actions-2), 0.2, 0.2] 14 s[np.random.choice(days, do_day, replace=False), 15 np.random.choice(actions, do_day, replace=False, p=p)] = do_action 16 17 # dataframe 18 df = pd.DataFrame(s, columns=[f'行動{i+1}' for i in range(actions)]) 19 return df 20 21if __name__ == '__main__': 22 print(random_part())

投稿2022/06/30 04:08

編集2022/06/30 04:50
melian

総合スコア19771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onosan

2022/06/30 06:25

ありがとうございます。こちらに気づく前に自分でどんくさく作っていたのですが、こちら、かなり短く洗練されており、大変参考になりました。ありがとうございます。
guest

0

雑にはこれで用が足りるんじゃないですか?

python

1>>> from random import randint, random 2>>> x = random() 3>>> if x < 0.8: 4... action = randint(1, 18) 5... else: 6... action = randint(19, 20)

投稿2022/06/30 02:43

編集2022/06/30 02:44
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のような感じでnumpy.random.choiceを使えば重み付きで値を選択できます。

Python

1import numpy as np 2 3N,M,P = 20,2,0.2 4 5p# トータルで1になるような重みを計算する 6print(p) 7""" 8[0.03333333 0.03333333 0.03333333 0.03333333 0.03333333 0.03333333 9 0.03333333 0.03333333 0.03333333 0.03333333 0.03333333 0.03333333 10 0.03333333 0.03333333 0.03333333 0.03333333 0.03333333 0.03333333 11 0.2 0.2 ] 12""" 13 14ret = np.random.choice(N,10,p=p) 15print(ret) # [ 2 14 2 2 16 18 19 6 10 18]

投稿2022/06/30 02:38

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onosan

2022/06/30 06:27

こちら、参考にさせていただき、自分で作成し終わったところで、別の方がかなりストライクな答えをいただき、こちらもベストアンサーにしたいのですが、そのくらい役に立ちました。ありがとうございます。
guest

0

一様分布から得られた乱数を適当に変換します。

例えば[0,1)の一様分布から得られた値uがあったとして
i(i=0,1,2...)になる重みをw[i]として(wの合計は1とする)、その累積和をs[i](s[0] = 0)としたとき、
s[i] <= u < s[i+1] となるiを探せばいいです。

イメージ説明

投稿2022/06/30 00:46

編集2022/06/30 01:09
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onosan

2022/06/30 01:49

ありがとうございます。少し抽象的で、頭の悪い私には少し難しくて、仮に、コードにするとしたら、どんな感じになるでしょうか。20種類の行動(0~19)の18と19を全体の2割にするイメージなのですが、、、お手数をおかけしてすみません。。。
ozwk

2022/06/30 02:02

すみません、面倒なので嫌です。
ozwk

2022/06/30 02:52 編集

重み付け抽選とか重み付けランダムとかで調べれば出てくると思うのでがんばってください というかよくある処理なのでnumpyで用意されていそうな気もしていたら案の定ありましたね。 can100さんの回答を参照してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問