亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用JS實現一個同Excel表現的智能填充算法

發布時間:2020-10-19 22:51:18 來源:腳本之家 閱讀:159 作者:jrainlau 欄目:web開發

前言

本文介紹了關于利用JS實現同Excel表現的智能填充算法的相關內容,分享出供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

利用JS實現一個同Excel表現的智能填充算法

在使用Excel的時候,發現它的“智能填充”功能非常有趣,能夠智能地分析我當前的內容,然后準確預測出我期望得到的值。排除了AI的加成,發現這個功能其實也可以通過數學理論和簡單代碼來實現。經過一番折騰,終于用JS實現了大致的功能,然后我把它名為smart-predictor。

項目地址:https://github.com/jrainlau/s...(本地下載)

什么是“智能填充”?

首先我們來看兩張gif圖:

利用JS實現一個同Excel表現的智能填充算法

利用JS實現一個同Excel表現的智能填充算法

是不是很神奇?假設我有一組給定的數據[1, 3, 'aaa1', 'bbb2'] ,Excel的智能填充能夠給我返回[5, 7, 'aaa2', 'bbb3', 9, 11 'aaa3', 'bbb4']這一組數據。

更厲害的是,智能填充不是簡單地對數據進行遞增,而是會對數據進行分組,每個分組按照自己的規則去進行遞增,就比如說我們可以從[1, 2, 'x', 3]得到[3, 4, 'x', 4]

在明白這些結論之后,我們就可以去討論它到底是怎么實現的。

Separator

我們用數組[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所做的工作,我們最終會得到一個富含信息的新數組,然后繼續我們的工作吧!

Classifier

智能填充的最小單位是“組”。當我們通過上一步得到一個富含信息的新數組之后,接下來就應該對它們進行合理的分組。分組的動作包含了兩個細節:

  • 同一組的數據應該擁有一致的“類型”,這里我們使用splitParts屬性去實現。
  • 同一組的數據應該是連續的,否則的話就要把不連續的數據扔到一個新的組去。

假設有一個數組[1, 2, 'a1c', 'a2c', 6, 8],元素1和2就應該被分配到名為Number的組去,a1c和a2c則會被分配到名為ac的組里面,而6和8則會被另外分配到名為Number1的新組里面去,最后結果如下:

{
 'Number': [{
 realValue: '1',
 ...
 }, {
 realValue: '2',
 ...
 }],
 'ac': [{
 realValue: 'a1c',
 ...
 }, {
 realValue: 'a2c',
 ...
 }],
 'Number1': [{
 realValue: '6',
 ...
 }, {
 realValue: '8',
 ...
 }]
}

代碼請戳:classifier.js

通過上述步驟,我們成功把數據進行分組,組與組之間的元素并不會相互干擾。接下來我們需要實現一個專門做“線性回歸”的方法,有了這個方法我們才能對數據進行“預測”。

Linear regression

“線性回歸”是一個數學理論,詳情請自己google之,這里我直接使用線性回歸的二元一次公式去求得回歸直線的斜率:

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, ...]。

這就是整一個“智能填充”的核心原理,接下來我們就可以依靠這個原理去實現數據的預測了。

Predictor

借助線性回歸的力量,我們可以通過設置預測的次數,挨個挨個地對每一個分組數據進行預測,然后再把它們組合到一起形成一個新的結果數組。

以上文Classifier中的分組數據為例,對它預測一次,結果如下:

{
 'Number': [{
 realValue: '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,
 ...
 }],
 'Number1': [{
 realValue: '6',
 index: 4,
 ...
 }, {
 realValue: '8',
 index: 5
 ...
 }, {
 realValue: '10',
 index: 10,
 ...
 }, {
 realValue: '12',
 index: 11
 ...
 }]
}

代碼請戳:predictor.js

由于我們知道每一個數據的下標,所以我們可以簡單又準確地把它們放到正確的位置去,最后輸出如下:

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

接下來我們可以來看看測試用例對比Excel表現:

利用JS實現一個同Excel表現的智能填充算法

More

當前的smart-predictor仍然不夠“smart”,它只能預測自然數字,或者自然數字與字符串的結合,但仍然不支持對日期格式,字母列表等數據的預測。如果各位讀者有興趣,也非常歡迎大家來貢獻腦洞,讓smart-predicotr變得更加智能。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静乐县| 宜州市| 稻城县| 阆中市| 和平区| 昌图县| 高碑店市| 治多县| 牡丹江市| 通江县| 邹平县| 桐城市| 原平市| 昆山市| 西峡县| 奉化市| 巴青县| 江山市| 师宗县| 上蔡县| 延寿县| 高陵县| 涞源县| 西林县| 民勤县| 肥乡县| 怀仁县| 蕲春县| 湘乡市| 屏山县| 岳普湖县| 宁蒗| 富平县| 保康县| 霍山县| 乌兰察布市| 新龙县| 新邵县| 高尔夫| 类乌齐县| 诸城市|