我打研究室走過 那獨坐電腦前的容顏如苦瓜的糾結 靈感不來 長壽的煙霧不散 研究室如小小的寂寞的城 恰如商管的電梯向晚 http://chungyuandye.twbbs.org
2012年12月11日 星期二
(agnes12) Re: [問題]Covariance不等,做discriminant analysis
標題: Re: [問題]Covariance不等,做discriminant analysis
時間: Tue Dec 4 06:51:15 2012
※ 引述《agnes12 (agnes)》之銘言:
: Hi~
: 謝謝您的回應:)
: 我發現我的課本用的名詞有點confusing,
: 我用的課本的discriminant analysis是指canonical discriminant analysis
: 而一般(我先前google時發現)discriminant analysis
: 在我的課本用的名詞是classification analysis.
: 我現在還是疑惑我能不能做canonical discriminant analysis
: 因為data is of unequal covariance matrice ><
: ※ 引述《chungyuandye (養花種魚數月亮賞星星)》之銘言:
: : http://tinyurl.com/c5su2np
: : Quadratic Discriminant Analysis for SPSS.
I think you can analyze it with Fisher's canonical discriminant analysis/
If you try Fisher's original iris dataset, you can find that
the Covariance Matrices are Unequal.
http://tinyurl.com/ckflxg9
Discrimination methods are very much affected by the nature of
the within-group covariance matrices. The covariance matrices
are assumed equal for allgroups in the Fisher, or linear discrimination
methodology. When the assumption of homogeneity of within-groups
covariance is grossly violated, quadratic discriminant analysis is
recommended.
http://www.statistical-solutions-software.com/BMDP-documents/BMDP-5M.pdf
Linear discriminant analysis (LDA) is one approach to dimensionality reduction
that makes use of a linear transformation matrix. The widely used Fisher's
LDA is "sub-optimal" when the sample class covariance matrices are unequal,
meaning that another linear transformation exists that produces lower loss in
discrimination power.
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=940332
--
養花種魚數月亮賞星星
http://chungyuandye.twbbs.org
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 106.1.133.106
2011年12月14日 星期三
Re: [問題] ListLinePlot的PlotLegend
標題: Re: [問題] ListLinePlot的PlotLegend
時間: Wed Dec 14 20:20:04 2011
※ 引述《enunion (珍惜)》之銘言:
: 請問有人知道再用ListLinePlot時
: 怎麼弄出一個方塊上面標示什麼顏色代表什麼意思
: 我試過PlotLegend
: 但是沒用
: 查ListLinePlot的選項也沒有PlotLegend
: 請問還有什麼方法嗎?
: 感謝~
時間很趕的話,湊合用一下∼
mylegend[plot_Graphics,legend_List]:=
Block[{p=plot,l=legend,colortemp,color,Opacitytemp,temp},
(*擷取色彩*)
colortemp=Cases[p,Hue[a_,b_,c_]:>Hue[a,b,c],Infinity];
color=colortemp[[-Length@l;;-1]];
(*配對圖例及色彩*)
temp={color[[#]],l[[#]]}&/@Range[Length@color];
(*建立圖例*)
Labeled[p,
Grid[{Graphics[{#[[1]],Thickness[0.1],Opacity[0.75],
Line[{{0,0},{1,0}}]},
ImageSize->{24,24},AspectRatio->8/24,
ImagePadding->0],#[[2]]}&/@temp],
(*指定圖例位置*)
{{Right,Top}}]
]
mylegend[ListLinePlot[Table[Accumulate[RandomReal[{-1,1},250]],{3}],
Filling->0],{"a","b","c"}]
mylegend[ListLinePlot[
Table[Accumulate[RandomReal[{-1,1},250]],{10}]],
CharacterRange["a","z"][[1;;10]]]
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.134.231
[1;37m推 [33menunion[m[33m:真的可以用耶!!好強@@ 真的很感謝您和harry901大!! [m 12/14 21:34
[1;37m推 [33menunion[m[33m:可是標示的顏色好像怪怪的 紅色的線他會標成紫色 [m 12/14 21:41
[1;31m→ [33menunion[m[33m:亮綠色的線會標成暗綠色 這有辦法解決嗎? [m 12/14 21:42
[1;31m→ [33mchungyuandye[m[33m:Opacity[0.75]->Opacity[1] [m 12/14 21:45
[1;31m→ [33mharry901[m[33m:這個太強了 [m 12/14 21:48
[1;37m推 [33menunion[m[33m:還是一樣耶 紅色還是會標成紫色 [m 12/14 21:51
Re: [問題] 指定變值
標題: Re: [問題] 指定變值
時間: Thu Dec 1 21:15:24 2011
※ 引述《qoodeva (發呆的花枝)》之銘言:
: 依邊界條件而改變的材料變數
: 第一組
: ω=6;
: λ=10;
: x=0.41;
: 第二組
: ω=7;
: λ=128;
: x=0.2;
: 第三組
: ω=9;
: λ=4800;
: x=0.1;
: =========(主程式部分)=========================================
: eqn1=6ωa x+7λb ;
: eqn2=8λa +12ωb x ;
: 將eqn1,eqn2的a,b排成係數矩陣
: 6ω x 7λ
: BB= ( )
: 8λ 12ω x
: Eigensystem[BB][[1]] (特徵值)
: {0.08,0,004}
: Eigensystem[BB][[2]] (特徵向量)
: 特徵值對應到的特徵向量
: ����������
: ↓ ↓
: {{0.008,0.004},{{0.811,0.841},{0.647,0.881}}}
: ↑ ↑
: ��������������
: 選取Eigensystem[BB][[1]]中最小值,
: 所對應到Eigensystem[BB][[2]]之特徵向量即為a,b之值。
: a=Eigensystem[BB][[2,2,1]];
: b=Eigensystem[BB][[2,2,2]];
: 再將得到的a,b值反帶回eqn1可得一條function[x]的函數xop。
: xop=eqn1/.{a->a,b->b}
: ==============================================================================
: 現在我每次改變材料變數時都可以得到一條f[x]的函數,
: 並利用這個函數作圖,最後將這三組所得到的圖形繪製一起。
: 我想請問版上高手
: 1.我只能一次一次的改變數值去得到這三條方程式,
: 是否有什麼特殊指令可以更簡潔的計算一次得到這三組函數,
: 一開始有想到用map可是它是取矩陣中的元素去運算,
: 我的目的是像Do迴圈這樣,可是我的值是只能選取特定的值。
eqn1=6\[Omega]*a*x+7\[Lambda]*b;
eqn2=8\[Lambda]*a+12\[Omega]*bx;
test[fun1_,fun2_,w_,l_,xx_]:=
Block[{a,b,BB,BE,coa,cob,eqn1temp,\[Omega],\[Lambda],x,y,
eqn11,eqn22},
eqn1temp=fun1/.x->y;
\[Omega]=w;\[Lambda]=l;x=xx;
eqn11=fun1;eqn22=fun2;
BB={Coefficient[eqn11,#]&/@{a,b},
Coefficient[eqn22,#]&/@{a,b}};
BE=Eigensystem[BB];
{coa,cob}=Sort[Transpose@BE][[1,2]];
eqn1temp/.{a->coa,b->cob}
]
data = {{6, 10, 0.41}, {7, 128, 0.2}, {9, 4800, 0.1}};
Plot[test[eqn1, eqn2, #[[1]], #[[2]], #[[3]]] & /@ data, {y, 0, 1}]
: 2.選取Eigensystem[BB][[1]]中最小值,
: 所對應到Eigensystem[BB][[2]]之特徵向量即為a,b之值。
: 要怎麼自動選取最小特徵值所對應到的特徵向量,
: 用Min[]選結果都是選到{}內最小的值=_=
先轉置,在用Sort排序,第一個就是
: 3.另外請教一下,當我使用Do迴圈所得到的大量數據,
: 是否能用成表格表示??
只有想不到,沒有做不到
myresult={#[[1]],#[[2]],#[[3]],
test[eqn1,eqn2,#[[1]],#[[2]],#[[3]]]}&/@data
TableForm[myresult,TableHeadings->{Range[Length@myresult],{"\[Omega]",
"\[Lambda]","x","xop"}}]
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.131.111
[1;37m推 [33mqoodeva[m[33m:謝謝老師,實在太厲害了@@ [m 12/01 21:19
[1;37m推 [33mqoodeva[m[33m:老師請教一下,當中的eqn11是指eqn1嗎?? [m 12/01 23:10
[1;37m推 [33mLPH66[m[33m:不是的 仔細看 Block 裡有宣告 eqn11 和 eqn22 為暫時變數 [m 12/02 00:22
Re: [問題] 如何使用平行運算或加快計算時間?
標題: Re: [問題] 如何使用平行運算或加快計算時間?
時間: Thu Dec 1 13:01:14 2011
※ 引述《harry901 (forcing to A cup)》之銘言:
: 小弟又要來求救了@___@~ 爬了文跟網路
: 原本以為只要調整mathematica裡面的系統設定
: 就可以輕輕鬆鬆的使用多核心或連到其他電腦上進行平行運算
: 但是...嗚嗚 似乎沒那麼容易>.<~
Mathematica的Parallel Computing ToolKit預設是會開啟本機的Kernel
要利用多台電腦平行運算,那你每台電腦都要安裝LightweightGrid這個Service
如果有裝的話,會自動將網域中的電腦自動抓出來。
想看你現在有多少Kernel可以使用,Kernels[]會傳回來可使用的Kernels
要用LightWeightGrid,除非真的有大量的運算,
否則花在多台電腦的資料傳輸時間基本上划不來
若你在購買Mathematica時有加購買Premier Service,那這個是贈送的。
若找不到直接拿License到官網下載
: 爬了很多文 大多數使用平行運算是用ParallelMap來運算...
這個不一定要用Map,只是Map似乎比較直覺。
: 我天真以為 調調系統 mathematica就會聰明的自己將資料分配給多核電腦計算...
: 弄了老半天就是只有用到單核 不管在for迴圈前面加上parallelize 還是其他方法
: 都沒辦法成功平行運算>.<~ 一趟下來要四五分鐘左右....
: 由於程式的複雜度關係 沒有使用Map指令
: 小弟的程式到目前為止已經快六百行了 還有2/3要寫 寫完大約一千多行
: 程式的架構大約如下
: 主程式(Cell 1): 有函數f1,f2,f3, 變數z,t 參數a,b,c, ...
: 要計算數值重積分,還要找根 算出來的東西會用到副程式
: 副程式(Cell 2_: 約有十二個小程式 每個小程式裡面都有一個迴圈(大小不一)
: 這邊最花時間.......
: 請問 有辦法利用平行運算減少運算時間嗎?
: 實在摸不著平行運算最基本的使用概念...唉....
: 到最後 好像parallelize不能使用在for迴圈裡面的樣子
: 舉個簡單的例子好了 這樣 板上的大大比較容易知道我的問題>_<
: ===============================================================
: PB[z_, t_] = 3*t^2 - Exp[t*z];(*令一個函數PB*)
: ans = Array[anss, {10, 2}];(*令答案矩陣ans*)
: For[i = 0, i <= 10, i++;(*使用迴圈計算*)
: ans[[i, 1]] = i;
: ans[[i, 2]] = NIntegrate[NIntegrate[
: PB[z, t] - Exp[z*t] , {z, -3, 3*i}], {t, 0, 10}
: ]
: ]
: TimeUsed[]
: ans
這邊雙重積分的使用比較不好,可以先查一下Mathematica的用法
PB[z_,t_]=3*t^2-Exp[t*z];
ft[i_]=Re@Integrate[PB[z,t]-Exp[z*t],{t,0,10},{z,-3,3*i},Assumptions->i>0];
test1=AbsoluteTiming@Map[{#,N@ft[#]}&,Range[10]]
(*將函數分給各個Kernel,基本上這個指令在8.0似乎是可以省略。*)
(*但在7.0就要很仔細設定*)
DistributeDefinitions[ft,PB];
test2=AbsoluteTiming@ParallelMap[{#,N@ft[#]}&,Range[10]]
test3=AbsoluteTiming@ParallelTable[{i,N@ft[i]},{i,10}]
ans=test2[[2]]
最後是迴圈的部份,Mathematica提供蠻多的函數
可以用help查LoopingConstructs,For Do While這些函數在Mathematica不一定
是最好的選擇。程式若很複雜,需要用到很多額外的副程式,盡量用Block Module
包起來。
有錯請多指教∼
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.131.111
※ 編輯: chungyuandye 來自: 218.173.131.111 (12/01 13:30)
※ 編輯: chungyuandye 來自: 218.173.131.111 (12/01 13:31)
[1;37m推 [33mharry901[m[33m:謝謝老師∼ 我會吸收吸收 研發看看@@ [m 12/01 22:49
Re: [問題] mathematica的排序與篩選
標題: Re: [問題] mathematica的排序與篩選
時間: Wed Dec 14 13:40:53 2011
※ 引述《harry901 (forcing to A cup)》之銘言:
: 問題:mathematica有篩選與排序的語法嗎?
: 假設 我有一串列資料ANS[m,n] m列 n行 每一列的行表示不同屬性
: 現在我需要比較這些屬性依序篩選 然後排列大小 我們假設
: 人 國 英 數
: ANS[5,4] = [王小明 99 60 31]
: [李大同 75 51 66]
: [陳小偉 71 20 43]
: [高小茜 81 80 79]
: [馬英文 78 56 26]
: 若我要篩選出所有數學大於30分且國文60以上的同學,mathematica有辦法直接篩選嗎?
: 查了資料似乎沒有篩選的語法...我只能先令一個FinalANS存放篩選結果
: 步驟一,先計算出FinalANS的長度
: templength=0;
: For[i=1,i=Length[ANS],i++,
: If[ANS[[i,2]]>60&&ANS[[i,4]]>30,templength++,{}]
: ]
: 上面可以將templength計算出FinalANS所需的長度
: 步驟二,將篩選後結果放入FinalANS中,如
: FinalANS=Array[fnlans,{templength,4}];
: tempwrite=0;
: For[i=1,i=Length[ANS],i++,
: If[ANS[[i,2]]>60&&ANS[[i,4]]>30,tempwrite++;
: FinalANS[[i]]=ANS[[tempwrite]],{}]
: ]
: 這樣就可以完成篩選的答案(步驟一二應該可以合併在同一個loop裡面,一時想不出)
: 不過 像這樣的例子
: mathematica沒辦法直接用簡單的過濾方式求得嗎?
: 最後是排序FinalANS 若我要依照英文成績由高排至低
: 那麼 我又得寫類似上面的迴圈一個一個去判斷...可以用Sort等等方式慢慢擠出來
: 試問 mathematica有相關排序的語法嗎?
data = {{"王小明", 99, 60, 31},
{"李大同", 75, 51, 66}, {"陳小偉", 71, 20, 43},
{"高小茜", 81, 80, 79}, {"馬英文", 78, 56, 26}};
mydata=Select[data, #[[4]] >= 30 && #[[2]] >= 60 &]
要排序的話,可以使用 ?Sort 或是 ?SortBy 了解更多的設定
按總分
SortBy[mydata,Total]
按姓名
SortBy[mydata,First]
按國文
SortBy[mydata,#[[2]]&]
按英文
SoryBy[mydata,#[[3]]&]
Select, Cases這些都是可以作為篩選的函數,不過Pattern Matching也是ok
data /. {a_, b_, c_, d_} :> {a, b, c, d} /; b >= 60 && d >= 30
找出1,2,.....,100任意三個數加總等於100的所有組合
AbsoluteTiming@ReplaceList[Range[100],
{___,a_,___,b_,___,c_,___}:>{a,b,c}/;a+b+c==50]
AbsoluteTiming@Select[Subsets[Range[100],{3}],Total@#==50&]
--
養花種魚數月亮賞星星
http://chungyuandye.twbbs.org
※ 編輯: chungyuandye 來自: 218.173.131.148 (12/14 13:53)
[1;37m推 [33mharry901[m[33m:真是謝謝∼ 又學到一招了... [m 12/14 13:55
[1;37m推 [33mharry901[m[33m:篩選用Select就可以了 我居然笨到還寫迴圈 [m 12/14 13:59
Re: [問題] ListLinePlot的PlotLegend
標題: Re: [問題] ListLinePlot的PlotLegend
時間: Wed Dec 14 22:31:42 2011
※ 引述《chungyuandye (養花種魚數月亮賞星星)》之銘言:
: 標題: Re: [問題] ListLinePlot的PlotLegend
: 時間: Wed Dec 14 20:20:04 2011
:
: ※ 引述《enunion (珍惜)》之銘言:
: : 請問有人知道再用ListLinePlot時
: : 怎麼弄出一個方塊上面標示什麼顏色代表什麼意思
: : 我試過PlotLegend
: : 但是沒用
: : 查ListLinePlot的選項也沒有PlotLegend
: : 請問還有什麼方法嗎?
: : 感謝~
:
: → enunion:亮綠色的線會標成暗綠色 這有辦法解決嗎? 12/14 21:42
: 推 enunion:還是一樣耶 紅色還是會標成紫色 12/14 21:51
Mathematica會自行指定顏色,若要自行指定的話,那要改一下地方
mylegend[plot_Graphics,legend_List]:=
Block[{p=plot,l=legend,colortemp,color,Opacitytemp,temp},
(*擷取色彩*)
(*判斷是否自行者定顏色*)
colortemp=If[Cases[p,RGBColor[a_,b_,c_]:>RGBColor[a,b,c],Infinity]=={},
Cases[p,Hue[a_,b_,c_]:>Hue[a,b,c],Infinity],
Cases[p,RGBColor[a_,b_,c_]:>RGBColor[a,b,c],Infinity]];
color=colortemp[[-Length@l;;-1]];
(*配對圖例及色彩*)
temp={color[[#]],l[[#]]}&/@Range[Length@color];
(*建立圖例*)Labeled[p,
Grid[{Graphics[{#[[1]],Thickness[0.1],Opacity[0.75],
Line[{{0,0},{1,0}}]},ImageSize->{24,24},
AspectRatio->8/24,ImagePadding->0],#[[2]]}&/@
temp],
(*指定圖例位置*){{Right,Top}}]
]
mylegend[ListLinePlot[Table[Accumulate[RandomReal[{-1,1},250]],{3}],
Filling->0,PlotStyle->{Red,Blue,Green}],
{"a","b","c"}]
你會發現在沒有Filling這個Option時圖形很OK,但是加上Filling後,圖形就很不協調
而且當數列多時,顏色也是很難選擇,那不如就交由系統指定來得方便!
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.134.231
[1;37m推 [33menunion[m[33m:這樣就可以了∼ 不過不懂指令為什麼這樣寫XD [m 12/14 22:45
[1;31m→ [33menunion[m[33m:如果要自學的話 有推薦的書單嗎? [m 12/14 22:46
Re: [問題] 請教有關遞迴式
標題: Re: [問題] 請教有關遞迴式
時間: Wed Nov 16 00:02:08 2011
※ 引述《sphwny (時間過的真快>"<)》之銘言:
: 不好意思又來問問題了
: 目前小弟寫到定義分段函數
: 然後使用遞迴的方式把剩下的函數定義完
: 舉例如下:
: H[-1,x1_,x2_,x3_,n_] :=E^(-x1*x3)*(n!/x2^n)*Sqrt[1/(2*x2)]
: 然後
: H[0,x1_,x2_,x3_,n_]:=
: x3/(2*n)*H[-1,x1,x2,x3,n+1]-x1/(2*n)*H[-1,x1,x2,x3,n] /; x2==0.5*x3^2
: H[0,x1_,x2_,x3_,n_]:=
: n!*(0.5*x1*H[-1,x1,x2,x3,n-1]-0.5*x3*H[-1,x1,x2,x3,n]) /; x2!=0.5*x3^2 ; x1>0
: H[0,x1_,x2_,x3_,n_]:=
: 0.5*x1*H[-1,x1,x2,x3,n-1]-0.5x3*H[-1,x1,x2,x3,n] /; x2!=0.5*x3^2 ; x1<0
: H[0,x1_,x2_,x3_,n_]:=
: 0.5*x3*H[-1,x1,x2,x3,n] /; x2!=0.5*x3^2; x1==0
: Table[H[i,x1_,x2_,x3_,n_]:= (1/i)*H[i-2,x1,x2,x3,n+1]-
: (x3/i)*H[i-1,x1,x2,x3,n+1]-(x1/i)*H[i-1,x1,x2,x3,n], {i,12}];
: 最後再把這些函數做些計算處理的時候
: 出現了遞迴次數超過256次之類的訊息以及後面伴隨很多錯誤訊息
: 當中似乎出現了什麼問題
: 是我的定義語法錯誤了嗎?
: 還是有其他的方法來定義這樣子的遞迴函數?
: 麻煩各位大師替我解惑!! 謝謝!!
上面的函數可以改用Which試試看!至於遞迴次數可以利用$RecursionLimit=?? 來設定
上面的函數因為都是利用SetDelayed來定義,所以每次都必須重新計算,
因此當i大的時候會非常耗時,可以試著用動態定義來改善
H[-1,x1_,x2_,x3_,n_]=E^(-x1*x3)*(n!/x2^n)*Sqrt[1/(2*x2)]
H[0,x1_,x2_,x3_,n_]:=Which[
x2==0.5*x3^2,
x3/(2*n)*H[-1,x1,x2,x3,n+1]-x1/(2*n)*H[-1,x1,x2,x3,n],
x2!=0.5*x3^2&&x1>0,
n!*(0.5*x1*H[-1,x1,x2,x3,n-1]-0.5*x3*H[-1,x1,x2,x3,n]),
x2!=0.5*x3^2&&x1<0,
0.5*x1*H[-1,x1,x2,x3,n-1]-0.5x3*H[-1,x1,x2,x3,n],
x2!=0.5*x3^2&&x1==0,
0.5*x3*H[-1,x1,x2,x3,n]
]
H[i_,x1_,x2_,x3_,n_]:=H[i,x1,x2,x3,n]=(1/i)*H[i-2,x1,x2,x3,n+1]-(x3/i)*
H[i-1,x1,x2,x3,n+1]-(x1/i)*H[i-1,x1,x2,x3,n]
利用相同的原理,可以利用Fibonacci number的函數來做實驗
f1[0] = 0; f1[1] = 1; f2[0] = 0; f2[1] = 1;
f1[x_Integer] := f1[x - 1] + f1[x - 2]
f2[x_Integer] := f2[x] = f2[x - 1] + f2[x - 2]
AbsoluteTiming@f1[30]
AbsoluteTiming@f2[30]
f1沒利用動態定義,f2則是利用動態定義來定義函數。
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.136.123
※ 編輯: chungyuandye 來自: 218.173.136.123 (11/16 00:04)
※ 編輯: chungyuandye 來自: 218.173.136.123 (11/16 00:10)