利用JS实现一个同Excel表现的智能填充算法

  

  

本文介绍了关于利用JS实现同Excel表现的智能填充算法的相关内容,分享出供大家参考学习、下面话不多说了,来一起看看详细的介绍吧

  

利用JS实现一个同Excel表现的智能填充算法”> <br/>
  </p>
  <p>在使用Excel的时候,发现它的“智能填充“功能非常有趣,能够智能地分析我当前的内容,然后准确预测出我期望得到的值。排除了AI的加成,发现这个功能其实也可以通过数学理论和简单代码来实现。经过一番折腾,终于用JS实现了大致的功能,然后我把它名为smart-predictor。</p>
  <p>项目地址:https://github.com/jrainlau/s..。(本地下载)<br/>
  </p>
  <p> <br/>
  </p>
  <p>首先我们来看两张gif图:<br/>
  </p>
  <p> <img src=

  

利用JS实现一个同Excel表现的智能填充算法

  

是不是很神奇?假设我有一组给定的数据<代码> [1,3,‘aaa1’,‘bbb2]> (5、7、“aaa2”、“bbb3”, 9日11 ' aaa3 ', ' bbb4 '] 这一组数据。

  

更厉害的是,智能填充不是简单地对数据进行递增,而是会对数据进行分组,每个分组按照自己的规则去进行递增,就比如说我们可以从<代码> [1、2、“x”, 3) 得到<代码> [3、4、“x”, 4]

  

在明白这些结论之后,我们就可以去讨论它到底是怎么实现的。

  


  

  

我们用数组(1、2、糖化血红蛋白,' a2c ']作为例子。当我们拿到这样一个数组的时候,第一步是要对其进行分析,分析数组内每个元素到底是一个数字,一段字符串,还是别的什么东西。分析完了,就要给他们都标注更详细的信息,然后把这些信息都组合起来。

  

比如数组元素,可以被处理成下面这个样子:

        {   realValue: 1、   numericValue: 1、   splitParts:“数量”,   指数:0   }      

而数组元素糖化血红蛋白,则可以处理成这样:

        {   realValue:糖化血红蛋白,   numericValue: 1、   splitParts: (' a ', ' c '),   指数:2   }      

代码请戳:separator.js

  

可以注意到,我会提取每一个元素的纯数字部分出来,然后把其余部分通过一个数组储存起来。这一切就是分离器所做的工作,我们最终会得到一个富含信息的新数组,然后继续我们的工作吧!

  


  

  

智能填充的最小单位是“组”。当我们通过上一步得到一个富含信息的新数组之后,接下来就应该对它们进行合理的分组。分组的动作包含了两个细节:

  
      <李>同一组的数据应该拥有一致的“类”型,这里我们使用splitParts属性去实现。   <李>同一组的数据应该是连续的,否则的话就要把不连续的数据扔到一个新的组去。   
  

假设有一个数组(1、2、糖化血红蛋白,a2c, 6、8],元素1和2就应该被分配到名为数量的组去,糖化血红蛋白和a2c则会被分配到名为ac的组里面,而6和8则会被另外分配到名为Number1的新组里面去,最后结果如下:

        {   “数量”:[{   realValue: ' 1 ',   …   }, {   realValue: ' 2 ',   …   }),   “交流”:[{   realValue:糖化血红蛋白,   …   }, {   realValue:“a2c”,   …   }),   “Number1”: [{   realValue:“6”,   …   }, {   realValue:“8”,   …   })   }      

代码请戳:classifier.js

  

通过上述步骤,我们成功把数据进行分组,组与组之间的元素并不会相互干扰。接下来我们需要实现一个专门做“线性回归”的方法,有了这个方法我们才能对数据进行“预测”。

  


  

  

"线性回归”是一个数学理论,详情请自己谷歌之,这里我直接使用线性回归的二元一次公式去求得回归直线的斜率:

  
  

y=ax + b

  

=?x # 8722; x ') (y # 8722; y ')/?x # 8722; x ') (x) # 8722; x ')
  

     

其中x”是所有点x坐标的平均数,同样的,y '是所有点y坐标的平均数。

利用JS实现一个同Excel表现的智能填充算法