我们如何分析Python中的集群功能以制定异常检测模式?

时间:2017-03-15 09:47:49

标签: python networking cluster-analysis data-mining

我正在研究ISCX Dataset 2012以研究异常检测。我已经使用Weka Libraries for Python应用了K-means聚类。

虽然它打印了群集信息,但

  1. 它不允许我在某个变量中保存群集功能(每个功能的平均值),
  2. 它也没有给我任何关于哪个元组进入哪个集群的信息。
  3. 我还搜索了其他库以执行群集,但找不到解决方案。有没有其他方法可以进行群集后形成分析?

1 个答案:

答案 0 :(得分: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))

调用kmeans fit后,可以从kmeans.cluster_centers_中检索集群中心(在本例中为2)。分配给数据集的标签可以从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

免责声明:根据初始化情况,您的群集中心可能会在您的异常附近终止。我建议您使用其他算法执行异常检测,或者在获取k值和群集初始化模式时要小心。