ここから本文です
OneSegの長寿と健康を願うひとりがき
新人間主義(新自由主義に対抗して); 法人(グローバル企業)に人権はない

書庫RはExcelからRStudio

記事検索
検索

全9ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9]

[ 次のページ ]

ポアソンな世界の有様
 ポアソンな世界は単位時間または空間で仕切られ、その単位の中で事象は平均λで生起する。ターム方式のストラテジーゲームである。
 k回起こる確率を式であらわせば p(k) = λ^k * e^ λ  / k!
 Rでは rpois() で生成(random generation)できる。

set.seed(125)
n<-1000
lambda<-5
poik<-rpois(n, lambda)
barplot(table(poik)/n,col=3,main="Poisson distribution n=1000")
イメージ 1
poi20<-rpois(20, lambda)
barplot(table(poi20)/10,col=4,main="Categolical distribution n=20")
イメージ 3

データからもっともらしい世界像を思い描く
 ポアソン世界から得た 1000個のデータ と 20個のデータ から 今のところ知られていないλを 推定しなければならないとしよう。
 ポアソン世界からのデータであることだけはわかっているとすれば、そのようなデータが得られるはずのλを推定できることになる。(λ値を変えながら今あるデータが得られる確率を計算できれば、どのようなλ値の時今あるデータを得る可能性が最も高いかわかるであろう。)

PrPoi<-function(x,lambda){
  p<-1
  for(ki in 0:max(x)){
    p<-p*exp(-lambda)*lambda^ki/factorial(ki)  }
  p }
#
Likelifood.Poi<-function(x){
  Lk<-NULL
  for( lam in 0:max(x)){
     p<-PrPoi(x=x,lambda=lam)
     Lk<-rbind(Lk,c(lam,p))  }
  Lk[,2]<-Lk[,2]/sum(Lk[,2])
  Lk<-data.frame(Lk)
  names(Lk)<-c("lambda","Likelihood")
  Lk }
#####
#n=1000
LkPoi<-Likelifood.Poi(x=poik)
plot(LkPoi,col=3,type="l",main="Likelihood")
#n=20
LkPoi<-Likelifood.Poi(x=poi20)
lines(LkPoi,col=4)
イメージ 2

共役分布を用いてベイズの企みに参加する 
想像可能な世界と実現されている世界を繋ぐ
ところでガンマ分布は
 dgamma(y, shape, rate) = rate^shape/gamma(shape) *y^(shape-1)*exp(-rate* y)
 dgamma(y, shape, rate=1)  = y^(shape-1)*exp(-y)/gamma(shape) 
とポアソン分布と形が似ていることから共役分布と呼ばれる。

m<-max(c(poi20,poik))
prior<-dgamma(x=0:m,shape=5,rate=1)
plot(x=0:m,y=prior,col=2,type="l", main="Gamma distribution",xlab="lambda")
イメージ 4

ここでピークは4だが平均は5であることが面白い。

#Max
which(prior==max(prior))-1
[1] 4
#Mean
sum(0:m*prior)
[1] 4.926971

ここでベイス の定理を思い起こせば
 Posterior = Liklihood * Prior / Evidence
       =PrPoi(x,lambda) * dgamma(y, shape, rate=1)  / Evidence
                 = k(x,shape) * dgamma(y, x+shape, rate=2)   
                    where k(x,shape)=1/{x!* (shape+1)!} *Evidence

Posterior.Poi<-function(x,a){
  Post<-NULL
  for (l in 0:max(x)){
    p<-1
    for(k in 0:max(x)){
      p<-p*dgamma(l,shape=a+k,rate=2)
    }
    Post<-rbind(Post,c(l,p))   }
  Post<-data.frame(Post)
  names(Post)<-c("Lambda","posterior")
  sp<-sum(Post$posterior)
  Post$posterior<-Post$posterior/sp
  Post }
#####
Post<-Posterior.Poi(x=poik,a=5)
plot(Post,col=3,type="l", main="Posterior distribution")
#
Post<-Posterior.Poi(x=poi20,a=5)
lines(Post,col=4)
イメージ 5

Likelihoodよりそれらしい範囲に収まってはいるが、あくまでも事前分布がもっともらしければということである。

カテゴリカル分布 多項分布 の世界
 カテゴリカルは世界をK個に分ける。K個のサブ世界の比率は λ1 λ2 λ3 ... λk
で、λ1+λ2+λ3+ ... +λk=1 であり それぞれは 0または正 かつ 1または1以下である。1000個のデータを(λ1, λ2, λ3, λ4)=(0.1, 0.2, 0.4, 0.3) の場合
のもとで rmultinom() を用いて抽出できる。

set.seed(126)
n<-1000
lambda<-c(0.1,0.2,0.4,0.3)
k<-length(lambda)
catk<-rmultinom(n,1 ,prob=lambda)
row.names(catk)<-as.character(1:k)
barplot(apply(catk,1,sum)/n,col=3,main="Categolical distribution n=1000")

イメージ 1

このときデータが(λ1, λ2, λ3, λ4)=(0.1, 0.2, 0.4, 0.3)の世界から生み出されたであろう確率を計算できる。ただし定数項
gamma(n)/(gamma(n1)…gamma(nk))*Π λ k^nK
を無視している。

PrCat<-function(x,lambda){
  k<-nrow(x)
  n<-ncol(x)
  p<-1
    for(ki in 1:k){ p<- p*(lambda[ki])^(sum(x[ki,])/n)}
  p}
PrCat(x=catk,lambda=lambda)

[1] 0.2594558

ここでlambdaをいろいろ変えて PrCatを計算すれば データXにふさわしいλがみつかるはずである。
lambdaを過不足なくそろえるのが難しい。

seek4lambda<-function(bigin=c(0,0,0,0),end=c(1,1,1,1),step=c(0.1,0.1,0.1,0.1)){
  la<-NULL
  for(l4 in seq(bigin[4],end[4], step[4])){
    for(l3 in seq(bigin[3] ,min(1-l4,end[3]),step[3])){
      for(l2 in seq(bigin[2], min(1-l4-l3,end[2]),step[2])){
        l1=1-l4-l3-l2
        if (l1>=bigin[1] && l1<=end[1]) la<-rbind(la,c(l1,l2,l3,l4))
  }}}
  la}
#####
la<-seek4lambda(step=c(0.025,0.025,0.025,0.025))
head(la)

##       [,1]   [,2]  [,3] [,4]
## [1,] 1.000 0.000    0    0
## [2,] 0.975 0.025    0    0
## [3,] 0.950 0.050    0    0
## [4,] 0.925 0.075    0    0
## [5,] 0.900 0.100    0    0
## [6,] 0.875 0.125    0    0

このlambdaを順にPrCat(x, lambda)で計算できる。

Likelifood.Cat<-function(x,lam){
  Lk<-NULL
  for (i in 1:nrow(lam)){
    p<-PrCat(x=x,lambda=lam[i,])
    if( p==Inf) p<-0  #
    Lk<-rbind(Lk,c(lam[i,],p))
  }
  Lk<-data.frame(Lk)
  sp<-sum(Lk[,5]) # 1/sp = CONSTANT
  Lk[,5]<-Lk[,5]/sp
  names(Lk)<-c("L1","L2","L3","L4","Likelihood")
  Lk
}
#####
library(scatterplot3d)
col.n<-100
ch.col<-topo.colors(col.n+1,alpha=0.2)
#####
#n=1000
LkCat<-Likelifood.Cat(x=catk,lam=la)
ch.max<-max(LkCat$Likelihood)
col<-ch.col[(1-LkCat$Likelihood/ch.max)*col.n+1]
scatterplot3d(LkCat[,1:3],color=col,pch=20,angle=140,main="Likelihood distribution n=1000")
イメージ 2

ここでLikelihoodが最大になる点を求めることにより、確かに世界に隠されたlamdaをデータXから求めることができる。ML(マキシマムライクリフッド)である。

LkCat[LkCat$Likelihood==max(LkCat$Likelihood),]
##       L1  L2  L3  L4   Likelihood
## 8199 0.1 0.2 0.4 0.3 0.0001633475

さてカテゴリカル分布の共役分布はDirichlet 分布である。

Drch<-function(a,lambda){
  PrD<-NULL  for(n in 1:nrow(lambda)){
    lam<-lambda[n,]
    p<-1
    for(ki in 1:length(a)){
        p<-p*lam[ki]^(a[ki])}
    PrD<-rbind(PrD,c(lam,p))}
  sp<-sum(PrD[,5])
  PrD[,5]<-PrD[,5]/sp
  PrD<-data.frame(PrD)
  names(PrD)<-c("L1","L2","L3","L4","prior")
  PrD}   
#
a<-c(0.1,0.2,0.4,0.3)*5
prior<-Drch(a=a,lambda=la)
ch.max<-max(prior$prior)
col<-ch.col[(1-prior$prior/ch.max)*col.n+1]
scatterplot3d(prior[,1:3],color=col,angle=140,pch=20,main="Dirichlet distribution")
イメージ 3

Bayes’ ruleによれば
  Posterior = Liklihood * Prior / Evidence
ここで
  Liklihood = PrCat(x,λ); Pr(x|λ)
    Prior = Drch(a,λ)       ; Pr(λ)
      Evidence = ∫ PrCat(x,λ)dλ

Posterior.Cat<-function(x,a,lam){
  k<-length(a)
  n<-ncol(x)
  p<-Likelifood.Cat(x,lam)$Likelihood*Drch(a=a,lambda=lam)$prior
  p<-p/sum(p)
  Post<-data.frame(lam,p)
  names(Post)<-c("L1","L2","L3","L4","posterior")
  Post}
#
Post<-Posterior.Cat(x=catk,a=a,lam=la)
ch.max<-max(Post$posterior)
col<-ch.col[(1-Post$posterior/ch.max)*col.n+1]
scatterplot3d(Post[,1:3],color=col,pch=20,angle=140,main="Posterior distribution n=1000")

イメージ 4

ここでposteriorが最大になる点を求めれば、これがMAPと言われているものである。

Post[Post$posterior==max(Post$posterior),]
##       L1  L2  L3  L4    posterior
## 8199 0.1 0.2 0.4 0.3 0.0005428246

ベルヌーイな世界の有様
 ベルヌーイな世界では 事象には 0 OR  1 の札が付けられている。
例えば A党支持派 なら 1 そうでなければ 0 という具合である。
 統計ソフトRでは 

  x1 <- rbinom(30,1,0.3)

 と書いて 3割の支持率がある世界から 30人のサンプルを抽出したことになる。 
 例えば x1 は
[1] 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0
である。 サンプルからの支持率は 6/30=0.2… となるが 0.3からはだいぶ遠い。
世界の実情(支持率=0.3という現実)はなかなか測りがたいが

Bern<-function(x,lambda){
  b<-1
  for(xi in x) b<- b* lambda^xi*(1-lambda)^(1-xi)
  b} 

 から 支持率=lambda の場合に、上のようなデータが抽出される確率を推定できる。尤度(ゆうど) likelifoodと呼んでいる。

データのみからの推計

 f<-function(l) -Bern(x1,l)
optimize(f,c(0,1))$minimum
[1] 0.2000167

 lambda=0.2 のとき データはもっともらしいということになる。
もっともサンプル数を増やせばBernを最大にするlは0.3に近づいてくる。

xk<-rbinom(1000,1,.3)
f<-function(l)-(Bern(xk,l))
optimize(f,c(0,1))$minimum
[1] 0.3039811

尤度のグラフを描けば以下のようになる。

Likelifood.Bern<-function(x){
  Lf<-NULL
  for(lambda in seq(0,1,0.01)){
    l<-(Bern(x,lambda))
    Lf<-rbind(Lf,c(lambda,l)) }
  Lf<-data.frame(lambda=Lf[,1],Likelifood=Lf[,2])
  s<-sum(Lf$Likelifood)
  Lf$Likelifood<-Lf$Likelifood/s
  Lf}
#
plot(Likelifood.Bern(xk),type="l",col=3,main="Likelihood distribution")
lines(Likelifood.Bern(x1),col=4)

イメージ 1

 青が n=30 緑が n=1000 の場合である。サンプル数が増えると隠された世界の値(0.3)に近づいてゆく。

思い込みと事後分布
 あらかじめ事前分布(経験 言い伝え 思い込み 占い 信念 お告げ など)が知られていれば パラメータまたは母数(ここでは平均値)の推定(事後分布)は効率的に(あまり手間と金をかけずに)できるだろう(できたらいいな)。
 ベーズによれば
 Posterior = Likelihood * Prior / Evidence
である。
 Likelihood = Π lambda^xi*(1-lambda)^(1-xi)
であったから Priorに数学的に形の似たBetaを使えば計算が楽になるのである(理論的に正しいと言っているわけではない)。
 Prior = beta(a,b)*renge^(a-1)*(1-renge)^(b-1)
もっともらしくConjugate Distributionなどと呼ぶ。

Beta<-function(a,b,renge=seq(0,1,0.01)){
        prob<-beta(a,b)*renge^(a-1)*(1-renge)^(b-1)
        data.frame(lambda=renge,prb=prob)}
plot(Beta(a=20,b=40),type="l",col=2,main="Distribution of the prior a=20 b=40")
イメージ 2

このとき(a=20,b=40 から得られる値はもっともらしく悪くない経験値であり)Posteriorの分布は以下のようである。

Posterior.Bern<-function(x,a,b,renge){
  prob<-NULL
  for(l in renge){
    p<-Bern(x=x,lambda=l)*Beta(a=a,b=b,renge=l)
    prob<-c(prob,p$prb)}
  sp<-sum(prob)      #1/k(x,c,d) const
  prob<- prob/sp     #Beta(c,d) prob
  data.frame(lambda=renge,prob=prob)}
#
Post1<-Posterior.Bern(x=x1,a=20,b=40,renge=seq(0,1,0.01))
Postk<-Posterior.Bern(x=xk,a=20,b=40,renge=seq(0,1,0.01))

plot(Postk$lambda,Postk$prob,type="l",col=3,main="Posterior distribution a=20, b=40")
lines(Post1$lambda,Post1$prob,col=4)
イメージ 3

 n = 30 でもLikelihoodよりはるかにましになっている。
 ところが予測がいい加減だととんでもないことになる。

Post1<-Posterior.Bern(x=x1,a=20,b=4,renge=seq(0,1,0.01))
Postk<-Posterior.Bern(x=xk,a=20,b=4,renge=seq(0,1,0.01))
plot(Postk$lambda,Postk$prob,type="l",col=3,main="Posterior distribution a=20, b=4")
lines(Post1$lambda,Post1$prob,col=4)
イメージ 4

Data数が多ければ妖言に惑わされることはないが、経験不足の時はまじめに努力しなければならないことがよくわかる。
ベイズはうっかり人生哲学になってしまった。
なんにでも意味を読み取ろうとするのは あまりいい趣味ではないかもしれない。
ちなみにこの時のBetaの分布は以下ようになる。
イメージ 5
 なるほど 右傾化し過ぎかもしれない。

参考:

SHARP SIGHT LABS

SHARP SIGHT LABS
http://www.sharpsightlabs.com/
 
イメージ 1

職を求める人に 必要なスキルが
読み書きそろばん→普通免許→パソコン→統計
からついに データサイエンス になったらしい。
上の小冊子の序文に次のようにある。
-----
So you want to learn analytics and data science. That’s awesome.

Right now, the world has more data than we know what to do with. Some writers have called it “the data deluge,” which sounds hyperbolic, but it’s fairly accurate. Corporations, non-profits, scientists, even individuals now have the ability to capture massive amounts of data.

Meanwhile, the world desperately needs insight. The world is overrun with problems waiting to be solved, we just need insight into how to fix those problems.

So we have plenty of data. And lots of problems waiting to be solved. What we don’t have is enough people to analyze that data. We need insight, but don’t have enough people to produce it.

That’s where you come in. Data science is one of the biggest opportunities of this century. If you can master the skills of data, you’ll not only be able to add massive value to the world by understanding and fixing complex problems, but also capture some of the value you create (in the form of profit).

Want to change the world? Want to create real value and build wealth? Learn data.
-----
それで、あなたは分析学とデータサイエンスを学ぼうと言うわけですね。素晴らしい事です。
今や、世界には、手に負えぬほど沢山のデータがあります。「データ氾濫」と呼んでいる人も居ます。大げさに聞こえますか、でも、それはまさしく正解です。会社、非営利的団体、科学者、一般人でさえ、今や、大量のデータを捕える能力があります。
一方で、世界は明察を是非もなく求めています。解決されなければならない問題が山積みです。まさに問題解決にいたる洞察法が求められているのです。
つまり、たくさんのデータがあり、たくさんの解決されるべき問題があるにもかかわらず、そのデータを分析するに足る十分な数の人材が居ないのです。洞察力を必要としているのに、それを提供できるに十分な人材がいません。
まさしくあなたの出番です。データサイエンスこそは今世紀最大の好機の1つです。
データスキルに熟達することができれば、難問を理解して、解決することによって膨大な価値を世界にもたらすだけでなく、その一部を利益として自ら獲得することもできるでしょう。
世界を変えたいでしょう? 真実の価値を生み出し、富を得たいでしょう?
データを学びましょう。
-----
In this case, you want an “in demand” tool that has the greatest functionality and the lowest cost.
That tool is R.

tool には人気で無料の R が良いらしい。
-----
In the long run, as a data professional, you’ll want to develop skill in three core areas: data acquisition and data shaping (sometimes called data wrangling, or data munging), visualization, and machine learning.

データ取得とデータ整形 視覚化 機械学習 がデータプロフェッショナルの三種の神器らしい。
----
とりあえず 無料で学習できるらしい。
美味しい職にありつけるか…

つらつら前3回を振り返るに 
全行程の
インプットは  N(有限母集団の数)、
        p(母集団の成功率、p*(1-p);母集団の分散)、
        L(信頼区間の幅)であり、
アウトプットは 必要サンプル数 smp.size 
        その検証に必要なサンプル数 n、と
        そこでの成功率c である。
N, pは現象にくっついてくるので、人がなんとかできるのは L;信頼区間の幅であることがわかる。
そこで 引数(N,p,L) 戻り値 (N,smp.size,n,c)の関数を作成

fromNpLen<-function (N,p,L){
  pop.set<-rindex(N,p) #set of population
  ###
  smp.size<-Samplesize(N,Len=L)
  smp.set<-sample(pop.set,smp.size)
  smp.ci<-CI95(mean(smp.set),sd(smp.set)/sqrt(smp.size))
  #
  vld<-Cvalid(smp.ci[1],smp.ci[2],beta=0.1)
  return (c(N,smp.size,vld[[1]]))
}

これを p=0.2, N=c(25,50,100,150,200,400,800,1600,3200,4500,6400,12800) 、L=seq(0.01,0.20,by=0.01) で使いまわしてみる

p<-0.2
smn<-c(25,50,100,150,200,400,800,1600,3200,4500,6400,12800)
L<-seq(0.01,0.20,by=0.01)
for(j in 1:length(L)){
  for(i in 1:k){
    rtm.tmp<-fromNpLen(smn[i],p,L[j])
    if (length(rtm.tmp)<=4) {
      rtm<-rbind(rtm,c(p,L[j],rtm.tmp))
    }
  }
}
#rtm
rtm<-data.frame(rtm)
colnames(rtm)<-c("p","L","pop","smp","c","n")

> head(rtm)
   p    L pop smp  c   n
1 0.2 0.01  25  25  2  12
2 0.2 0.01  50  50  4  26
3 0.2 0.01 100 100  7  55
4 0.2 0.01 150 149 12  84
5 0.2 0.01 200 199 22 111
6 0.2 0.01 400 396 45 220


> tail(rtm)
     p   L   pop smp  c  n
235 0.2 0.2   800  86 13 52
236 0.2 0.2  1600  91 13 53
237 0.2 0.2  3200  93  8 53
238 0.2 0.2  4500  94  9 53
239 0.2 0.2  6400  95 13 51
240 0.2 0.2 12800  95  8 54


smp(標本数)vs. pop(母集団数)をL(信頼区間)ごとにグラフ化すると

イメージ 2
信頼区間を狭くするほど 急激に標本数が増加することが解る。
精密な測定には費用と手間がかかる。
400以下を詳しく見ると
イメージ 1
どれくらいの信頼区間が必要とされるのか、標本収集前に十分考えておかなければならないのである。






全9ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9]

[ 次のページ ]

One_Seg  (一弧)
One_Seg (一弧)
男性 / O型
人気度
Yahoo!ブログヘルプ - ブログ人気度について
友だち(20)
  • 紫苑
  • michi
  • helikiti娘[へりきち娘」
  • toshimi
  • 熱意の旅人5
  • のりのり
友だち一覧
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

スマートフォンで見る

モバイル版Yahoo!ブログにアクセス!

スマートフォン版Yahoo!ブログにアクセス!

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ

[PR]お得情報

ふるさと納税サイト『さとふる』
実質2000円で特産品がお手元に
11/30までキャンペーン実施中!
コンタクトレンズで遠近両用?
「2WEEKメニコンプレミオ遠近両用」
無料モニター募集中!
いまならもらえる!ウィスパーうすさら
薄いしモレを防ぐ尿ケアパッド
話題の新製品を10,000名様にプレゼント
いまならもらえる!ウィスパーWガード
薄いしモレを防ぐパンティライナー
話題の新製品を10,000名様にプレゼント
お肉、魚介、お米、おせちまで
おすすめ特産品がランキングで選べる
ふるさと納税サイト『さとふる』

その他のキャンペーン

みんなの更新記事