[問題] 巨量稀疏矩陣進行分群問題

看板DataScience作者 ( )時間4年前 (2020/12/03 11:41), 編輯推噓4(4030)
留言34則, 3人參與, 4年前最新討論串1/1
各位好,我目前正在學習資料分群,目前遇到一個問題想請問各位 如果在一個針對使用者購買習慣的分群的過程中 由於商品數量有數十萬筆,使用者也有上百萬筆 要將使用者做分群的話我是以類似下面的排法 ( '消費者A' , [0,1,0,0,0,0,0........]) ( '消費者B' , [1,0,0,0,0,0,1........]) .... 也就是每個使用者所購買的每一個產品都是一個特徵 但這從建立一個這麼大的資料量就已經是一個問題了 即便降低消費者到只剩下100人,也因為維度太大跑到後面就直接memory error 想請問各位像這種稀疏矩陣,在分群上大家覺得資料應該要先做怎樣的處理是洽當的呢 因為實在是新手,所以問題可能問得不太好 希望能有人能提供建議~ 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.13.192.19 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/DataScience/M.1606966886.A.6CD.html

12/03 11:49, 4年前 , 1F
基本上稀疏矩陣就會用特定的稀疏矩陣資料結構去存,不要存
12/03 11:49, 1F

12/03 11:49, 4年前 , 2F
一大堆無意義的0,空間會節省非常多
12/03 11:49, 2F

12/03 11:51, 4年前 , 3F
[0,1,0,0,0,0,1]在資料結構內部會類似1:1,6:1的方式在存
12/03 11:51, 3F

12/03 11:51, 4年前 , 4F
當然做法也不只一種,自行Google 稀疏矩陣資料結構 有很多
12/03 11:51, 4F

12/03 11:52, 4年前 , 5F
資訊可以參考
12/03 11:52, 5F

12/03 11:52, 4年前 , 6F
或是你用特定framework就加上該關鍵字去查詢該framework有
12/03 11:52, 6F

12/03 11:52, 4年前 , 7F
支援的稀疏矩陣處理方式
12/03 11:52, 7F

12/03 11:59, 4年前 , 8F
d大你好,我目前是利用python sklearn的kmeans來做分群
12/03 11:59, 8F

12/03 12:00, 4年前 , 9F
我google後kmeans似乎支援csr_matrix但即便用csr壓縮
12/03 12:00, 9F

12/03 12:01, 4年前 , 10F
矩陣的大小,經過了分群的API應該也會被還原成一個那
12/03 12:01, 10F

12/03 12:02, 4年前 , 11F
麼大的維度的矩陣,我也好奇針對這種特徵值那麼多的
12/03 12:02, 11F

12/03 12:03, 4年前 , 12F
但資料基本上是很稀疏的數據,各位都是用什麼方式處理
12/03 12:03, 12F

12/03 12:04, 4年前 , 13F
因為目前矩陣,數據與空的部分可能只有1/100000這樣
12/03 12:04, 13F

12/03 13:53, 4年前 , 14F
基本上就是要採用I/O都支援稀疏矩陣的Framework吧
12/03 13:53, 14F

12/03 13:55, 4年前 , 15F
像這篇:
12/03 13:55, 15F

12/03 13:55, 4年前 , 16F
12/03 13:55, 16F

12/03 13:55, 4年前 , 17F
裡面就明確提到用sklearn的PCA輸入是稀疏,但輸出不是,那
12/03 13:55, 17F

12/03 13:56, 4年前 , 18F
自然你就可能在輸出上遭遇這個問題
12/03 13:56, 18F

12/03 13:56, 4年前 , 19F
所以要嘛去找更符合需求的Framework,不然就自己改
12/03 13:56, 19F

12/03 13:57, 4年前 , 20F
不過kmeans好像比較麻煩吧,就算輸入是稀疏,但途中計算只
12/03 13:57, 20F

12/03 13:59, 4年前 , 21F
要一個平均算中心點就都不稀疏了。
12/03 13:59, 21F

12/03 14:01, 4年前 , 22F
所以如果直接保持用矩陣一次運算,即便k值不大,也很可能
12/03 14:01, 22F

12/03 14:01, 4年前 , 23F
在運算過程中的某個時間點爆記憶體。
12/03 14:01, 23F

12/03 14:02, 4年前 , 24F
不過k-means這麼簡單的東西,可以自己手寫一個跑迴圈一點
12/03 14:02, 24F

12/03 14:02, 4年前 , 25F
點處理的版本,就很容易避開記憶體用量的問題,只不過可能
12/03 14:02, 25F

12/03 14:03, 4年前 , 26F
會在速度上付出代價
12/03 14:03, 26F

12/03 14:04, 4年前 , 27F
寫得好,記憶體用量就可以控制在只記錄k個中心點的值(非
12/03 14:04, 27F

12/03 14:04, 4年前 , 28F
稀疏)以及所有點當下所屬的cluster
12/03 14:04, 28F

12/03 14:05, 4年前 , 29F
如果資料筆數為n,維度為m,cluster數量為k,用量就可以精
12/03 14:05, 29F

12/03 14:06, 4年前 , 30F
確控制在km + n + 少量運算暫存(大約是m)吧
12/03 14:06, 30F

12/03 19:40, 4年前 , 31F
要不要先用sklearn的LogisticRegression+l1 penalty
12/03 19:40, 31F

12/03 19:42, 4年前 , 32F
找出有明顯關聯的元素,沒影響的元素就去掉
12/03 19:42, 32F

12/03 19:42, 4年前 , 33F
這樣應該可以降點維度
12/03 19:42, 33F

12/03 19:43, 4年前 , 34F
然後再用降維過的資料分群應該會容易多
12/03 19:43, 34F
文章代碼(AID): #1Vo5vcRD (DataScience)
文章代碼(AID): #1Vo5vcRD (DataScience)