在小轩哥的带领下,我也稍微看了一点点 Tensorflow,顺手把轩哥的蟒蛇代码“翻译”成了 R 代码(主要工作就是用 R 里面的 tensorflow 包,然后查找替换 .$):

数据生成部分:

p1 = .3; mu1 = 0; mu2 = 5; sigma1 = 1; sigma2 = 1.5
N = 1000
x = ifelse(rbinom(N, 1, p1), rnorm(N, mu1, sigma1), rnorm(N, mu2, sigma2))
hist(x, 30)

建模部分:

library(tensorflow)
# Define data
t_x = tf$placeholder(tf$float32)

# Define parameters
t_p1_ = tf$Variable(0, dtype=tf$float32)
t_p1 = tf$nn$softplus(t_p1_)
t_mu1 = tf$Variable(0, dtype=tf$float32)
t_mu2 = tf$Variable(1, dtype=tf$float32)
t_sigma1_ = tf$Variable(1, dtype=tf$float32)
t_sigma1 = tf$nn$softplus(t_sigma1_)
t_sigma2_ = tf$Variable(1, dtype=tf$float32)
t_sigma2 = tf$nn$softplus(t_sigma2_)

ds = tf$contrib$distributions

# Define model and objective function
t_gm = ds$Mixture(
  cat=ds$Categorical(probs=c(t_p1, 1 - t_p1)),
  components=list(
    ds$Normal(t_mu1, t_sigma1),
    ds$Normal(t_mu2, t_sigma2)
  )
)
t_ll = tf$reduce_mean(t_gm$log_prob(t_x))

# Optimization
optimizer = tf$train$GradientDescentOptimizer(0.5)
train = optimizer$minimize(-t_ll)

# Run
sess = tf$Session()
init = tf$global_variables_initializer()
sess$run(init)
for (i in seq_len(500)) {
  sess$run(train, dict(t_x = x))
}

cat('Estimated values:', unlist(sess$run(c(t_p1, t_mu1, t_mu2, t_sigma1, t_sigma2))))
cat('True values:', c(p1, mu1, mu2, sigma1, sigma2))

    Ihavenothing 管理员,您好!请问发帖的键在哪里?我找不到啊求告知,谢谢!

      lamei 到论坛首页 https://d.cosx.org ,点按钮“新的话题”。你现在大概是在主站文章下面,那里只能回复,不能发新帖。

      好文,顶!
      大概可以管窥蠡测TensorFlow的强大了, 慵懒的量变定义(显示的初始化),强大的数学计算,简洁的语法,哈哈

      7 天 后
      3 个月 后

      yihui
      学习了.
      cat('Estimated values:', unlist(sess$run(c(t_p1, t_mu1, t_mu2, t_sigma1, t_sigma2))))
      似乎需改为
      cat('Estimated values:', unlist(lapply(sess$run(c(t_p1, t_mu1, t_mu2, t_sigma1, t_sigma2)), FUN=function(x) x$item())))

      不知是否我本地tensorflow for R环境有问题,
      tf$Varible算出的结果是外部numpy对象, 没法直接unlist, 也不能直接传递给R变量.

        holm_cn 嗯,有可能是后来 tensorflow 包有变动吧,我最近没有试。谢谢!