用 JS 寫一個同 Excel 表現的智能填充演算法
作者:jrainlau
segmentfault.com/a/1190000015951750
在使用Excel的時候,發現它的「智能填充」功能非常有趣,能夠智能地分析我當前的內容,然後準確預測出我期望得到的值。排除了AI的加成,發現這個功能其實也可以通過數學理論和簡單代碼來實現。經過一番折騰,終於用JS實現了大致的功能,然後我把它名為。
項目地址:https://github.com/jrainlau/smart-predictor
什麼是「智能填充」?
首先我們來看兩張gif圖:
GIF
GIF
是不是很神奇?假設我有一組給定的數據,Excel的智能填充能夠給我返回這一組數據。
更厲害的是,智能填充不是簡單地對數據進行遞增,而是會對數據進行分組,每個分組按照自己的規則去進行遞增,就比如說我們可以從得到。
在明白這些結論之後,我們就可以去討論它到底是怎麼實現的。
Separator
我們用數組作為例子。當我們拿到這樣一個數組的時候,第一步是要對其進行分析,分析數組內每個元素到底是一個數字,一段字元串,還是別的什麼東西。分析完了,就要給他們都標註更詳細的信息,然後把這些信息都組合起來。
比如數組元素,可以被處理成下面這個樣子:
而數組元素,則可以處理成這樣:
可以注意到,我會提取每一個元素的純數字部分出來,然後把其餘部分通過一個數組儲存起來。這一切就是所做的工作,我們最終會得到一個富含信息的新數組,然後繼續我們的工作吧!
Classifier
智能填充的最小單位是「組」。當我們通過上一步得到一個富含信息的新數組之後,接下來就應該對它們進行合理的分組。分組的動作包含了兩個細節:
同一組的數據應該擁有一致的「類型」,這裡我們使用 屬性去實現。
同一組的數據應該是連續的,否則的話就要把不連續的數據扔到一個新的組去。
假設有一個數組,元素和就應該被分配到名為的組去,和則會被分配到名為的組裡面,而和則會被另外分配到名為的新組裡面去,最後結果如下:
通過上述步驟,我們成功把數據進行分組,組與組之間的元素並不會相互干擾。接下來我們需要實現一個專門做「線性回歸」的方法,有了這個方法我們才能對數據進行「預測」。
Linear regression
「線性回歸」是一個數學理論,詳情請自己google之,這裡我直接使用線性回歸的二元一次公式去求得回歸直線的斜率:
其中是所有點x坐標的平均數,同樣的,是所有點y坐標的平均數。
通過這條公式,我們可以輕易得到數組的斜率和偏移量為,然後就可以知道以後的數據走向將會是。
這就是整一個「智能填充」的核心原理,接下來我們就可以依靠這個原理去實現數據的預測了。
Predictor
藉助線性回歸的力量,我們可以通過設置預測的次數,挨個挨個地對每一個分組數據進行預測,然後再把它們組合到一起形成一個新的結果數組。
以上文Classifier中的分組數據為例,對它預測一次,結果如下:
由於我們知道每一個數據的下標,所以我們可以簡單又準確地把它們放到正確的位置去,最後輸出如下:
接下來我們可以來看看測試用例對比Excel表現:
More
當前的仍然不夠「smart」,它只能預測自然數字,或者自然數字與字元串的結合,但仍然不支持對日期格式,字母列表等數據的預測。如果各位讀者有興趣,也非常歡迎大家來貢獻腦洞,讓變得更加智能。
【關於投稿】
如果大家有原創好文投稿,請直接給公號發送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接
② 示例:
【投稿】《不要自稱是程序員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
覺得本文對你有幫助?請分享給更多人
關注「前端大全」,提升前端技能
TAG:前端大全 |