我有一个应用程序,正在分析一个存在大量交互的系统。我需要根据系统中独特项目出现的频率做出某些选择。例如,如果您有以下字母列表:
A, B, F, G, A, T, S, B, S, B, S, Q, Z, B, Q, S
这里是一个列表,显示每个字母出现的频率(出现):
A - 2
B - 4
F - 1
G - 1
Q - 2
T - 1
S - 4
Z - 1
所以出现的频率是这样的(出现次数):
4 - 2
2 - 2
1 - 4
上面是一个小例子,但我附上了一张图像,它是一个更大系统的简单线图
在此图中,底部的数字并不重要。他们只是标记了独特频率的数量。 Y 轴标记该频率的值。
我正在寻找一种数学/编程方法来找到该线开始向上突破的点。我的搜索没有产生我正在寻找的内容,因为我不太确定正确的术语是什么,或者概念的名称。
现在,我们必须根据人类查看数字并说“这里”来手动选择该点。但我希望至少已经选择了一个“推荐”值,最多能够完全消除人为因素。
为了澄清,我当前的算法正在生成一个数字对出现次数到出现频率的列表。我对“频率”一词的使用与电磁信号无关,而是与事件发生的频率有关。但我认为说“发生事件”会更困惑!
在这个系统中,总的趋势是少量实体将出现在大量交互中,更多实体将出现在中等数量的交互中,但最大数量的实体将出现在少数交互中,甚至没有交互。很难想象与此不同的情况……最坏的情况可能是停滞不前。但从开始到结束的任何一点,肯定都可能出现跳跃后的下跌。上面的插图并没有说明这一点。我们不能假设会有一个点开始上涨,之后就不再下跌。
这是我的数据。 (上面的简单图表仅使用“出现频率”列数据生成):
如您所见,此列表按出现列的降序排序。这是来自一个拥有 904 个独特实体的小型系统。这些实体有 38 个独特的出现率。如果您从该列表的顶部开始,您可以说:
"2 entities occur 309 times"
"1 entity occurs 130 times"
etc.
最终,我试图根据实体在系统中出现的频率来确定其重要性。我需要能够将某些项目标记为“重要”,但不可能所有项目都重要。我正在寻找的方法/算法将有助于确定在该列表中的哪个点我停止考虑重要的项目。
如果您查看列表,您可以看到出现次数较低的位置开始变得更加频繁。我认为我无法对右列进行排序,因为左列实际上是关键数据。发生次数越多=重要性越高。
但我仍然需要弄清楚如何确定这一点。
最佳答案
较大的示例未排序是否有任何原因?如果通过增加 Y 值对其进行排序,则可以获取每个连续对的斜率,并在斜率显着变化时调用断点。
您可以调整“显着更改”的规则以满足您的具体需求。它可能像“与之前相比增加最多的斜率”或“与运行平均斜率变化超过 X% 的第一个斜率”一样简单。或者可能是测试点的斜率与之前和之后的斜率差异的最大 rss。
修改后,我想可能就是取百分比那么简单。将每个 X 和 Y 相乘,并对所有条目求和。这是观察到的事件总数。现在从表的底部开始,开始从总数中减去每行的乘积,直到小于原始总数的 X%。剩下的就是对总数贡献最大的“重大”事件。
我有一种感觉,这是统计学中的一个常见问题,但我没有足够的背景来说出正确的术语是什么,尽管我想到了标准差。
关于vb.net - 确定频率变化的关键点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603914/