可預見的未來資料分析和機器學習將成為工作中必備技能,也許已經在某個專案中討論怎麼調參優化,就像過去討論如何優雅的寫python、如何避免c++記憶體洩露一樣常見。
聚類就是對大量未知標註的資料集,按資料的內在相似性將資料集劃分為多個類別,使類別內的資料相似度較大而類別間的資料相似度較小。
給定乙個有n個物件的資料集,構造資料的k個簇,k≤n。滿足下列條件:
每乙個簇至少包含乙個物件;
每乙個物件屬於且僅屬於乙個簇;
將滿足上述條件的k個簇稱作乙個合理劃分。
對於給定的類別數目k,首先給出初始劃分,通過迭代改變樣本和簇的隸屬關係,使得每一次改進之後的劃分方案都較前一次好。
k-means演算法也被稱為k均值,k值的選擇、距離度量及分類決策是三個基本要素。
假定輸入樣本為s=x1,x2,…,xm,則演算法步驟為:
選擇初始的k個類別中心μ1μ2…μk;
對於每個樣本xi,將其標記為距離類別中心最近的類別;
將每個類別中心更新為隸屬該類別的所有樣本的均值;
重複最後兩步,直到類別中心的變化小於某閾值。
中止條件:
迭代次數/簇中心變化率/最小平方誤差mse(minimumsquared error)
某專項測試實際業務中,海量樣本為同一病毒型別,如何落地為本地能力將是挑戰,所有樣本都處理工作量大且重複性高,只處理高熱樣本會落入長尾困境,如果能將n個樣本通過特徵聚類為k類,報毒覆蓋k類則理論會達到覆蓋整體的能力,無論效率和產品能力、自動化上都將有收益。
具體的思路如下:
pe檔案結構和樣本特徵的關係:常用的惡意檔案一般都是基於格式分析,從pe檔案格式分析來提取檔案特徵符合業務特徵。
這裡使用本人在filefuzz專案裡封裝的pe解析模組來處理,拉取某報毒型別樣本5722個, 去除壞pe後解析出下列引數做為維度引數
numberofsections,sizeofcode,baseofdata,imagebase,sizeofimage,sizeofheaders
,image_data_directory[16],image_directory_entry_import
去重後匯入函式為688,引數維度共711個。
處理前特徵:
處理後特徵:
使用pandas載入資料後填充缺失資料,通過特徵分布視覺化預處理引數觀察資料分布。
資料載入
特徵歸一化
分割訓練集和測試集:不同目標引數訓練結果如下:
y=voice_data[『numberofsections』].values+voice_data[『sizeofcode』].values
y=voice_data[『numberofsections』].values+voice_data[『sizeofimage』].values
y = voice_data[『numberofsections』].values, 此時目標引數區分度有效性最高,準確率也達到99%。
sklearn函式介紹:
train_test_split將給定資料集x和類別標籤y,按一定比例隨機切分為訓練集和測試集。
x_train,x_test,y_train,y_test =train_test_split(train_data,train_target,test_size=0.4, random_state=0)
train_data: 所要劃分的樣本特徵集
train_target:所要劃分的樣本結果
test_size:樣本佔比
random_state:是隨機數的種子。
cross_val_score交叉驗證函式
scores = cross_val_score(clf, raw_data,raw_target, cv=5, score_func=none)
clf:表示不同分類器,例支援向量clf=svm.svc(kernel=』linear』, c=1)
raw_data:原始資料
raw_target:原始類別標號
cv:不同的cross validation的方法
cross_val_score:不同劃分raw_data在test_data得到分類的準確率。
**簡要:
k個特徵對k個子類編寫特徵驗證通殺性,樣本處理數量從4726下降到k類集合。
通過對大量同質資料的聚類,對測試集合的覆蓋度和效率都有顯著收益,對長尾問題解決也提供了可行的思路方法。
《統計學習方法》
《計算機病毒防範藝術》
《機器學習》
機器學習實戰(二) 聚類
回想專案中遇到的,多商家資訊融合的場景。我們如何把多商家的資訊進行合理的匹配呢?首先想到的是人工匹配和程式匹配相結合。這樣也可以實現,但費心費力,且實際匹配效果很差,如果商家融合資訊呈指數級增長,這樣的方式就太low了。那如何把這個流程做的智慧型化些呢?我們可以引入機器學習中的聚類,它可以將商家相關...
聚類演算法 KMeans 機器學習實戰
直接上 coding utf8 time 2018 4 12 下午05 33 author yjfiejd file k means 3.py from numpy import import time import matplotlib.pyplot as plt 1 先定義3個函式,第乙個函式為...
機器學習實戰 層次聚類演算法
層次聚類試圖在不同層次對資料集進行劃分,從而形成樹形的聚類結構。資料集的劃分可採用 自底向上 的聚合策略,也可採用 自頂向下 的分拆策略。層次聚類可以分為凝聚層次聚類和 層次聚類。層次聚類採用的就是 自頂而下 的思想,先將所有的樣本都看作是同乙個簇,然後通過迭代將簇劃分為更小的簇,直到每個簇中只有乙...