对numpy数组进行重采样和归一化以识别手势

2 投票
1 回答
727 浏览
提问于 2025-04-17 10:31

我打算写一个小应用程序来识别手势(现在先用鼠标来实现)。

现在,我要把鼠标的坐标记录在一个包含点的numpy数组里(这个点是一个简单的类,里面有x和y两个属性)。为了训练我的系统(基于隐马尔可夫模型),我需要一些长度相同、范围一致的样本。

举个例子,我需要一个长度为8的数组来进行训练和分类器的使用。而我刚刚记录了a1(长度为5的元素)和a2(长度为9的元素)。我该如何让len(a1) == len(a2) == 8呢?

编辑:我找到一个网站来解释我的问题:http://www.creativedistraction.com/demos/gesture-recognition-kinect-with-hidden-markov-models-hmms/,他使用k-means算法将元素减少到8个聚类。

解决方案:我有一些分散的点(我不知道有多少),我想把它们减少到8个有意义的点。我可以使用一些聚类算法来进行聚类。KMeans可能是一个选择。在scipy中可以用这段代码实现:

def clusterize(numpy_array, n_cluster):
    centroids, labels = kmeans2(numpy_array, n_cluster)
    #print centroids, labels
    return centroids

注意:如果numpy_array的大小小于n_cluster,我发现结果并不好,但在我的实际情况中,经过一些尝试,我观察到我有超过(numpy_array大小>=60,n_cluster=8)。这很合理:k-means不是一个确定性的算法,而是一个涉及随机初始化的迭代过程,因为对于这种问题没有好的解析解(如果我理解得没错的话)。

当然,这里面有一些数学原理,我不想深入探讨。这个方法可以解决问题。

1 个回答

0

我不太确定这是不是你需要的,但这个方法会在输入的基础上,沿着 n 个均匀分布的点进行线性插值。

input = np.array([0, 1, 2, 3, 4]) ** 2
n = 8
m = len(input)
out = np.interp(np.linspace(0, m-1, n), np.arange(m), input)

撰写回答