作者Tinderstick ( )
看板MATLAB
標題[問題] 分辨連續或類別變數
時間Sat Dec 19 00:24:27 2015
假設有一筆資料 X
我想把其中的連續變數和類別變數分別找出來
舉例來說
X = [ 0 0 2.5 21 1
1 1 3.4 18 0
1 2 6.6 13 1
1 4 4.8 7 1
0 3 5.1 25 1 ];
我想將 X 分成
X_con = [ 2.5 21
3.4 18
6.6 13
4.8 7
5.1 25 ];
X_cat = [ 0 0 1
1 1 0
1 2 1
1 4 1
0 3 1 ];
我目前想到的方法是
flag = false(1,size(X,2));
for i = 1:size(X,2)
flag(i) = all(X(:,i).*X(:,i)==X(:,i));
end
X_con = X(:,~flag);
X_bin = X(:,flag);
這麼一來可以找到 binary variables
但是顯然沒找到其他類別變數
想請問各位有更好的方法嗎?
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.115.173.27
※ 文章網址: https://webptt.com/m.aspx?n=bbs/MATLAB/M.1450455870.A.88D.html
1F:推 sunev: 用round 吧, 還有for 裡應該是==才對 12/19 00:31
謝謝回應,但我突然發現我要分的應該是類別變數 categorical variable 才對
也就是 0 1 2 3 4 被歸到同一群,27 13 25 18 等等被歸到連續那一群
如果是這樣該如何做呢?謝謝
2F:推 sunev: 看不懂你的標準 12/19 01:10
3F:推 s4300026: 覺得應該先讓板友搞懂分類標準,剛拜了一下google, 12/19 10:51
4F:→ s4300026: 連續變數的意思是可以在某一區間內取任意值。 12/19 10:52
5F:→ s4300026: 類別變數是指無法被量測的值,如流水號、性別、個性分類 12/19 10:54
6F:→ s4300026: 不知道這樣的定義是否與你心中的定義相同? 12/19 10:55
7F:→ s4300026: 然後我想問 [0 1 2 4 3] 和 [21 18 13 7 25]的差異性 12/19 11:01
8F:→ s4300026: 為什麼一個被分到 連續 一個被分到 類別? 理由是? 12/19 11:02
9F:→ s4300026: [21 18 13 7 25] 不能把東西分成25類(含以上)嗎? 12/19 11:03
10F:→ celestialgod: 數值意義應該由人給予,比較難用一般rule訂定,硬要 12/19 11:23
11F:→ celestialgod: 做只能用連續整數測試看看 12/19 11:23
謝謝回應
的確,我應該要先讓板友(包括我自己)搞懂分類標準
我心中想的變數是性別、年紀、學歷、所得等個人資料
[ 0 1 1 1 0 ] 代表性別
[ 0 1 2 4 3 ] 對應到不同的教育水準 0: 沒念書 1: 國小 2: 國中 之類
[ 21 18 13 7 25 ] 則是年紀
而資料裡可能還有 [ 22000 28000 31520 36050 ] 等不同所得
通常後兩者會被當作連續變數
但由於測量誤差,收集到的數據只能取到整數
因此用 round 可能行不通
不過我想這是我定義上的問題,跟 Matlab 無關了
anyway 還是謝謝大家
最後想請問
就算只挑出 binary variables
有比上面更好的方法嗎?
另外連續整數測試指的是什麼?
謝謝大家~
12F:推 profyang: 最好的方法是你在讀取資料時就多加一個數字來代表它是哪 12/19 12:59
13F:→ profyang: 種變數 12/19 12:59
14F:推 profyang: 不然你第二行和第四行都是正整數 這是要怎麼判別? 12/19 13:01
15F:→ profyang: 只能你一開始就標清楚 例如類別變數是0 連續變數是1 多 12/19 13:02
16F:→ profyang: 加一個數字(每行)這樣 12/19 13:02
17F:推 s4300026: 看了你的回答,我的進一步問題是:為什麼要請matlab幫你 12/19 13:59
18F:→ s4300026: 分類? 像是當你想要處理年齡資料時,你就呼叫X(:,4), 12/19 13:59
19F:→ s4300026: 當你想要處理性別資料,你就呼叫X(:,1)不就好了,更正確 12/19 13:59
20F:→ s4300026: 的說,你的各個欄位不就代表各資料類型了,使用%註解一 12/19 13:59
21F:→ s4300026: 下各欄意義不是很好嗎? 如果你不想註解,你可以用struc 12/19 13:59
22F:→ s4300026: t之類的把他們放在各種你命名的變數中,如X(1).old=1;X( 12/19 13:59
23F:→ s4300026: 1).money=22e3; ... 12/19 13:59
24F:→ profyang: 樓上也是個方法 關鍵就是在於這串Data原PO是怎麼把它吃 12/19 14:22
25F:→ profyang: 進matlab的 在吃進來這過程中先分好類就好了 12/19 14:22
感謝回應,我想是我沒講清楚
如果事前知道 X 包含了什麼變數
那當然不必如此麻煩
但若事前不知道,例如說 X 是別人提供的
我希望能找一個方法來自動分類
當然要求別人先分好類也是解法之一
感謝大家的回應
26F:推 profyang: 很好啊 是別人提供的 那別人提供你怎麼知道哪行是年齡哪 12/19 18:01
27F:→ profyang: 行是教育水準?是他直接告訴你第二行是教育水準 第四行是 12/19 18:02
28F:→ profyang: 年齡這樣嗎?這樣就很簡單你照他講的像s43大那樣弄就好了 12/19 18:02
29F:→ profyang: 但我猜你問題一定不可能就這5行而已 一定你有很多行需要 12/19 18:03
30F:→ profyang: 分類 別人一定是告訴你一個分類基準你才知道第2行是教育 12/19 18:03
31F:→ profyang: 水準 第4行是年齡 問題是這個分類基準是啥你並沒有告訴 12/19 18:04
32F:→ profyang: 我們阿 是第二行一定是連續正整數呢?還是怎樣?不說清楚 12/19 18:04
33F:→ profyang: 我不不可能知道阿 12/19 18:04
34F:→ profyang: 但連續正整數的話 萬一就那麼賽 年齡剛好是1 2 3 4 5你 12/19 18:06
35F:→ profyang: 怎麼辦?總之你要先講清楚啊~ 12/19 18:06
36F:→ celestialgod: 連續正整數的缺點正如樓上所說,總之,要分析資料都 12/19 19:41
37F:→ celestialgod: 要先瞭解資料才是正道 12/19 19:41
38F:→ celestialgod: 而且有人很故意把類別變數0,5,10,15,...也不是不可 12/19 19:42
39F:→ celestialgod: 能 12/19 19:42
感謝指點,其實是我想寫一個估計法給有資料的人操作
因此我不會知道有哪些變數,也不知道變數的特性
但由於這個估計法必須先區分連續變數和類型變數
叫使用者先分好類目前看來是最好的答案
感謝各位板友的建議與回應,謝謝
※ 編輯: Tinderstick (140.112.177.145), 01/01/2016 17:36:12