在進行機器學習的時候,咱們須要對單個體進行多維度分析,好比說在日誌審計系統,咱們須要對每個操做帳戶進行操做次數統計,總操做次數統計,方差,極值,中值,突變度等計算。有時,也要計算非工做時間的訪問,方差,極值,中值,突變度等數據。算法
過去的作法是,讀取每個帳戶的操做記錄,而後分別計算一系列指標,最後經過cluster_foreach循環方式解決......機器學習
這種方式的缺點是顯而易見的,10000我的須要計算10000次,實際的項目經驗是百萬人級別,集羣任務過多對硬件的要求也比較大,項目執行起來難度就比較大。函數
在長期實踐中,OpenFEA團隊不斷探索創新,引入numpy模塊,創新性的解決了多個體多維度計算問題,在32萬個體的總過2000萬條記錄上,使用該模塊,在未使用集羣的狀況下,在30分鐘時間內順利計算了40個指標,充分展示了fea在數據分析領域的強大計算能力和極佳的便捷性。工具
在這裏,筆者不打算介紹具體的項目,而是把計算過程當中用的核心概念,核心方法展現出來,結合一個小數據,讓你們在實際操做中具體的感覺numpy模塊是什麼,能進行什麼運算,怎麼調用運算等,這樣便於你們抓住本質。學習
一、numpy模塊的高級運算——調用方法spa
原始數據以下:.net
1)和udf0.df_row_lambda 函數結合翻譯
a=@udf a by udf0.df_rowl with (lambda x:np.sum(x))日誌
能夠看見,np.sum()就是對整行求和get
a=@udf a by udf0.df_row_lambda with (x:np.sum(x[:7]))
能夠發現,x[0:7]就是對a行取前7列的意思
2)numpy模塊的實質
提供了一個多維函數模塊,28=np.sum(1,2,3,4,5,6,7)
能夠經過lambda函數調用
原始數據以下:
1) 對第1行「取0到2求和」,第2行「取1到3求和」,...
a=@udf a by udf0.df_rowl with (lambda x:np.sum(x[x["start"]:x["end"]+1]))
能夠看見,在lambda運算中,「運算元素」能夠隨意組合
2) 對第1行「取0到2求和」,第2行「取1到2的最大值」,...
l a=@udf a by udf0.df_rowl with (lambda x:np.sum(x[x["start"]:x["end"]+1]) if x["start"]%2==0 else np.max(x[x["start"]:x["end"]]) )
把if語句也套用進來了,處理的靈活性大大加強
3)對大於3的值求和
a=@udf a by udf0.df_rowl with (lambda x:np.dot(x[0:],x[0:]>3))
原始數據以下:
1)第一行的「1到3列」和「0到2列」錯位相減,而後求和
(2-1)+(3-2)+(4-3)=3
a=@udf a by udf0.df_rowl with (lambda x:np.sum(np.array(x[x["start"]+1:x["end"]+2])-np.array(x[x["start"]:x["end"]+1])))
能夠看到x[7]和x["start"]是同一個值
2)函數詳解
np.array()函數實現了,把序列x[0:3]="1,2,3"轉換成爲矩陣(1,2,3)
np.sum()函數同時支持序列元素求和及矩陣元素求和
1)numpy模塊中的方差,標準差的定義和fea基本運算中的agg_group模塊中的定義不一致,全樣本方差和樣本方差不一樣(除以n仍是除以n-1的差異)
2)numpy模塊中average函數和其餘函數的處理細節不是很一致,使用前須要驗證,確承認以知足算法需求
1)把複雜的錯位運算,變成一個lambda表達式,能夠對百萬級的運算個體同時計算某個測量指標,而不要分個體逐一計算,完全解決機器學習中,個體多,維度多的分析計算需求。
2)能夠和lambda函數,深度套用,靈活多變,很是適合科學計算。
3)語言接近矩陣語言,稍微有點矩陣知識便可靈活使用。
1)經過上面的演示,相信你們能夠經過lambda函數,順利調用numpy模塊,對數據進行切塊分段計算,錯位計算也都有了必定的認知。
2)須要提醒你們的是,數據分析自己就是很具備靈活性,在實際項目中,結果是否符合本身的指望,是否正確,不少時候不是「工具自己」說了算,而是「項目需求」要怎麼作,確切搞明白每一段代碼運算結果的「項目含義」。
3)再次提醒你們,numpy模塊異常豐富,本文只是一個模型、展現,將相關的概念、用法、技巧「簡單點到」而作不到「包教包會」,須要你們根據項目自己,提出概念、模型,而後翻譯成numpy語言。