베이스 추정 분석(2)・테스트 부정행위 발견 알고리즘

11672 단어 Python베이스 추정

베이스 추론 해석 예제;부정행위를 하는 학생이 있습니까?


파이톤이 체험한 베스의 추론


"Pythhon 체험의 Bays 추론".
베스 추론을 통해 부정행위를 한 학생이 있습니까?이런 문제.
시험에서 부정행위를 하는 학생의 비율은?
문제는 두 가지 분포를 이용해 학생들이 시험에서 부정행위를 하는 빈도를 찾아보려 했지만 자세히 생각해 보면 부정행위를 솔직히 할 수 없기 때문에 아래의'부정행위 발견 알고리즘'을 고려했다.
"커닝 발견 알고리즘"
시험이 끝난 면접에서는 면접관이 보지 못하도록 동전을 던진다.여기에 표가 있으면 학생들은 솔직하게 대답하는 것에 동의한다.안에 드러나면 보이지 않기 위해 동전을 한 번 더 던진다.그러자 "네, 커닝했어요."라고 정면으로 대답했다.

처음
두번째
커닝하는 사람
무경험자
테이블
-- 
시험에서 부정행위를 했다
답:없다
뒷면
테이블
시험에서 부정행위를 했다
시험에서 부정행위를 했다
뒷면
뒷면
답:없다
답:없다
따라서 데이터의 절반이 동전을 투입한 결과로 학생들의 프라이버시가 보호된다.또 처음으로 성실한 답변에 동의한 만큼 거짓말을 하지 않는다.이 결과에서 실제 주파수의 후방 분포를 얻을 수 있다.
여기에는 두 가지 분포를 사용한다.
이원 분포의 매개 변수는 두 개다.시행 횟수를 나타내는 N과 한 번 시행에서 하나의 사건이 발생할 확률p를 나타낸다.이원분포는 파송분포와 같은 이산분포이지만 파송분포와 달리 0에서 N까지의 정수 분배 확률에 대한 것이다.(파송 분포는 확률을 0에서 모든 무한대 정수에 분배한다.)
확률 질량 함수는
P( X = k ) =  {{N}\choose{k}}  p^k(1-p)^{N-k}
X \sim \text{Bin}(N,p)
X는 확률 변수이고 p와 N은 매개 변수이다.즉, X가 두 가지 분포를 따른다는 것은 N차 시험에서 사건이 발생한 횟수가 X라는 것을 의미하며, p가 비교적 크면(0~1의 범위 내에서) 여러 사건이 발생하기 쉽다는 것이다.

# -*- coding: utf-8 -*-

import pymc3 as pm
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt

#カンニングした人の真の割合pを事前分布からサンプリングするが、
#pはわからないため、一様分布(Uniform(0, 1))とする。学生数Nは100人とする。
N = 100
with pm.Model() as model:
    p = pm.Uniform("freq_cheating", 0, 1)

#100人の学生に対して(1ならカンニングした、0ならしていない)という確率変数を割り当て、
#それはベルヌーイ分布に従うとする。    
with model:
    true_answers = pm.Bernoulli("truths", p, shape=N, testval=np.random.binomial(1, 0.5, N))

#プライバシーアルゴリズムのステップで、学生1回目のコイン投げをモデリングするため、
#p=1/2のベルヌーイ分布を100回行う。    
with model:
    first_coin_flips = pm.Bernoulli("first_flips", 0.5, shape=N, testval=np.random.binomial(1, 0.5, N))
print(first_coin_flips.tag.test_value)

#2回目のコイン投げをモデリングも同様にする。    
with model:
    second_coin_flips = pm.Bernoulli("second_flips", 0.5, shape=N, testval=np.random.binomial(1, 0.5, N))

import theano.tensor as tt

with model:
    val = first_coin_flips*true_answers + (1 - first_coin_flips)*second_coin_flips
    observed_proportion = pm.Deterministic("observed_proportion", tt.sum(val)/float(N))

print(observed_proportion.tag.test_value)

#面接した結果、100人のうち35人(X)が「カンニングした」と答えたとする。
#このアルゴリズムからは、誰もカンニングしていなければ、25人がカンニングしたと答える。
#全員カンニングしていれば、75人がカンニングしたと答える。
#その中で、

X = 35
with model:
    observations = pm.Binomial("obs", N, observed_proportion, observed=X)

#計算です。spyderの時は、cores=1がいります。jupyternotebookでは、coresはいりません。
with model:
    step = pm.Metropolis(vars=[p])
    trace = pm.sample(40000, step=step,cores=1)
    burned_trace = trace[15000:]

p_trace = burned_trace["freq_cheating"][15000:]
plt.hist(p_trace, histtype="stepfilled", density=True, alpha=0.85, bins=30, 
         label="posterior distribution", color="#348ABD")
plt.vlines([.05, .35], [0, 0], [5, 5], alpha=0.3)
plt.xlim(0, 1)
plt.legend()
plt.show()
결과 1

이 도표에서 가로축은 p의 값(부정행위를 하는 사람)이고 세로축은 주파수이다.'부정행위 발견 알고리즘'에서 확인된 부정행위를 하는 실제 빈도수(p)의 사후 확률을 도표로 보면 결과폭이 크다.그래서 아무것도 모른다고 느낄 수도 있다.하지만 이 일만은 내가 여기서 안다.p의 값은 고르게 분포되어 있지만, '부정행위 발견 알고리즘' 에서는 $p=0달러의 값을 비교적 낮게 평가한다.한 명도 부정행위를 하지 않았다는 것은 아니다.놀랍게도 이 알고리즘은'부정행위는 존재해야 한다'고 판단한다!!
이 계산은 spyder로 하면 엉망진창인 시간이 걸려서 단식홍으로 계산하기가 어렵다고 느낀다.PyMC3에서 진행된 결과 백엔드는 theano를 사용했고 theano의 정보는 매우 적어서 어떻게 다선정으로 계산할 수 있는지 몰랐다.그나저나 jupyternotebook라면 아무것도 하지 않아도 다선정으로 계산할 수 있고, 신경 쓰지 않으면 jupyternotebook로 계산합시다.PyMC4 백엔드가 TensorFlow이기 때문에 이 책을 다 배우고 PyMC4로 바꾸고 싶어요.

좋은 웹페이지 즐겨찾기