Hướng dẫn python simulate probability - python mô phỏng xác suất

Các trường hợp sử dụng ứng dụng sử dụng Python

Tôi tin rằng xác suất và đặc biệt là mô phỏng là hai trong số các công cụ hiệu quả nhất mà chúng tôi có trong khi xử lý sự không chắc chắn nhưng rất được sử dụng, đặc biệt là trong các kịch bản kinh doanh trong thế giới thực. Mục tiêu của tôi trong blog này là trải qua một số trường hợp sử dụng mà chúng tôi gặp phải trong cuộc sống hàng ngày và một số trường hợp sử dụng kinh doanh. Tôi sẽ trải qua các trường hợp sử dụng thay vì trải qua toán học và khoa học đằng sau cách nó hoạt động. Hy vọng, những trường hợp sử dụng này sẽ khuyến khích nhiều người trong chúng ta sử dụng các phương pháp tương tự để giải quyết các vấn đề khác nhau mà chúng ta gặp phải trong cuộc sống cá nhân hoặc trong môi trường kinh doanh. Khi chúng ta biết các khái niệm cơ bản và cách đóng khung vấn đề, hầu hết các công việc nặng sẽ được thực hiện bằng gói Python Numpy và Gói cay.

Xác suất và kết quả mô phỏng thường có lợi khi chúng tôi không thể nhận được câu trả lời cho vấn đề của chúng tôi bằng cách sử dụng các mô hình phân tích. Ví dụ, xác suất có nhà đầy đủ trong poker là gì, xác suất của hai người trong phòng có cùng ngày sinh nhật là gì Xác suất mất tiền trong các khoản đầu tư mới, số lượng sản phẩm tối ưu mà doanh nghiệp cần sản xuất để kiếm lợi nhuận là gì, sự kết hợp tối ưu của phân bổ tài sản trong danh mục đầu tư để chúng tôi có đủ tiền để nghỉ hưu và nhiều người khác.

Trong bước đầu tiên, hãy để bắt đầu với cách xác định và đóng khung vấn đề. Có một vài bước cơ bản mà chúng ta cần tuân theo trước bất kỳ bài tập xác suất và mô phỏng.

1. Xây dựng không gian hoặc dân số mẫu và xác định kết quả có thể xảy ra cho các biến ngẫu nhiên

2. Gán xác suất cho từng kết quả, phân phối xác suất và xác định cách mô phỏng kết quả

3. Xác định mối quan hệ giữa nhiều biến ngẫu nhiên và xác định quy tắc thành công

4. Vẽ các mẫu từ phân phối xác suất nhiều lần và đếm thành công

5. Phân tích kết quả mẫu và tính tần số thành công như một ước tính về xác suất

Bây giờ, hãy để nhảy thẳng vào các trường hợp sử dụng và bắt đầu có một số niềm vui. Tôi sẽ trình bày một vài trường hợp sử dụng trong blog này và sự phức tạp của các trường hợp sử dụng sẽ trở nên khó khăn hơn khi chúng tôi đi cùng. Nếu bạn muốn sao chép kết quả của tôi, xin vui lòng kiện giống như của tôi. Và nếu bạn muốn hiểu cách thức hoạt động của mã, vui lòng đọc nhận xét trước mỗi khối mã mô tả những gì mã đang làm.seed as mine. And if you want to understand how the code works, please read the comment before each code block which describes what the code is doing.

  1. Trò chơi xúc xắc

Hãy bắt đầu với 101 xác suất, trò chơi xúc xắc. Ở đây, chúng tôi sẽ chơi một trò chơi xúc xắc. Vì vậy, hãy tạo ra một cái chết sáu mặt với xác suất bằng nhau để hiển thị và xem số chúng ta thấy là gì khi chúng ta lăn xúc xắc. Chúng tôi sẽ sử dụng np.random.choice để mô phỏng kết quả.

# Define die outcomes and probabilitiesimport numpy as np
import pandas as pd
np.random.seed[123]
die, probabilities, throws =[1,2,3,4,5,6], [1/6,1/6,1/6,1/6,1/6,1/6],1
# Use np.random.choice to throw the die once and record the outcome
outcome= np.random.choice[die, size=throws, p=probabilities]
print["The Outcome of the throw is: {}".format[outcome[0]]]

Kết quả của cú ném là 5.

Đó là dễ dàng, chỉ với một biến ngẫu nhiên. Bây giờ, hãy để Lừa xem xét loại trò chơi xúc xắc khác nhau với hai biến ngẫu nhiên trong đó chúng tôi giành chiến thắng nếu hai con xúc xắc hiển thị cùng một số. Một lần nữa, cả hai con xúc xắc đều công bằng với tất cả các con số có cùng một xác suất hiển thị.

Trò chơi của cơ hội ____

Dice cho thấy 5 và 2. Bạn thua!

Vì vậy, chúng tôi đã thua, nhưng hãy để tiếp tục chơi. Ở đây, chúng tôi sẽ thực hiện lấy mẫu ngẫu nhiên lặp đi lặp lại, tức là ném xúc xắc 100.000 lần và xem chúng tôi đã thắng bao nhiêu lần và chúng tôi mất bao nhiêu lần khi mô phỏng một kết quả một khi không cho chúng tôi biết nhiều về mức độ thường xuyên của chúng tôi sẽ thấy kết quả đó.

# Initialize model parameters & simulate dice throw
np.random.seed[111]
die, probabilities, num_dice = [1,2,3,4,5,6], [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], 2
sims, wins= 100000,0
#Write a for loop to repeat throwing the dice.
for i in range[sims]:
outcomes=np.random.choice[die, size=num_dice, p=probabilities]
# Increment `wins` by 1 if the dice show same number
if outcomes[0]==outcomes[1]:
wins=wins+1

print["In {} games, you win {} times. Decision to play or walk away is your choice". format[sims, wins]]

Trong 100000 trò chơi, bạn giành chiến thắng 16911 lần. Quyết định chơi hoặc bỏ đi là lựa chọn của bạn

Trong 100.000 trận đấu, bạn giành chiến thắng 16.911 lần, tức là chúng tôi chỉ thắng 16,91% thời gian, vì vậy tôi sẽ rất cẩn thận trước khi đặt cược tiền trong trò chơi này.

2. Tình huống khó xử xổ số

Trò chơi xổ số

Hãy tạo ra một kịch bản trong đó có cơ hội để giành giải độc đắc xổ số 1.000.000 đô la với 1.000.000 tổng số vé, tức là xác suất giành được là 1 trên 1.000.000 và mỗi vé có giá 5 đô la. Hãy để điều hành mô phỏng với giá 2.000.000 lần và xem mức chi trả trung bình là gì. Nếu chiến thắng trung bình lớn hơn chi phí cho vé, sẽ có ý nghĩa khi mua vé nếu không, thì việc mua vé đó không hợp lý.

# Initialize size and simulate outcome
np.random.seed[111]
lottery_ticket_cost, num_tickets, grand_prize = 5, 1000000, 1000000
chance_of_winning = 1/num_tickets
size = 2000000
payoffs = [-lottery_ticket_cost, grand_prize-lottery_ticket_cost]
probs = [1-chance_of_winning, chance_of_winning]
outcomes = np.random.choice[a=payoffs, size=size, p=probs, replace=True]# Mean of Outcomes
answer=outcomes.mean[]
print["Average payoff from {} simulations = {}".format[size, answer]]

Thanh toán trung bình từ năm 2000000 mô phỏng = -4.0

Vì mức chi trả trung bình của chúng tôi là âm 4 đô la, tôi sẽ tránh xa việc mua vé vì chi phí vé là 5 đô la.

Như tôi đã đề cập trước đó, mô phỏng cho phép chúng tôi hỏi câu trả lời cho các câu hỏi mà mô hình phân tích điển hình không thể trả lời vì mô phỏng cho phép chúng tôi có được nhiều kết quả mẫu thay vì giải quyết công thức toán học phức tạp. Theo ví dụ về xổ số của chúng tôi, hãy để cố gắng hiểu mức giá tối ưu mà chúng ta nên sẵn sàng trả cho vé số dựa trên mức chi trả trung bình của $ 4. Hãy để điều hành mô phỏng 2 triệu lần một lần nữa.

# Initialize simulations and cost of ticket
np.random.seed[111]
sims, lottery_ticket_cost = 2000000, 0
# Use a while loop to increment `lottery_ticket_cost` till average value of outcomes falls below zero
while 1:
outcomes = np.random.choice[[-lottery_ticket_cost, grand_prize-lottery_ticket_cost],
size=sims, p=[1-chance_of_winning, chance_of_winning], replace=True]
if outcomes.mean[] < 0:
break
else:
lottery_ticket_cost += 1
answer = lottery_ticket_cost - 1
print["As the average expected payoff is negative. The highest price at which it makes sense to buy the ticket is {}".format[answer]]

Vì mức chi trả trung bình dự kiến ​​là âm. Giá cao nhất mà nó có ý nghĩa để mua vé là 1.

Bây giờ, chúng ta biết dễ dàng hiểu được các kịch bản khác nhau như thế nào chỉ với một vài dòng mã.

3. Trò chơi poker

Như chúng ta đã biết, trò chơi bài là trò chơi cơ hội và xác suất. Hãy để mô phỏng một số xác suất trong trò chơi poker, trò chơi tôi đang cố gắng học. Trong trò chơi dưới đây, chúng tôi sẽ tạo ra một trò chơi poker nơi mỗi người chơi được xử lý năm thẻ và người chơi có chiến thắng tốt hơn. Hãy để ước tính xác suất nhận được ít nhất hai loại, tức là 2 thẻ của các bộ khác nhau nhưng cùng các giá trị số [ví dụ: 2 trái tim, 2 trong số các thuổng và 3 thẻ khác]. Tôi đã tạo ra một mảng có tên là Deck_of_cards về cơ bản đã tạo ra một bộ bài. Nó là một phần lớn, vì vậy tôi chỉ đặt một vài dòng mã đầu tiên. Chúng tôi sẽ chạy mô phỏng trong 5 triệu lần và ước tính xác suất để có được ít nhất hai loại.

deck_of_cards = [['Heart', 0],['Heart', 1],['Heart', 2],['Heart', 3],['Heart', 4]]# Shuffle deck & count card occurrences in the hand
np.random.seed[111]
n_sims, two_kind = 5000000, 0
for i in range[n_sims]:
np.random.shuffle[deck_of_cards]
hand, cards_in_hand = deck_of_cards[0:5], {}
for card in hand:
# Use .get[] method on cards_in_hand
cards_in_hand[card[1]] = cards_in_hand.get[card[1], 0] + 1

# Condition for getting at least 2 of a kind
highest_card = max[cards_in_hand.values[]]
if highest_card>=2:
two_kind += 1

print["The probability of seeing at least two of a kind = {} ".format[two_kind/n_sims]]

Xác suất nhìn thấy ít nhất hai loại = 0,49331

49% vẫn còn ít hơn là lật một đồng xu, vì vậy tôi sẽ chơi trò chơi không. Bạn biết những gì, tôi sẽ thử. Hãy để, chơi một trò chơi poker nữa.

Lần này để ước tính xác suất của tôi khi nhìn thấy một ngôi nhà đầy đủ. Một ngôi nhà đầy đủ là khi bạn nhận được hai thẻ có bộ đồ khác nhau có cùng giá trị số và ba thẻ khác có cùng giá trị số [ví dụ: 2 của Hearts & Spades, Jacks of Club, Diamonds, & Spades]. Một ngôi nhà đầy đủ là xác suất nhận được chính xác ba trong số một loại có điều kiện để có được chính xác hai loại giá trị khác. Thời gian này, hãy để mô phỏng trò chơi trong 1 triệu lần.Full House. A full house is when you get two cards of different suits that share the same numeric value and three other cards that have the same numeric value [e.g., 2 of hearts & spades, jacks of clubs, diamonds, & spades]. A full house is the probability of getting exactly three of a kind conditional on getting exactly two of a kind of another value.This time let’s simulate the game for 1 million times.

Nhà đầy đủ

Xác suất nhìn thấy một ngôi nhà đầy đủ = 0,001474

0,147% Tôi cách ít hơn những gì tôi mong đợi trong đầu. Vì vậy, tôi không nghĩ rằng tôi sẽ đi đến Full House với xác suất dưới 1%.

4. Vấn đề sinh nhật

Hãy cố gắng giải quyết một vấn đề sinh nhật thú vị khác. Chúng tôi sẽ cố gắng tìm ra có bao nhiêu người chúng tôi cần trong một căn phòng để đảm bảo rằng có 80% cơ hội để hai người trong số những người có chung sinh nhật. Cách dễ nhất để suy nghĩ về vấn đề này là nếu chúng ta có 366 người, thì chúng ta có thể chắc chắn 100% rằng 2 người có cùng sinh nhật với chỉ có 365 ngày trong một năm. Nhưng chúng tôi muốn tìm ra số lượng người mà chúng tôi cần trong một căn phòng có cơ hội 80%. Hãy cùng chạy 2 triệu mô phỏng và xem có bao nhiêu người chúng ta cần giải quyết câu trả lời này.

Vấn đề sinh nhật
# Draw a sample of birthdays & check if each birthday is unique
np.random.seed[123]
days = np.arange[1,366]
people = 2
def birthday_sim[people]:
sims, unique_birthdays = 500000, 0
for _ in range[sims]:
draw = np.random.choice[days, size=people, replace=True]
if len[draw] == len[set[draw]]:
unique_birthdays += 1
out = 1 - unique_birthdays / sims
return out
# Break out of the loop if probability greater than 0.8
while [people > 0]:
prop_bds = birthday_sim[people]
if prop_bds > 0.8:
break
people += 1
print["With {} people, there's a 80% chance that two share a birthday.".format[people]]

Với 35 người, có 80% cơ hội mà hai người chia sẻ sinh nhật.

Không phải là một vấn đề khó để giải quyết sau tất cả các quyền?

5. Tối ưu hóa chi phí

Ở đây chúng tôi sẽ xem xét kịch bản kinh doanh nơi công ty đang cố gắng mô hình hóa sản xuất sản phẩm, sau đó mô hình lợi nhuận và cuối cùng tối ưu hóa chi phí. Hãy bắt đầu bằng cách mô hình hóa việc sản xuất sản phẩm, hãy để nói TV. Giả sử rằng sản xuất TV chỉ phụ thuộc vào 2 yếu tố, người dân chi tiêu và chi phí. Chúng tôi có thể kiểm soát mô hình chi tiêu của mọi người, nhưng chúng tôi có thể kiểm soát chi phí. Hãy để giả sử mô hình chi tiêu thường được phân phối với giá trị trung bình là 1500 và độ lệch chuẩn là 500. Hãy để cho rằng chi phí của chúng tôi được cố định ở mức 20.000 đô la mỗi tháng. Sản xuất TV trong bất kỳ tháng nào là một biến ngẫu nhiên Poisson và sản xuất TV trung bình có thể được thể hiện trong phương trình dưới đây.production of product, then model profit and finally optimize the cost. Let’s start by modeling the production of product, let’s say TV. Assume that TV production depends on just 2 factors, people spending pattern and cost. We can’t control the people spending pattern, but we do can control the cost. Let’s assume spending pattern is normally distributed with mean of 1500 and standard deviation of 500. Let’s assume our cost is fixed at $20,000 per month. TV production in any month is a Poisson random variable and the average tv production can be expressed in equation below.

100 × [chi phí] 0,1 × [chi tiêu] 0,2

# Initialize variables
np.random.seed[111]
cost = 20000
spend = np.random.normal[1500, 500]
# TV Production Model
def tv_produced[spend, cost]:
mean_tv = 100*[cost**0.1]*[spend**0.2]
tv = np.random.poisson[mean_tv]
return tv
# Simulate and print tv production
tv_result = tv_produced[spend, cost]
print["Simulated tv Production = {}".format[tv_result]]

Sản xuất TV mô phỏng = 1051

Vì vậy, dựa trên mô phỏng đơn, chúng ta nên sản xuất 1051 TV trong tháng. Vì vậy, bây giờ, hãy để cố gắng mô hình hóa lợi nhuận giả định giá của TV thường được phân phối với giá trị trung bình là 200 đô la và độ lệch chuẩn là 25 đô la. Trước tiên, hãy tạo chức năng nhu cầu TV và tính lợi nhuận tùy thuộc vào mối quan hệ giữa cung và cầu của TV.

# Tv demand function
np.random.seed[101]
def tv_demanded[price]:
mean_tv = 1000 - 8*price
tv = np.random.poisson[abs[mean_tv]]
return tv
# Function to calculate profits
def profits[cost]:
spend = np.random.normal[1500, 500]
price = np.random.normal[200, 25]
supply = tv_produced[spend, cost]
demand = tv_demanded[price]
equil_short = supply

Bài Viết Liên Quan

Chủ Đề