使用 multinomial-dist 来表达分布

Use multinomial-dist to express a distribution

我必须使用 multinomial-dist 来表达以下分布:

x P(x)
red 0.5
blue 0.05
green 0.4
black 0.05

其中P(x)指的是x的概率。
我使用 Gamble 在 Dr.Racket 中实现了以下解决方案:

(define color '("red" "blue" "green" "black"))

(define (color-probability color)
  (cond
    [(equal? "red") 0.5]
    [(equal? "blue") 0.05]
    [(equal? "green") 0.4]
    [else 0.05]))

(define my-color (multinomial-dist color color-probability))
(dist-sample my-color)

但它 returns 一个错误:

make-multinomial-dist: contract violation
  expected: natural?
  given: '("red" "blue" "green" "black")
  in: the 1st argument of
      (->
       natural?
       (vectorof (>=/c 0))
       multinomial-dist?)

我是 Racket 的新手,我仍在学习基础知识,我不明白编译器不喜欢什么!

谢谢大家!

您应该表示的分布不是多项式分布,而是 向量 上的分布。

我认为您需要改用 discrete-dist

multinomial-dist 的文档条目,通过选择 multinomial-dist 从 DrRacket 查看,右键单击它,选择 Search in Help Desk for "multinomial-dist"对每个新功能执行此操作接下来) 是:

(struct multinomial-dist (n weights))
  n : exact-nonnegative-integer?
  weights : (vectorof (>=/c 0))

Represents a multinomial distribution. The support consists of vectors of the same length as weights representing counts of n iterated samples from the corresponding categorical distribution with weights for weights.

所以一个multinomial-dist可以用一个表达式来构造,例如,like:
(multinomial-dist 100 (vector 49 51))(vector 49 51) 可能是 100 个 迭代样本 的结果 分类分布 权重 (vector 50 50) 例如代表抛硬币)

问题中的P(x)值是分类分布(有时称为 离散分布)权重,所以从这个开始:

#lang racket
(require Gamble)

(define color-dist (categorical-dist (vector 0.5 0.05 0.4 0.05)))

为了试试这个,sample 在 DrRacket 的交互区分发几次:

> (sample color-dist)
0
> (sample color-dist)
2
> (sample color-dist)
0
> 

在 Racket 中构造 迭代 样本的一种方法是使用 build-list:

(define samples (build-list 100 (lambda (x) (sample color-dist))))

> samples
'(3 0 0 2 2 0 2 0 0 0 0 0 2 0 2 0 1 2 2 2 0 2 0 2 1 0 2 0 2 0 0 0 0 2 1 0 0 2 2 2 0 1 2 0 2 2 2 0 2 0 2 2 0 0 0 0 0 0 0 0 0 2 2 0 2 2 0 0 0 2 2 2 2 1 1 0 3 0 2 2 2 0 0 2 0 2 0 0 0 0 0 2 2 2 0 0 0 2 3 0)
>

Counts 个这些样本是必需的(当需要一个函数时,只需输入一个可能的名称并使用“在帮助台中搜索”...);试试看:

> (count (lambda (n) (= n 0)) samples)
51
> 

需要权重作为向量,因此添加:

(define weights
  (vector (count (lambda (n) (= n 0)) samples)
          (count (lambda (n) (= n 1)) samples)
          (count (lambda (n) (= n 2)) samples)
          (count (lambda (n) (= n 3)) samples)))

> weights
'#(51 6 40 3)
> 

(学完Scheme/Racket基础,可以去掉上面定义中的重复)

然后,最后,

> (multinomial-dist 100 weights)
(multinomial-dist 100 '#(51/100 3/50 2/5 3/100))
>