Python实现k-means时间序列异常数据检测异常数据占总数的百分之一
要在Python中实现k-means时间序列异常数据检测,可以按照以下步骤进行操作:
- 导入所需的库:
import numpy as np
from sklearn.cluster import KMeans
- 准备数据: 假设我们有一个时间序列数据集,其中每个时间点都有一个数值。我们将数据存储在一个numpy数组中。
data = np.array([1, 2, 1, 2, 1, 2, 100, 2, 1, 2, 1, 2, 1, 2])
- 数据预处理: 由于k-means算法需要将数据转换为二维数组,我们需要对数据进行一些预处理。我们将每个时间点的数值作为一个特征,将时间点作为另一个特征。
timestamps = np.arange(len(data)).reshape(-1, 1)
features = data.reshape(-1, 1)
X = np.hstack((timestamps, features))
- 运行k-means算法: 我们可以使用sklearn库中的KMeans类来运行k-means算法。
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
- 计算异常数据的阈值: 为了找到异常数据,我们可以计算每个数据点到其所属簇的质心的距离,并将距离排序。然后可以选择距离最大的一部分数据作为异常数据。
distances = kmeans.transform(X) # 计算每个点到每个簇质心的距离
sorted_distances = np.sort(distances[:, 0]) # 按照距离排序
threshold = sorted_distances[-int(len(data) * 0.01)] # 计算阈值
- 标记异常数据: 将距离大于阈值的数据点标记为异常数据。
anomalies = X[distances[:, 0] > threshold]
完整代码如下:
import numpy as np
from sklearn.cluster import KMeans
data = np.array([1, 2, 1, 2, 1, 2, 100, 2, 1, 2, 1, 2, 1, 2])
timestamps = np.arange(len(data)).reshape(-1, 1)
features = data.reshape(-1, 1)
X = np.hstack((timestamps, features))
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
distances = kmeans.transform(X)
sorted_distances = np.sort(distances[:, 0])
threshold = sorted_distances[-int(len(data) * 0.01)]
anomalies = X[distances[:, 0] > threshold]
print(anomalies)
这将打印出所有的异常数据点
原文地址: https://www.cveoy.top/t/topic/h6io 著作权归作者所有。请勿转载和采集!