绘制一维数据的 KMeans 聚类和分类
Posted
技术标签:
【中文标题】绘制一维数据的 KMeans 聚类和分类【英文标题】:Plot KMeans clusters and classification for 1-dimensional data 【发布时间】:2019-07-17 09:49:05 【问题描述】:我正在使用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
),我想知道它属于哪个 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")
可视化集群,但出现此错误:TypeError: float() argument must be a string or a number, not 'KMeans'
。我们如何绘制KMeans
集群?
【问题讨论】:
您不想绘制KMeans
类,对吧?但取而代之的是一些数字。但是你想绘制什么数字?预测?集群中心?
我想要两个图 1)预测和 2)KMeans
类。
【参考方案1】:
如果我理解正确,您想要绘制的是您的 Kmeans 结果的边界决定。 您可以在 scikit-lean 网站here 中找到如何执行此操作的示例。
上面的例子甚至是在做 PCA,所以数据可以在 2D 中可视化(如果你的数据维度高于 2)对你来说是无关紧要的。
您可以通过 Kmeans 决策轻松绘制散点颜色,以便更好地了解您的聚类出错的地方。
【讨论】:
我已经尝试过了,但我得到了同样的错误。对你有用吗?【参考方案2】:您实际上正在寻找的是一个值范围,在这些值之间的点被认为属于给定类。使用 KMeans 以这种方式对一维数据进行分类是非常不寻常的,尽管它确实有效。正如您所注意到的,您需要将输入数据转换为二维数组才能使用该方法。
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")
这将使用原始数据生成以下图,每个点都由集群成员着色。
【讨论】:
以上是关于绘制一维数据的 KMeans 聚类和分类的主要内容,如果未能解决你的问题,请参考以下文章
随机森林图像分类实战:随机森林分类聚类(Kmeans)降维后的数据随机森林分类聚类(Kmeans)降维后的合成(append)数据