我正在使用KMeans
对具有不同特征的三个时间序列数据集进行聚类。出于可复制性原因,我正在共享数据here。
这是我的代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
protocols = {}
types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}
for protname, fname in types.items():
col_time,col_window = np.loadtxt(fname,delimiter=',').T
trailing_window = col_window[:-1] # "past" values at a given index
leading_window = col_window[1:] # "current values at a given index
decreasing_inds = np.where(leading_window < trailing_window)[0]
quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
quotient_times = col_time[decreasing_inds]
protocols[protname] = {
"col_time": col_time,
"col_window": col_window,
"quotient_times": quotient_times,
"quotient": quotient,
}
k_means = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',
random_state=0, tol=0.0001, verbose=0)
k_means.fit(quotient.reshape(-1,1))
这样,给定一个新的数据点(带有quotient
和quotient_times
),我想通过构建每个数据集来堆叠这两个变换特征{{ 1}}和cluster
与quotient
。
quotient_times
给出此输出KMeans
最后,我想使用k_means.labels_
可视化群集,但是出现了此错误:array([1, 1, 0, 1, 2, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0], dtype=int32)
。我们如何绘制plt.plot(k_means, ".",color="blue")
簇?
答案 0 :(得分:1)
您正在有效地寻找的是在给定类中的点之间的一系列值。使用KMeans以这种方式对一维数据进行分类是很不常见的,尽管它确实可以工作。如您所见,您需要将输入数据转换为2d数组才能使用该方法。
k_means = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',
random_state=0, tol=0.0001, verbose=0)
quotient_2d = quotient.reshape(-1,1)
k_means.fit(quotient_2d)
稍后,您将再次需要quotient_2d
进行分类(预测)步骤。
首先,我们可以绘制质心,因为数据为1d,所以x轴点是任意的。
colors = ['r','g','b']
centroids = k_means.cluster_centers_
for n, y in enumerate(centroids):
plt.plot(1, y, marker='x', color=colors[n], ms=10)
plt.title('Kmeans cluster centroids')
这将产生以下图。
要获取这些点的集群成员身份,请将quotient_2d
传递到.predict
。这会返回一组数字作为类成员资格,例如
>>> Z = k_means.predict(quotient_2d)
>>> Z
array([1, 1, 0, 1, 2, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0], dtype=int32)
我们可以使用它来过滤原始数据,以单独的颜色绘制每个类。
# Plot each class as a separate colour
n_clusters = 3
for n in range(n_clusters):
# Filter data points to plot each in turn.
ys = quotient[ Z==n ]
xs = quotient_times[ Z==n ]
plt.scatter(xs, ys, color=colors[n])
plt.title("Points by cluster")
这将使用原始数据生成以下图,每个点都由聚类成员着色。
答案 1 :(得分:0)
如果我正确理解,您想绘制的是Kmeans结果的边界决定。 您可以在精简scikit的网站here中找到一个示例。
上面的示例甚至都在进行PCA,因此可以以2D形式可视化数据(如果您的数据维大于2),因为这无关紧要。
您可以根据Kmeans决策轻松绘制散点图的颜色,以便更好地了解聚类错误的地方。