FrançoisBergeret 中寫道:
第四種方式來進行比賽
你好李,
JMP有一個非常好的功能,即可取性功能,也可用於解決問題。
- 使用4個新列創建數據集,每個顏色一個,具有來自正態分佈的隨機數據:Random Normal()* 3
- 創建5個新變量y,每行一個,y1到y5,使用公式將顏色與行總數相關聯(例如y1 = 5black + 5blue ......)
- 使用隨機數據創建100 000行顏色和y1到y5結果
- 擬合y1到y5的模型,顏色作為解釋變量
- Fit模型平台的重點是效果篩選,然後為每個y的目標設定滿意度(當y = 12時,合意性= 1,當y遠離12時變為0)
- 最大化選項中的收斂容差設置為1E-12,以獲得更準確的數字結果(僅需幾毫秒)
- 最大化合意性:黑色= 5,藍色= 1,棕色= 3,紅色= 1.5
可根據需要提供數據集
FrançoisBergeret(來自法國)
這篇博客文章是由一位不再在SAS的博客撰寫的
我的朋友和同事都認為我是一個小法語。我盡可能經常去法國。我目前正在北卡羅來納州立大學攻讀該專業的碩士學位。我把每一份法國報紙和雜誌都藏起來了。
Le Figaro 是一份添加補充劑的日報 Le Figaro雜誌到星期六的版本。在那裡你可以找到藝術新聞,專欄作家和我最喜歡的:遊戲。
我一直驚訝於法國人如何根據我們認為非常有趣的事情製作遊戲。例如,雜誌中的一個遊戲涉及Blaise Pascal給他兄弟的一封信,你必須在(a)用16個字來完成這封信。(b)糾正16種拼寫或語言錯誤; (c)發現15個異常現象,時代錯誤或歷史不可能性。
其中一個遊戲跳了出來(雙關語)。這是我將要使用JMP以原始形式解決的遊戲。
[ 找到每種顏色的球的價值,知道一條線上的球的總數總是等於12]
至少有三種方法可以解決這個問題 - 可能更多,如果我想到這些事情的時間比我在Chez McDo's吃快樂餐的時間要長。
方法1:蠻力
一種非常強力的方法是循環所有可能的顏色( 紅色= x ,棕色= y ,黑色= z。藍色= w )認識到它們不能小於零,也不能大於12。這是一個執行該操作的JMP腳本:四個For循環,循環每個值從0到12,步長為0.5。當它到達結果時,它會將結果寫入日誌。
For( x = 1, x <= 12, x += 0.5,
For( y = 1, y <= 12, y += 0.5,
For( z = 1, z <= 12, z += 0.5,
For( w = 1, w <= 12, w += 0.5,
If( 2 * z + 2 * w == 12,
If( z + 2 * y + w == 12,
If( 3 * y + 2 * x == 12,
If( z + y + 4 * w == 12,
If( z + w + 4 * x == 12,
Show( x, y, z, w );
)
)
)
)
)
)
)
)
)
結果?紅= 1.5 ,棕色= 3 ,黑色= 5。藍色= 1
方法2:最小二乘法
下一個方法是將此視為最小二乘問題。附加到球上的值是線性模型的係數,球本身用作數據。所以,我可以製作一個JMP數據表,其中包含五行和四個彩球的信息。以機智:
使用JMP的Fit Model窗口,我可以得到球的最小二乘估計。我正在使用無攔截模型,因為我知道線性模型應該通過原點。
就像那樣(“Bam!”,我對自己說),我得到了結果和謎題的答案。
方法3。使用數學
如果你在過去的40年中學習了代數II,你就研究了這些稱為矩陣的東西。事實證明它們實際上是有用的。如果你不認識到最小二乘意義上的謎題,總會有這種數學方式來看待它。不要告訴任何人,但他們實際上是相同的方法:你在下面看到的數學是JMP中幕後發生的事情。
如果您使用矩陣表示拼圖設置(五行代表拼圖的五行),您可以將表本身表示為這樣(稱之為一個 )。
A = [0 0 2 2
0 2 1 1
2 3 0 0
0 1 1 4
4 0 1 1]
事實上,這五個條件總和為12,表示為
C = [12
12
12
12
12]
最後一個矩陣 b 代表未知數:球的價值。
b = [x
y
z
w]
要解決這個問題,我們只需要從頭開始
抗體 = C
得到 b 單獨在等式的左側。通常情況下,我們會做雙方乘以的簡單事情一個 -1 ,像這樣:
一個 -1 抗體 = 一個 -1 C
但是你不知道有問題嗎?由於拼圖有四個變量和五行,因此其矩陣表示不是正方形。所以我們不能只使用普通的逆。我們可以將A乘以它的轉置來得到一個方陣,儘管這仍然是不可逆的。幸運的是,JMP有 Moore-Penrose廣義逆功能(斜體聽起來更好,你不覺得嗎?)。使用它,我可以編寫一個簡單的JMP腳本來分配矩陣並解決問題:
A = [ 0 0 2 2, 0 2 1 1, 2 3 0 0, 0 1 1 4, 4 0 1 1];
C = [12, 12, 12, 12, 12];
ginverse(A`*A)*A`*C;
給出結果(有圓角誤差,我想在微妙的反演過程中)
[1.5, 3, 5.00000000000001, 0.999999999999994]
同樣的答案。如果舍入錯誤給你heeby-jeebys,你可以使用JMP的Solve函數代替。
A = [ 0 0 2 2, 0 2 1 1, 2 3 0 0, 0 1 1 4, 4 0 1 1];
C = [12, 12, 12, 12, 12];
solve((A`*A),A`*C);