Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Infer.NETによるLDAの実装

 Infer.NETによるLDAの実装

Avatar for naoyaikeda

naoyaikeda

August 22, 2013

More Decks by naoyaikeda

Other Decks in Technology

Transcript

  1.  public class FirstExample  {  public static void

    Main()  {  Variable<bool> firstCoin = Variable.Bernoulli(0.5).Named("firstCoin");  Variable<bool> secondCoin = Variable.Bernoulli(0.5).Named("secondCoin");  Variable<bool> bothHeads = (firstCoin & secondCoin).Named("bothHeads");  InferenceEngine ie = new InferenceEngine();  if (!(ie.Algorithm is VariationalMessagePassing))  {  Console.WriteLine("Probability both coins are heads: "+ie.Infer(bothHeads));  bothHeads.ObservedValue=false;  Console.WriteLine("Probability distribution over firstCoin: " + ie.Infer(firstCoin));  }  else  Console.WriteLine("This example does not run with Variational Message Passing");  }  } first example of Infer.NET from Microsoft Research
  2.  Probability both coins are heads: Bernoulli(0.25)  Probability distribution

    over firstCoin: Bernoulli(0.3333)  最初は2枚のコインが 両方とも表となる確率  次はどちらか若しくは 両方が裏となった場合 に最初のコインが表と なる条件付確率
  3.  if (!(ie.Algorithm is VariationalMessagePassing))  {  Console.WriteLine("Probability both

    coins are heads: "+ie.Infer(bothHeads));  bothHeads.ObservedValue=false;  Console.WriteLine("Probability distribution over firstCoin: " + ie.Infer(firstCoin));  }  基本的にはObservedValueをセットして、ie.Infer を呼ぶだけ first example of Infer.NET from Microsoft Research
  4.  Range D = new Range(NumDocuments).Named("D");  Range W =

    new Range(SizeVocab).Named("W");  Range T = new Range(NumTopics).Named("T");  NumWordsInDoc = Variable.Array<int>(D).Named("NumWordsInDoc");  Range WInD = new Range(NumWordsInDoc[D]).Named("WInD");  // Surround model by a stochastic If block so that we can compute model evidence  Evidence = Variable.Bernoulli(0.5).Named("Evidence");  IfBlock evidenceBlock = null;  // We cannot calculate evidence in the power-plate version  if (!UsePowerPlate)  evidenceBlock = Variable.If(Evidence);  Theta = Variable.Array<Vector>(D);  Theta.SetSparsity(ThetaSparsity);  Theta.SetValueRange(T);  ThetaPrior = Variable.Array<Dirichlet>(D).Named("ThetaPrior");  Theta[D] = Variable<Vector>.Random(ThetaPrior[D]);  Phi = Variable.Array<Vector>(T);  Phi.SetSparsity(PhiSparsity);  Phi.SetValueRange(W);  PhiPrior = Variable.Array<Dirichlet>(T).Named("PhiPrior");  Phi[T] = Variable<Vector>.Random(PhiPrior[T]);  Words = Variable.Array(Variable.Array<int>(WInD), D).Named("Words");  WordCounts = Variable.Array(Variable.Array<double>(WInD), D).Named("WordCounts"  LDAModel.cs
  5. int numDocs = wordsInDoc.Length; NumDocuments.ObservedValue = numDocs; int[] numWordsInDoc =

    new int[numDocs]; int[][] wordIndices = new int[numDocs][]; double[][] wordCounts = new double[numDocs][];
  6.  NumWordsInDoc.ObservedValue = numWordsInDoc;  Words.ObservedValue = wordIndices;  WordCounts.ObservedValue

    = wordCounts;  ThetaInit.ObservedValue = GetInitialisation(numDocs, NumTopics, ThetaSparsity);  ThetaPrior.ObservedValue = new Dirichlet[numDocs];  for (int i = 0; i < numDocs; i++) ThetaPrior.ObservedValue[i] = Dirichlet.Symmetric(NumTopics, alpha);  PhiPrior.ObservedValue = new Dirichlet[NumTopics];  for (int i = 0; i < NumTopics; i++) PhiPrior.ObservedValue[i] = Dirichlet.Symmetric(SizeVocab, beta);  if (UsePowerPlate)  Engine.OptimiseForVariables = new IVariable[] { Theta, Phi };  else  Engine.OptimiseForVariables = new IVariable[] { Theta, Phi, Evidence };  postTheta = Engine.Infer<Dirichlet[]>(Theta);  postPhi = Engine.Infer<Dirichlet[]>(Phi);
  7.  FLXMCmvnorm <- function(formula=.~., diagonal=TRUE)  {  z <-

    new("FLXMC", weighted=TRUE, formula=formula,  dist = "mvnorm", name="model-based Gaussian clustering")  require("mvtnorm")  z@defineComponent <- expression({  logLik <- function(x, y)  dmvnorm(y, mean=center, sigma=cov, log=TRUE)   predict <- function(x, ...)  matrix(center, nrow=nrow(x), ncol=length(center),  byrow=TRUE)  new("FLXcomponent", parameters=list(center = center, cov = cov),  df=df, logLik=logLik, predict=predict)  })   z@fit <- function(x, y, w){  para <- cov.wt(y, wt=w)[c("center","cov")]  para$df <- (3*ncol(y) + ncol(y)^2)/2  if(diagonal){  para$cov <- diag(diag(para$cov))  para$df <- 2*ncol(y)  }  with(para,  eval(z@defineComponent))  }  z  }
  8.  using (Variable.ForEach(D))  {  using (Variable.ForEach(WInD))  {

     var topic = Variable.Discrete(Theta[D]);  using (Variable.Switch(topic))  Words[D][WInD] = Variable.Discrete(Phi[topic]);  }  }  usingを使ってForEachが書ける  switchも同様にusingで
  9.  D.M.Blei, A.Y.Ng, M.I.Jordan, "Latent Dirichlet Allocation" JMLR, vol.3, pp.993-1022

    (2003)  Infer.NET users guide: Tutotials and examples: Latent Dirichlet allocation http://research.microsoft.com/en- us/um/cambridge/projects/infernet/docs/Latent%2 0Dirichlet%20Allocation.aspx  Infer.NETを使ってLDAを実装してみた(第5回 自然言 語処理勉強会)  LDA 入門(第5回 自然言語処理勉強会)  汪金芳、手塚集、上田修功、田栗正章、樺島祥介、甘 利俊一、竹村彰通、竹内啓、伊庭幸人 『計算統計 I ― 確率計算の新しい手法』11巻〈統計科学のフロンティ ア〉、2003年。ISBN 4000068512。