每帧我都有特征点的速度。视频中有165帧,其中每一帧都包含特征点的速度,这就是我的数据。
TrajDbscanData
array([[ 1. , 0.51935178],
[ 1. , 0.52063496],
[ 1. , 0.54598193],
...,
[165. , 0.47198981],
[165. , 2.2686042 ],
[165. , 0.79044946]])
其中第一个索引是帧号,第二个索引是该帧上特征点的速度。
在这里,我想针对不同的速度范围进行基于密度的聚类。为此,我使用以下代码。
import sklearn.cluster as sklc
core_samples, labels_db = sklc.dbscan(
TrajDbscanData, # array has to be (n_samples, n_features)
eps=0.5,
min_samples=15,
metric='euclidean',
algorithm='auto'
)
core_samples_mask = np.zeros_like(labels_db, dtype=bool)
core_samples_mask[core_samples] = True
unique_labels = set(labels_db)
n_clusters_ = len(unique_labels) - (1 if -1 in labels_db else 0)
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))
plt.figure(figcount)
figcount+=1
for k, col in zip(unique_labels, colors):
if k == -1:
# Black used for noise.
col = 'k'
class_member_mask = (labels_db == k)
xy = TrajDbscanData[class_member_mask & core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6)
xy = TrajDbscanData[class_member_mask & ~core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'x', markerfacecolor=col, markeredgecolor='k', markersize=4)
plt.rcParams["figure.figsize"] = (10,7)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.grid(True)
plt.show()
我得到了以下结果。
Y轴是速度,x轴是帧号 我想根据速度进行基于密度的聚类。例如,一个群集中的速度最高为1.0,异常值从1到1.5的速度,另一个群集的速度从1.5到2.0,而另一个群集的速度则高于2.0。这有助于识别常见的运动模式类型。我该怎么办?
答案 0 :(得分:1)
不要使用欧几里得距离。
由于x和y a的含义非常不同,因此使用的距离函数错误。
您的绘图具有误导性,因为轴的比例不同。如果您以相同的方式缩放x和y,您将了解发生了什么... y轴被有效地忽略,并且通过离散的整数时间轴对数据进行切片。
您可能需要使用通用DBSCAN并分别处理时间和价值!