2017-03-15 17 views
0

我正在研究ISCX Dataset 2012以研究异常检测。我已经使用适用于Python的Weka库应用K均值聚类。我们如何分析Python中的集群功能来制定异常检测模式?

虽然它打印群集的信息,

  1. 它不允许我保存在某个变量聚类功能(平均每个功能),
  2. 也没有给我任何有关哪一个数组进入哪个集群。

我也搜索了其他库来执行聚类,但找不到解决方案。是否有其他选择来进行聚类后形成分析?

+0

嗨,欢迎来到SO!请参阅[如何提问](https://stackoverflow.com/help/how-to-ask)以改善您的问题并避免被解雇为脱离主题。 – rll

回答

1

我从来没有使用weka库,尽管我认为weka中有一种方法。如果您愿意使用sklearn k-means,它非常易于使用。

import numpy as np 
from sklearn.cluster import KMeans 
import matplotlib.pyplot as plt 

# create a dataset 
ds = np.random.random((50, 2)) 
ds_anomaly = np.asarray([[-1,1], [1,-1]]) 
ds = np.concatenate((ds,ds_anomaly)) 

一旦k均值适合被调用,您的聚类中心(2在这种情况下),可以从kmeans.cluster_centers_检索。分配给数据集的标签可以从kmeans.labels_中检索。

kmeans = KMeans(n_clusters=2) 
kmeans.fit(ds) 

# appropriate cluster labels of points in ds 
data_labels = kmeans.labels_ 
# coordinates of cluster centers 
cluster_centers = kmeans.cluster_centers_ 

colors = ['b', 'g'] 
plt.scatter(ds[:, 0], ds[:, 1], 
         c=[colors[i] for i in data_labels], s=1) 
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], color = "k") 
plt.show() 

您可以绘制结果并自己查找异常; enter image description here

或者你可以做某种数据分析并得到异常。以下是使用np.percentile查找不同值的非常基本的示例。你可以改变异常函数(如果你想得到好结果的话)应该变成一个更复杂的函数。

def anomalies(data): 
    perc = np.percentile(data, 99) 
    return data[np.where(data>perc)[0]] 

for idx, c in enumerate(kmeans.cluster_centers_): 
    c_anomaly = anomalies(ds[np.where(kmeans.labels_==idx)]) 
    print(c_anomaly) 
    plt.scatter(c_anomaly[:, 0], c_anomaly[:, 1], c="r", marker="o") 

plt.show() 

而结果是([[-1, 1], [1, -1]])值与预期的一样; enter image description here


免责声明:根据不同的初始化,您的集群中心可以endup靠近你的异常。我建议你用另一种算法执行异常检测,或者在选择k值和群集初始化模式时要小心。