我正在研究ISCX Dataset 2012以研究异常检测。我已经使用Weka Libraries for Python应用了K-means聚类。
虽然它打印了群集信息,但
我还搜索了其他库以执行群集,但找不到解决方案。有没有其他方法可以进行群集后形成分析?
答案 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()
或者您可以进行某种数据分析并获得异常。以下是一个非常基本的示例,它使用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()
免责声明:根据初始化情况,您的群集中心可能会在您的异常附近终止。我建议您使用其他算法执行异常检测,或者在获取k值和群集初始化模式时要小心。