matlab randomsample,randperm和randsample函数用法对比
構建替代數據的時候,一種常見的思路是打亂原數據的排列次序,通過隨機置換原數據的排列次序從而產生和原數據系列統計特征(如均值、方差、分布)一致的隨機數據。具體到Matlab中,此思路的實現會涉及到兩個命令:randperm和randsample
p.s.?相關的重新排序命令還包括:
1
2
3
4
5
6
7
8
9
Reordering?Algorithms
amd?Approximate?minimum?degree?permutation
colamd?Column?approximate?minimum?degree?permutation
colperm?Sparse?column?permutation?based?on?nonzero?count
dmperm?Dulmage-Mendelsohn?decomposition
ldl?Block?LDL'?factorizationfor?Hermitian?indefinite?matrices
randperm?Random?permutation
symamd?Symmetric?approximate?minimum?degree?permutation
symrcm?Sparse?reverse?Cuthill-McKee?ordering
1、RANDPERM
根據Matlab文檔,randperm最常用的用法是是返回一個從1-n的包含n個數的隨機排列(每個數字只出現一次)——以行向量的形式
p?=?randperm
(n)?returns?a?row?vector?containing?a?random?permutation?of?the?integers?from1?to?n?inclusive
如果希望從1-n的數字序列里面隨機返回k個數,則可以使用
p?=?randperm(n,k)
其中,這k個數之間彼此也是不相同的。可見,randperm能夠產生不重復的隨機排列,結合原數據,可寫成類似下面的形式:
new?=?old(?randperm(?size(old,1)?)?,?:?);
這樣新數組中的各行就被重排了。如果各列也需要重排,則可以嵌套使用。
Matlab文檔中還說,randperm完成的是不重復的重排采樣(k-permutations),如果結果中的數需要重復多次出現的情況,則可以用:
randi(n,1,k)
randperm和rand、randi、randn一樣,其隨機數的生成是收到rng命令控制的,因此,可通過該命令影響隨機數據流rand?stream的情況。
2、RANDSAMPLE
randsample的命令組合比randperm要復雜,事實上這個命令內部也有對randperm的調用。因此,在適當的情況下,使用randperm的速度理論上比randsample快。(事實上也快很多)
randsample的命令格式:
1
2
3
4
5
6
7
y?=?randsample(n,k)
y?=?randsample(population,k)
y?=?randsample(n,k,replacement)
y?=?randsample(population,k,replacement)
y?=?randsample(n,k,true,w)
y?=?randsample(population,k,true,w)
y?=?randsample(s,...)
第一種情形,randsample(n,k)和randperm(n,k)的功能一樣,都是產生k個不相同的數(1-n)。
第二種情形,randsample(ARRAY,k),事實上就是randperm和原數組結合使用的形式,從ARRAY數組里面隨機取出k個不相同的數。
第三種情形,replacement是一個bool變量,為1的時候,取出的數可能是重復的,為0的時候,可能不重復。
很顯然,看到這里,會發現randsample和randperm很相似,譬如,之前舊數組隨機排序的需求可寫成下面的樣式:
new?=?old(?randsample(1:length(matrix)?,?length(matrix)?,0),:?);
or
new?=?randsample(?old,?length(old),0?);?
事實上更有用的是第四種情形,多出來一個w,是權重系數,能夠根據此權重系數在原數組(或1-n數組)里面選出可能重復的k個數。典型用法譬如:
R?=?randsample('ACGT',48,true,[0.15?0.35?0.35?0.15])
上面的語句能夠產生48個內容為ATCG的隨機字串,且A出現的權重為0.15,其余類推。這個顯然在生物信息學中很有用。ATCG也就是DNA的堿基序列。
第五種情形,可以用自己提供的隨機數stream替換系統默認的隨機數,s必須派生自Matlab的RandStream類。
小結
通過對比,我們很容易的發現randperm比randsample更直接更底層,而randsample則是對各種使用的情形進行了封裝。randsample最有用的優勢是可以很方便的實現隨機數的權重分布。
總結
以上是生活随笔為你收集整理的matlab randomsample,randperm和randsample函数用法对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的jps命令怎么使用_jps命令
- 下一篇: java 日期注解 xml_Spring