宝哥软件园

用JS实现与Excel性能相当的智能填充算法

编辑:宝哥软件园 来源:互联网 时间:2021-08-30

前言

介绍了智能填充算法用JS用Excel表达的相关内容,分享给大家参考学习。下面的话就不多说了,我们来看看详细的介绍

使用Excel时,发现它的“智能填充”功能非常有趣,可以智能分析我当前的内容,准确预测我期望的价值。排除AI的加入,发现这个功能也可以通过数学理论和简单代码来实现。经过一番折腾,我终于用JS实现了通用功能,然后我把它命名为smart-predictor。

项目地址:https://github.com/jrainlau/s.(本地下载)

什么是“智能填充”?

首先,让我们看两张gif图片:

是不是很神奇?假设我有一组给定的数据[1,3,' aaa1 ',' bbb2'],Excel的智能填充可以返回这组数据[5,7,' aaa2 ',' bbb3 ',9,11' aaa3 ',' bbb4']。

更重要的是,智能填充并不是简单的增加数据,而是对数据进行分组,每个分组按照自己的规则进行增量。例如,我们可以从[1,2,' x ',3]中得到[3,4,' x ',4]。

在理解了这些结论之后,我们可以讨论它是如何实现的。

分离器

我们以数组[1,2,' a1c ',' a2c']为例。当我们得到这样一个数组时,第一步是分析它,数组中的每个元素是数字、字符串还是其他什么。在分析之后,有必要用更详细的信息来标记它们,然后组合这些信息。

例如,数组元素1可以如下处理:

{realvalue: 1,numericvalue: 1,splitparts :' number ',index: 0}和数组元素a1c可以按如下方式处理:

{realvalue:' a1c ',numericvalue: 1,splitparts : ['a ',' c'],index: 2}请在代码上盖章:separator.js

您可以注意到,我将提取每个元素的纯数字部分,然后将其余部分存储在数组中。所有这些都是Separator所做的。我们最终会得到一个信息丰富的新数组,然后继续我们的工作!

分类者

智能群体的最小单位是组。在我们从上一步中获得一个新的富含信息的数组后,我们应该对它们进行合理的分组。分组操作包含两个细节:

同一组中的数据应该具有相同的“类型”,这是通过使用这里的splitParts属性来实现的。同一组中的数据应该是连续的,否则不连续的数据应该被扔进一个新的组中。假设有一个数组[1,2,' a1c ',' a2c ',6,8],元素1和2应该分配给一个名为Number的组,a1c和a2c将分配给一个名为ac的组,6和8将分配给一个名为Number1的新组。最终结果如下:

{ ' Number ' :[{ real value : ' 1 ',},{ realValue: '2 ',}],' ac': [{ realValue: 'a1c ',},{ realValue: 'a2c ',}],数字1' : [{realvalue:' 6 ',},{realvalue:' 8 ',}]}请在代码:classifier.js上盖章

通过以上步骤,我们成功地对数据进行了分组,组与组之间的元素不会相互干扰。接下来,我们需要实现一种特殊的“线性回归”方法,通过这种方法我们可以“预测”数据。

线性回归

“线性回归”是一种数学理论。详情请谷歌一下。这里我直接用线性回归的二元线性公式来求回归线的斜率:

y=ax b

a=(x x’)(y y’)/(x x’)(x x’)

其中x’是所有点的x坐标的平均值,y’是所有点的y坐标的平均值。

请在代码上盖章:linearRegression.js

利用这个公式,我们很容易得到数组[1,3]的斜率和偏移量为{a: 2,b:1},进而可以知道未来的数据趋势将是[5,7,9,].

这是整个“智能填充”的核心原理,然后我们可以依靠这个原理来实现数据预测。

预言者

借助线性回归的力量,我们可以通过设置预测次数,对每个分组的数据进行逐一预测,然后将它们组合在一起,形成一个新的结果数组。

以上面分类器中的分组数据为例,预测一次,结果如下:

{ ' Number ' :[{ real value : ' 1 ',index: 0,},{ realValue: '2 ',index: 1,},{ realValue: '3 ',index: 6,},{ realValue: '4 ',index: 7,}],' ac': [{ realValue: 'a1c ',index: 2,},{ realValue: 'a2c ',index: 3,},{ realValue: 'a3c ',index: 8,},{ realValue: 'a4c ',index: 9,}],' number 1 ' :[{ real value : ' 6 ',index: 4,},{realvalue:' 8 ',index: 5.},{realvalue:' 10 ',index: 10,},{realvalue:' 12 ',index3360 11.}]}代码请戳:predictor.js

因为我们知道每个数据的下标,所以可以简单准确地把它们放在正确的位置,最终输出如下:

[1,2,' a1c ',' a2c ',6,8,3,4,' a3c ',' a4c ',10,12]

接下来,我们可以看看测试用例与Excel相比的性能:

更大的

目前的智能预测器仍然不够智能。它只能预测自然数或自然数和字符串的组合,但仍然不支持日期格式、字母列表等数据的预测。如果你感兴趣,也欢迎你贡献你的大脑,让smart-predictor变得更聪明。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+