使用 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))
>
我必须使用 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))
>