我正在做一个实验,三个时间序列数据集具有不同的特点为我的实验,其格式如下。
0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27
第一列是timestamp
。出于可重复性的原因,我共享了数据here。从第2列开始,我希望读取当前行并将其与前一行的值进行比较。如果当前值大于前一行的值,我将继续比较。如果当前值小于前一行的值,我希望除以当前值(较小)乘以先前的值(较大)。相应地,代码如下:
import numpy as np
import matplotlib.pyplot as plt
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,
}
plt.figure(); plt.clf()
plt.plot(quotient_times,quotient, ".", label=protname, color="blue")
plt.ylim(0, 1.0001)
plt.title(protname)
plt.xlabel("time")
plt.ylabel("quotient")
plt.legend()
plt.show()
这就产生了以下三个点--每个点对应于我共享的一个dataset。
第一次
从基于上面给出的代码的图中的点可以看出,data1
非常一致,其值大约为1,data2
将有两个商(其值将集中在0.5或0.8附近),并且data3
的值集中在两个值附近(大约0.5或0.7)。这样,给定新的数据点(用quotient
和quotient_times
表示),我想知道它属于哪个cluster
,通过构建每个数据集,堆叠这两个变换后的特征quotient
和quotient_times
。我尝试使用KMeans
集群,如下所示
from sklearn.cluster import KMeans
k_means = KMeans(n_clusters=3, random_state=0)
k_means.fit(quotient)
但这是给我一个错误:ValueError: n_samples=1 should be >= n_clusters=3
.如何修复此错误?
更新:样本商数据= array([ 0.7 , 0.7 , 0.4973262 , 0.7008547 , 0.71287129, 0.704 , 0.49723757, 0.49723757, 0.70676692, 0.5 , 0.5 , 0.70754717, 0.5 , 0.49723757, 0.70322581, 0.5 , 0.49723757, 0.49723757, 0.5 , 0.49723757])
3条答案
按热度按时间wkyowqbh1#
这样,您的
quotient
变量现在是 * 一个 * 样本;这里我得到了一个不同的错误消息,可能是由于不同的Python/scikit-learn版本,但本质是相同的:这会产生以下错误:
尽管措辞不同,但与您的数据并无不同-本质上,它表示您的数据看起来像单个样本。
遵循第一个建议(即考虑
quotient
包含单个 * 功能 *(列))可解决此问题:jgovgodb2#
请尝试下面的代码。一个简短的解释我所做的:
首先,我构建了数据集
sample = np.vstack((quotient_times, quotient)).T
,并将其标准化,这样就可以更容易地进行聚类。接下来,我使用多个超参数(eps和min_samples)应用DBScan
,直到找到一个更好地分隔点的超参数。最后,我用各自的标签绘制了数据,因为您使用的是二维数据,所以很容易看到聚类的效果。xqk2d5yq3#
您试图创建3个聚类,而您只有1个np.array,即n_samples。
1.请尝试增加数组的数目。
1.减少群集数。
1.重新调整阵列(不确定)