我有多个具有可变数量序列的集合。每个序列由64个数字组成,这些数字为0或1,如下所示:
设置A
序列1:0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1, 0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0
序列2: 0,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0, 1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,0
序列3: 0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1, 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,0
...
设置B
序列1: 0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1, 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1
序列2: 0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1, 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1, 0,0,0,0,0,0,0,1,1,1,1,1,1,0
...
我想找到一个描述集合中所有可能序列的数学函数,甚至可以预测更多,并且不包含其他集合中的序列。
我需要这个,因为我试图根据触摸的网格中的单元格识别移动应用程序中的不同手势(1触摸/ 0无触摸)。这些集合表示每个手势,并且序列是每个手势中的有限变化样本。
理想情况下,描述集合中序列的函数将允许我测试用户触摸它以确定哪个集合/手势是其中的一部分。
我使用Excel或Mathematica搜索了一个解决方案,但是对于这两者和数学都非常无知我正在寻找专家的方向。 也欢迎有关该主题的基本文件的建议。
答案 0 :(得分:3)
看起来您正试图在1D中处理本质上是2D的数据。例如,让s1
代表问题集A中的第一个序列。然后命令
ArrayPlot[Partition[s1, 8]]
产生这张照片:
同一组中的其他序列产生类似的图。响应于相同的操作,来自第二组的序列之一产生图片:
我不知道你想用什么样的数学函数来描述这些图片,但我不确定你的目标是识别用户手势。
您可以做一些更简单的事情,例如计算每个手势的“平均”图片。一种方法是计算每个图像中64个像素中每个像素的平均值。也许你的集合A中有6个序列描述了手势A.逐个元素地对序列求和。现在,您将拥有一个值为0到6的序列。将每个元素除以6.现在,每个元素代表一种新手势(您尝试识别的手势)将触及该像素的概率。
对表示手势集的所有序列集重复此操作。
要识别用户手势,只需计算表示手势的序列与表示“平均”手势的每个序列之间的差异。最小(绝对)差异将引导您进行用户的手势。
我不认为这完全是万无一失的,它可能会导致一些用户手势模糊不清或无法识别,你可能想尝试更复杂的东西。但我认为这种方法很简单,可能足以让你开始。
答案 1 :(得分:2)
在Mathematica中,以下表达式将枚举长度为64的{0,1}的所有可能组合。
Tuples[{1, 0}, {64}]
但是它们有2 ^ 62或18446744073709551616,所以我不确定这对你有什么用处。
也许您只想要每个集合中包含的唯一序列,在这种情况下,您需要的是应用于集合的Mathematica Union []函数。如果您在Mathematica的列表中将这些集合组合在一起,比如mySets,那么您可以使用map运算符将Union运算符应用于列表中的每个集合。
Union/@mySets
如果你想做某种类型的预测,可能会有更多的信息。
感谢您的澄清。
机器学习
您要解决的任务属于各种名称所知的学科,但最常见的可能是机器学习或模式识别,如果您知道哪些示例代表相同的手势,您的案例将被称为监督学习。
问题:在您的情况下,您知道每个示例代表哪个手势吗?
您有一系列示例,您可以从中了解标签(手势的形式),您可以从中训练模型并使用该模型将一个看不见的示例标记为一组有限的类。在你的情况下,一些手势之一。这通常称为分类。
学习资源
关于这一主题的研究背景非常广泛,但Christopher Bishop对该主题的一个流行的介绍是machine learning。 斯坦福大学在网上提供了一系列机器学习视频讲座Standford ML。
<强>精度强>
您可能想要考虑如何在预测未见示例的手势类型时确定系统的准确性。通常,您使用一些示例训练模型,然后使用模型未见过的示例测试其性能。用于执行此操作的两种最常用方法是10倍交叉验证或重复50/50保持。通过精确测量,您可以将一种方法与另一种方法进行比较,以确定哪种方法更优越。
您是否考虑过在任务中需要的准确度,70%的准确度,85%,99%或更高?
机器学习方法通常对您拥有的特定数据类型以及训练系统所需的示例数量非常敏感,示例越多,性能通常越好。
您可以尝试上面建议的方法,并将其与各种经过充分验证的方法进行比较,其中包括随机森林,支持向量机和神经网络。所有这些以及更多都可以在各种免费工具箱中下载。
<强>工具箱强>
Mathematica是一个很棒的系统,具有无限的灵活性和我最喜欢的环境,但开箱即用它对机器学习没有很大的支持。
我怀疑使用专为机器学习设计的自定义工具箱,您可以更快地取得很大进展。两个最受欢迎的免费工具箱WEKA和R都支持50多种不同的方法来解决您的任务以及测量解决方案准确性的方法。
只需稍微重新格式化数据,您就可以将手势转换为名为ARFF的简单文件格式,将其加载到WEKA或R中,并尝试使用数十种不同的算法来查看每种算法对数据的执行情况。 WEKA中的资源管理器工具绝对是最容易使用的,只需点击几下鼠标并输入一些参数即可开始使用。
一旦您了解已建立的方法对您的数据的执行情况,您就有一个很好的起点来比较自定义方法,如果它们不符合您的标准。
手写数字识别
您的问题类似于非常好的研究机器学习问题,称为手写数字识别。在这个手写数字公共数据集上运行良好的方法很可能适用于您的手势。