RandomHelper
01 Syntax
Microsoft.VisualBasic.MachineLearning.tSNE.RandomHelper
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| GaussRandom | 1 | 返回 0 均值单位标准差随机数 |
| randn | 1 | return random normal number |
| randn2d | 2 | utility that returns a contiguous row-major 2d buffer filled with value s |
03 Fields
| Name | Overloads | Summary |
|---|---|---|
| mSpare | 1 | Marsaglia polar 方法成对产出的第二个正态随机数的缓存 |
04 Members
GaussRandom
返回 0 均值单位标准差随机数
Remarks
这里使用的是 Marsaglia polar 方法,每一次采样会成对地产出两个正态随机数。
原始的 JS 参考实现把第二个数字缓存在 tSNE 实例之上(mRet 与 mVal 字段), 这在并行初始化的场景下会被多个线程互相覆盖,从而产生静默的数值错误。 此处改为把缓存下沉到 RandomHelper 实例自身的字段之上, 由于 InitSolution 保持串行执行,产出的随机序列与改造前逐位一致。
底层的 RandomExtensions.NextDouble 基于 ThreadLocal(Of Random) 实现, 本身即为线程安全的。
randn(
Double, Double)return random normal number
Parameters
| Name | Type | Description |
|---|---|---|
mu | Double | - |
std | Double | - |
randn2d(
Int32, Int32)utility that returns a contiguous row-major 2d buffer filled with random normal numbers (mu = 0, sigma = 1e-4)
Remarks
返回的是拉平之后的一维数组(行主序,索引为 i * d + j), 相比改造前的锯齿数组版本减少了 n 次小数组分配,缓存局部性更好。
Parameters
| Name | Type | Description |
|---|---|---|
n | Int32 | - |
d | Int32 | - |
randn2d(
Int32, Int32, Double)utility that returns a contiguous row-major 2d buffer filled with value s
Parameters
| Name | Type | Description |
|---|---|---|
n | Int32 | - |
d | Int32 | - |
s | Double | - |
mSpare
Marsaglia polar 方法成对产出的第二个正态随机数的缓存