随机变量在不同坐标系中的分布
本示例将介绍以下主题:
-Julia中的随机数和数组生成
-使用概率分布
-根据问题陈述选择随机变量的正确分布的重要性。
默认随机数生成
功能 rand()
为了生成随机数,您可以在不连接库的情况下使用该函数。 rand() . 它将返回范围内的随机实数 [0,1)
Pkg.add(["Distributions"])
rand()
如果需要创建矩阵 具有元素的一定尺寸 ,那么我们将使用 rand(i,j,k)
rand(2,4,3)
如果在 rand() 转移元组:
rand((2,4,3)),
那个 (2,4,3) 将有一组元素从中选择随机元素
rand((2,4,3))
rand(('a',3,"string",1+1im),2,3)
您还可以将字典作为一组元素传递。:
rand(Dict("pi" => 3.14, "e" => 2.71), 3)
分布的可视化分析
为了直观地评估生成数字的规律,我们将使用图书馆 Plots. 要做到这一点,请使用 using Plots 之后我们将使用该函数 histogram. 通过写作 gr() -禁用与图表交互的可能性。
using Plots # подключаем библиотеку
gr() # отключаем интерактивное взаимодействие с графиком, т.к. точек много
histogram(rand(50000)) # строим гистограму
title!("rand(50000)") # подпись
从直方图中可以看出,使用rand()生成的随机数的分布是均匀。 即功能 rand() 生成具有标准连续均匀分布(SNR)的值
正态分布
此外,在不连接其他库的情况下,Julia可以生成具有正态分布的随机数。
Randn()函数生成具有数学期望的数字的正态分布 0 和标准偏差 1. (即值的范围将是 )
histogram(randn(50000),bims=0.005) # bims - ширина стобца, в который попадает точка
title!("randn(50000)")
选择随机变量的正确分布的重要性
让我们考虑这样的任务:
在半径圆内创建一组点 R=1 并以 (0,0),其直角坐标沿横坐标和纵坐标轴均匀分布。 为了这个
- 创建一组落入正方形的点,对角线穿过顶点
(-1,1), (1,-1) - 选择落在单位圆内的点。
第1步。
要解决这一步,有必要记住,我们希望得到均匀分布的值。 X 范围内的 [-1,1]. 但是 rand() -SNRR(即 [0,1)).
SNRR[拥有](https://ru.wikipedia.org/wiki/Contigue_uniform_allocation)由缩放属性:
如果随机变量 和 然后
在我们的例子中 和
POINTS_NUMBER = 3000
big_square_points = -1 .+ 2. .* rand(POINTS_NUMBER, 2) # воспользовались свойством СНРР
为了避免在绘制图形时每次都使用相同的关键字,您可以添加 PlotThemes 并写必要的话"默认"。
Pkg.add("PlotThemes")
theme(:default, aspect_ratio=1, label = false, markersize=1)
scatter(big_square_points[:,1],big_square_points[:,2])
第二步
我们将遍历正方形的所有点,并将落在单位圆内的坐标添加到数组中。
circle_points_x = Float64[]
circle_points_y = Float64[]
R = 1
for (x, y) in eachrow(big_square_points) # (в каждой строке big_square_points 2 элемента: x и y)
if x^2 + y^2 < R^2
push!(circle_points_x, x)
push!(circle_points_y, y)
end
end
scatter(circle_points_x,circle_points_y)
为了解决我们的问题,更自然的方法是使用极坐标而不是笛卡尔坐标。
使用极坐标
然后这个任务将减少到一个,而不是两个步骤。:
步骤1
选择 和
ρ = rand(POINTS_NUMBER)
α = 2π * rand(POINTS_NUMBER)
polar_original = scatter(ρ .* cos.(α), ρ .* sin.(α), aspect_ratio=1,markersize=1) # перешли обратно в декартовы
您也可以立即查看我们的结果,而无需切换到笛卡尔坐标。 要做到这一点,首先禁用 aspect_ratio=1 并指定 proj=:polar -极地映射。
theme(:default)
scatter(α, ρ , proj=:polar, markersize=1)
我们可以看到,原点附近的点的密度高于圆附近。
为了清楚起见,我们将从圆圈中切出一个刻有方块的正方形。
为此,我们将使用该函数 zip():
for i in zip(1:5,'a':'e',["🟥","🟩","🟦"])
println(i)
end
# 4,5 и 'd','e' не напечатаются, так как коллекция цветов закончилась на 3 шаге
点密度可视化
small_square_points_x = Float64[]
small_square_points_y = Float64[]
for (x, y) in zip(circle_points_x, circle_points_y)
if abs(x) ≤ √2 / 2 && abs(y) ≤ √2 / 2
push!(small_square_points_x, x)
push!(small_square_points_y, y)
end
end
small_square_points_ρ = Float64[]
small_square_points_α = Float64[]
for (x, y) in zip(ρ .* cos.(α), ρ .* sin.(α))
if abs(x) ≤ √2 / 2 && abs(y) ≤ √2 / 2
push!(small_square_points_ρ, x)
push!(small_square_points_α, y)
end
end
要一次在同一画布上显示多个图形,您必须使用 layout 并指定其位置的结构(在我们的例子中,网格 . 使用 histogram2d 我们将能够看到在哪个区域有高密度的点。
p1 = scatter( small_square_points_x, small_square_points_y,
markersize=1, legend = false, aspect_ratio=1)
p2 = scatter( small_square_points_ρ, small_square_points_α,
markersize=1, legend = false, aspect_ratio=1)
p3 = histogram2d(small_square_points_x,small_square_points_y,
title="плотность в декартовых координатах", aspect_ratio=1)
p4 = histogram2d(small_square_points_ρ,small_square_points_α,
title="плотность в полярных координатах",aspect_ratio=1)
plot(p1,p2,p3,p4,layout=(2,2),size=(950,950))
功能 repeat()
考虑功能 repeat()
repeat([1:3;],2)
repeat([1:3;],1,2)
repeat([1:3;],2,3)
repeat([1:3;],inner=2)
极坐标和笛卡尔坐标的比较
为了理解为什么应用极坐标和随机均匀分布 和 如果他们以这种方式工作,而不是,也许,以预期的方式,考虑下面的图片。
让我们采取的不是随机的,而是一个固定的均匀分布。:
lngt = 12
a = repeat(range(0, stop=2pi,length=lngt),1,lngt)
r = repeat(range(0, stop=1, length=lngt),1,lngt)'
scatter(r .* cos.(a), r .* sin.(a),aspect_ratio=1, markersize=3)
x = repeat(range(0, stop=1, length=lngt),1,lngt)'
y = repeat(range(0, stop=1,length=lngt),lngt)
scatter(x, y,aspect_ratio=1)
如您所见,点在笛卡尔坐标中的分布密度是恒定的,而在极坐标中,密度在原点附近。
为了解决这个问题,我们需要使用一个分布,该分布更有可能使一个点更接近半径矢量的末端而不是开始。 让我们假设这样的分布应该是线性的(越接近末端,越有可能)。 它被称为三角形。
三角形分布
使用[三角形](https://en.wikipedia.org/wiki/Triangular_distribution )分发,连接库 Distributions. 这个库有一大组不同的状态(特别是一维状态)。 您可以在[文档]中熟悉此集(https://engee.com/helpcenter/stable/ru/julia/Distributions/univariate.html )。
using Pkg
Pkg.add("Distributions")
using Distributions
现在让我们创建一组具有三角形分布的点。 要做到这一点,作为函数的第一个参数 rand() 我们会传下去的 TriangularDist(a,b,c) 带参数 a=0,b=1,c=1.

histogram(rand(TriangularDist(0,1,1),POINTS_NUMBER))
在确保三角形分布按预期工作后,让我们检查它的应用程序将解决我们的问题。:
ρ_triang = rand(TriangularDist(0,1,1), POINTS_NUMBER)
α_triang = rand(Uniform(0,2π), POINTS_NUMBER) # Uniform(0,2π) - равномерное распределение от 0 до 2π
polar_triang = scatter(ρ_triang .* cos.(α_triang), ρ_triang .* sin.(α_triang),aspect_ratio=1, markersize=1)
plot(polar_original, polar_triang,layout=(1,2))
作为一个有趣的事实,我们将向您展示如何在没有 Distributions 只添加两个字符就可以解决这个问题。 .√ :
ρ_sqrt = .√rand(POINTS_NUMBER)
α_sqrt = 2π * rand(POINTS_NUMBER)
scatter(α_sqrt, ρ_sqrt, proj=:polar, markersize=1)
这是真的,因为:
使用均匀分布发生器,可以得到三角形分布发生器。:
结论
在这个例子中,Julia语言既有方便的内置函数,也有专门的包,允许您在与标准函数交互时使用特定于域的函数。
还考虑了生成数组的方法(repeat)并迭代它们(zip 和 eachrow)










