低差異序列簡介


在進行采樣的過程中,經常需要生成隨機數,為了能夠得到一個盡可能好的采樣結果,均勻的隨機數是非常重要的。下圖是我利用偽隨機數采樣得到的一系列點,可以看到其實還是不夠均勻的:

因此,如何得到一組分布均勻的隨機數就成為了一個問題,本文所介紹的低差異序列技術就嘗試解決它。
本文主要參考自:https://zhuanlan.zhihu.com/p/20197323 這篇文章

Radical Inversion

要介紹低差異序列,就要首先講解一個基本的運算:Radical Inversion,它的定義如下:

其中i代表一個整數,b也是一個整數,\(\LARGE a_0(i)\)\(\LARGE a_1(i)\)\(\LARGE a_2(i)\)……\(\LARGE a_{M-1} (i)\)代表i在b進制下每一位的數,然后把每一位的a組成一個向量乘以一個矩陣C得到一個新的向量,再與向量\(\LARGE [b^{-1},b^{-2}...b^{-M}]\)相乘即得到i以b為底數,以C為生成矩陣的radical inversion \(\LARGE \Phi_{b,C}(i)\)
當C是單位矩陣的時候,我們就得到了Van der Corput序列:

下圖展示了以2為底數的Van der Corput序列的例子:

Van der Corput序列保證了每一個樣本點會落在當前“最沒有被其他點覆蓋”的區域;此外,當樣本個數達到\(b^m\)個點時,對[0,1)會形成均勻的划分。
很多時候Van der Corput序列並不能夠代替偽隨機數,因為點的位置和索引有很強的關系,例如在以2為底的Van der Corput序列中,索引為基數時候序列的值大於等於0.5,偶數時則小於0.5。

Halton序列與Hammersley點集

Halton和Hammersley基於Van der Corput序列,它們可以生成在無窮維度上分布均勻的點集。
Halton序列的定義如下:

和Van der Corput序列的不同在於每一個維度的底數是不斷變化的,其中\(b_1,b_2,...,b_n\)互為質數。
Hammersley點集的定義和Halton非常類似:

唯一的不同在於將第一個維度變成\(\LARGE\frac{i}{N}\),其中i為樣本點的索引,N為樣本點集中點的個數。根據定義,Hammersley點集只能生成固定數目個樣本,而Halton序列則可以生成無窮個樣本。Hammersley的“差異度”比Halton更稍低一些,但是代價是必須預先知道點的數量,並且一旦固定沒法更改。下圖展示了Halton(左)和Hammersley(右)的二維采樣示例:

下面展示了HLSL實現的Hammersly序列代碼:

float VanDerCorpus(uint n, uint base)
{
	float invBase = 1.0 / float(base);
	float denom = 1.0;
	float result = 0.0;

	for (uint i = 0u; i < 32u; ++i)
	{
		if (n > 0u)
		{
			denom = fmod(float(n), 2.0);
			result += denom * invBase;
			invBase = invBase / 2.0;
			n = uint(float(n) / 2.0);
		}
	}

	return result;
}

float2 Hammersley(uint i, uint N)
{
	return float2(float(i) / float(N), VanDerCorpus(i, 2u));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM