1. 程式人生 > >到底需要多少“演算法”才能過好這一生

到底需要多少“演算法”才能過好這一生

   “演算法”是什麼?也許對一個沒經歷過洗腦的人來話,一上來有點懵逼,不知道這是一個什麼東東。本著不忽悠與不被忽悠的態度,試著用最簡單的語言來告訴你:演算法就是你做一些事情的規律!
   別急,一定會有人站出來說我不對。但不打緊,還那句口頭禪:讓×××飛一會兒!接下來,就用一些實際例子來告訴大家我們的人生要底要用多少“演算法”才能過好我們這一生..........

決策樹演算法
這個演算法本質上是解決我們是選A還是選B的問題,我一直是覺得古人是要比現代人聰明的,最先根據大資料輔助決策可追溯到《易經》,從八八六十四卦的相生變化中組合我們實際生活推斷出一些出乎人意料的結果與推斷,上可掛六國之印,下可斷人間疾苦(俗點說就是上可忽悠國家,下可忽悠老百姓)。而在戰爭史中記載的孫臏根據鍋灶數量推斷出對方軍隊數量,做出軍事判斷從而出擊戰勝對方。在當時來說,也是一種用資料來輔助決策的方法。而古代的軍事家,都是會決策,懂周易之人。
再回過頭來說說這個決策樹演算法,書本上有C4.5,ID3等等的演算法。而真實在實際生活中,我們就是用來分類,最常見到的實際應用就是你本來準備買一小瓶麻醬吃涮兒鍋,結果買成大瓶的了,回到家後才發現,旁邊還美其名說是“買一送一”的加送了一瓶麻油。而你的預算最初只是5塊,最終卻花了25元。這種場景相信大家都不會陌生。這些是商家的決策樹。還有就是我們經常收到的號稱“特權”的待遇資訊。
而決策樹演算法中,有一個很重要的概念--熵。書上給的定義是:恆量一組資料的分類標準,使其分類更精確。換成我們能聽懂的話就是:更好的分類,是為了能使我們找到我們所需要的那一類別。
而對於人生的這一個大話題,是按照不同的年齡段來劃分,而是按著一年,一月,一日來劃分。可能這兩種劃分方法都很好,但從熵的角度來說,就要結合著你分析的目標來計算。如果說人生是一場馬拉松,你就可以按不同的年齡段來劃分,這樣的好處就是每一個年齡段都會有一個小的目標感。而如果說人生是一場奮鬥,一萬年太久,只爭朝夕的話,就要按一年,一月,一日這種情況來劃分。因為這樣,才能更好的把你奮鬥的目標也實際的點點滴滴聯絡起來。

神經網路演算法
本來就是複雜的事情,也許我們簡單的言語很是蒼白,根本就說不清楚。一如給年輕人講人生大道理,根本沒用,生活是要經歷的。就像神經網路演算法一樣,本來軸突跟突觸之間的傳遞是完成了一個神經元的傳達。但當這種序列方式成千上萬的時候,我們就不能夠用簡單的邏輯語言來表達了。
一如人生,一個人成功的背後有許多的因素,而我們經常地簡單地說他是靠著某某人的關係上來的,或是說他運氣較好,或是說他完全憑自己的努力。我們把本來並聯的事物以單一串聯的方式來解讀,導致了我們只是一元一次函式,忽略了這個世界本來就是一個多元多次的相關深度神經網路........
這個演算法,我一直覺得應該是一位醫生最先發明出來的。當發現生活中很多的事情不再是加減乘除所能夠解決的時候,就用神經網路的概念來給這個演算法起名,並加以應用。現在行業裡,叫嚷最多的AI就是以深度神經網路為基礎模擬出人腦的思維模式,就像阿爾法狗戰勝圍棋冠軍的事,從一個細節來說,機器能把你每一步的走法以神經元的形式儲存起來,當有大量這樣的神經元的時候,再根據人腦的灰質,暗質的先後,左右腦對不同神經元的呼叫。通過一些規律實現了這些的計算,就精確的算出了打敗對方的模式。這就是神經網路演算法。

支援向量機演算法
一般唬人的時候,會說這個演算法是叫SVM演算法。實際上,在真實的生活中,用的非常多。比如說在忽悠人,說你在搞大資料的時候,會提到說我們要使用多維建模,那什麼是多維建模?用生活中的例子回答就是:你有一個六維魔方,但現在你要先把它整成三維的魔方,然後用你熟悉的公式 來將其還原。
在支援向量機的演算法中,是把我們日常知道的資料投射到一個座標系中,然後去分析,預測。比如你在瀏覽網站,你在某個頁面的停留時間,點選資料都可能組成一個維度,你瀏覽過的商品資訊也可以構成一個維度,你過去購買過的產品資訊也可以構成一個維度,你信用卡在該網站的消費記錄及頻次也可以構成一個維度,以此類推。當用多個維度來構造你的模型時,有一個專業點的說法叫“人物畫像”。而當這些維度多達上百與上千裡,就需要用到SVM來向簡單的三維來投影,結合人物畫像,然後做出精準推薦。
從這個角度來說,我們手機裡的推薦,我們微信熱文下的廣告基本上都是通過這個演算法來完成的。但現實也都是用SVM加上其他演算法來完成。
這個演算法充分證明了數學之美,生活中的任何問題都可以通過向量來組合運算,但要找到生活中真正重要的關鍵決策因素,還需要我們自我對一些變數的捨棄。降維的核心本質也就是篩選出真正重要的變數,而對於人生這一個大魔方來說,如何通過變換,倒置讓原來多項決策的變數成為我們熟悉的條件,是我們真實要思考的。

時間複雜度與空間複雜度
先說時間複雜度,實際上它本質上解決的生活問題就是:一個產品一年賣出1萬件,現在1天就可以把一年的量給賣完了。通過各種途徑,比如說,微信營銷,朋友圈F2F,分享減半,積贊免費送........而在IT技術上的實現,基本上都是靠著一些指標優化,雜湊,二分,布隆過濾等等這些技術細節。在程式碼的世界裡,如果要關注演算法,它是做為首先要關注的,簡單一點說就是為什麼我的程式碼執行的速度比你的快。
再來說空間複雜度,一般來說是我們的程式碼在佔用記憶體空間的大小,用生活中的例子,就是你去菜市場買菜的時候,你會發現,如果菜市場不擴建,原來你經常去買菜的那個攤位他擺放菜的次序會越摞越高。美其名曰是充分利用空間,而在IT程式碼的世界裡,也同樣是這樣的,你一層摞一層的if....else迴圈是否也應該考慮向菜市場菜販那來擺放。從而達到對記憶體的最小佔用,提高可讀取的時間。
在人生這個大工程裡面,時間複雜度也體現在你對時間的利用,而空間複雜度就取決於你怎麼整理你的房間。程式碼不是寫的越多就越好,多去思考內在的邏輯才是提高好我們人生質量的關鍵。

   程式碼世界,所有的語言都是一種與機器對話的媒介。Java,Python的底層是C語言,C的底層是彙編,彙編的底層是機器碼,機器碼的底層是位元組碼,位元組碼的底層就是位元流,位元流的核心是0跟1,所以最底層的媒介只有0跟1。而為什麼有這麼多語言,同時未來還會有更多的語言,就如世界本來就是有許多種語言來溝通一樣。
  底層的0與1相當於人生裡的對與錯,而在慢慢的發展過程中,會發現程式碼會越來越複雜,會逐步忽略了0跟1 ,併發,叢集,共享,雲端,資料......當這些新概裹攜著“演算法”進入我們的生活,會發現,我們的思想是更深刻,還是更膚淺。一如前一段時間,一位老師問的一個問題:這一個時代 ,到低是我們在玩手機,還是手機在玩我們!