Python实现k-means时间序列异常数据检测异常数据占总数的百分之一并画图将异常点显示出来
以下是使用Python实现k-means时间序列异常数据检测的示例代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成示例时间序列数据
np.random.seed(0)
data = np.random.randn(1000) + np.sin(np.linspace(0, 20, 1000)) * 2
# 将数据进行归一化
data = (data - np.mean(data)) / np.std(data)
# 将时间序列数据转换为2D特征向量
def create_dataset(data, look_back=1):
dataX, dataY = [], []
for i in range(len(data)-look_back):
dataX.append(data[i:(i+look_back)])
dataY.append(data[i+look_back])
return np.array(dataX), np.array(dataY)
look_back = 10
X, _ = create_dataset(data, look_back)
# 使用k-means聚类算法进行异常数据检测
n_clusters = int(len(X) / 1000) # 设置聚类簇的数量
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(X)
# 获取每个样本点到其所属簇质心的距离
distances = np.min(kmeans.transform(X), axis=1)
# 根据异常点占比获取异常数据的阈值
threshold = np.percentile(distances, 100 - 100 / len(X))
# 找出所有异常点
anomalies = np.where(distances > threshold)[0]
# 绘制时间序列数据,并将异常点用红色标注
plt.plot(data)
plt.scatter(np.arange(look_back, len(data)), data[look_back:], c='blue', label='Normal')
plt.scatter(np.arange(look_back, len(data))[anomalies], data[look_back:][anomalies], c='red', label='Anomaly')
plt.legend(loc='best')
plt.show()
在这个示例中,我们首先生成了一个示例时间序列数据,并对其进行了归一化处理。然后,我们将时间序列数据转换为2D特征向量,以便可以使用k-means算法进行聚类。根据异常数据占比,我们设置了聚类簇的数量,并进行了k-means聚类。接下来,我们计算了每个样本点到其所属簇质心的距离,并根据异常点占比获取了异常数据的阈值。最后,我们找出了所有异常点,并绘制了时间序列数据,将异常点用红色标注出来
原文地址: https://www.cveoy.top/t/topic/h6iu 著作权归作者所有。请勿转载和采集!