k均值聚类算法_异常数据检测

发布时间 2023-06-15 23:35:09作者: 虎虎生威啊

k均值聚类_异常检测

  1. 先来张图,快速理解
    img
  2. 正常数据应该分布在两个簇中
  3. 异常数据,距离两个簇都很远
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__':
    # 正常数据分为两个簇
    normal_data1 = np.random.normal(0, 1, (20, 2))
    normal_data2 = np.random.normal(10, 1, (20, 2))
    # 异常数据两个点
    anomalies = np.array([[1, 10],[10,0] ])

    data = np.vstack([normal_data1,normal_data2, anomalies])

    # 使用K均值聚类算法将数据分为K个簇(K=2)
    kmeans = KMeans(n_clusters=2,n_init=10)
    kmeans.fit(data)

    # 计算每个数据点到其所属簇中心的距离
    distances = cdist(data, kmeans.cluster_centers_, 'euclidean')
    min_distances = np.min(distances, axis=1)

    # 设置阈值并检测异常值
    threshold = 5 
    outliers = data[min_distances > threshold]

    # 输出结果
    print("Outliers:")
    print(outliers)

    # 绘制数据的散点图
    plt.scatter(normal_data1[:, 0], normal_data1[:, 1])
    plt.scatter(normal_data2[:, 0], normal_data2[:, 1])
    plt.scatter(anomalies[:, 0], anomalies[:, 1])
    plt.show()