2016-06-18 51 views
2

我有20個值x1,... x20。每個值在0和1之間,例如0.22,0.23,0.25,...根據函數值的差異進行採樣

x = rand(20,1); 
x = sort(x); 

現在我想選擇一個數據點,但不是隨機的統一。具有最低值的數據點應具有最高的概率,其他值應具有與功能值與最低值的差異成比例的概率。例如,如果最低函數值爲0.22,則函數值爲0.23的數據點與0.23-0.22 = 0.01的最佳值的差值,因此應該具有與0.22值相似的概率。但0.3的值相差0.3 - 0.22 = 0.08,因此應該有一個小得多的概率。

這怎麼辦?

回答

3

我會離開這作爲評論,但我不幸的是還沒有代表。 這看起來很有趣,我有幾個問題給你。 (我會編輯這個答案以後要一個答案。)

與最低值的數據點應具有最高的概率和其他值應該在函數值成正比的差的概率最低值。

讓我們取20個項目的數組,並從整個數組中減去最小的數字。這使我們將我們最小的值(您希望成爲最可能的值)設爲0.我們現在需要定義一個函數,該函數遍歷所有點並將其積分爲1.

我已經完成了以下:

x = rand(20, 1); 
x = sort(x); 
xx = x - x(1); 

我想在這一點上,我們可以顛倒我們的答案,因此最低點是1

Px = 1 - xx;  %For probabilities 
TotalP = sum(Px); 

現在,我們有我們需要的一切,我想......所以,讓我們看看有什麼可以使。

P = Px/TotalP;  %This will be our probability. 
SanityCheck = sum(P); %Make sure that it sums up to 1. 

看起來像這樣的作品,所以讓我們使我們的累積和陣列,並得到一個元素。

PI = cumsum(P);  %This will be the integral form of the probability function. 
test = rand; %Create a test number so we can place it in the integral function 
index = find(PI > test, 1); %This will return the first entry that is greater than our test value... 
result = x(index); %And here's our value 

我希望這是你正在尋找的東西。如果沒有,請發表評論,我會盡快與您聯繫。 :)

[編輯納入評論]

+1

很好的答案。只有幾點意見:(1)'rand(1,1)= rand'。你可以簡單地調用'rand'而不需要參數,它會默認給你一個輸出。 (2)'index = find(PI> temp,1); result = x(index);'可以用'result = x(PI> temp)來代替;'只要有可能,就在'find'上使用邏輯索引。它更快。 (3)MATLAB中的註釋使用'%'而不是'#'。我冒昧地爲你改變這一點。它也將允許語法突出顯示評論。 – rayryeng

+0

我很欣賞這些評論,當我把它們放在一起的時候應該多加小心。但有一點需要注意。使用result = x(PI> temp);會導致返回的條目數組而不是第一條條目,這就是爲什麼我使用find的原因。我想這可能更像rlist = x(PI> temp); result = rlist(1);這將保持邏輯索引。 –

+1

哦當然拍。我沒有看到「find」,其中'1'是第二個參數。是的,那麼忘記邏輯索引。絕對使用'find'。我誤讀了,我以爲你想找到滿足條件的所有元素。順便說一句,請接受我對StackOverflow的熱烈歡迎。我們很多人在這裏回答MATLAB問題! – rayryeng