跨學科知識體系或許是殊途同歸的

最近的娛樂之一是自學R,當讀到kmeans例子時,意識到一個很有趣的事情:

這里可以寫一篇詮釋“知識體系只是用不同方式來表達同一個事實而已”的短文。


本文分成社科和自然科學兩個知識體系,首先是社科:


心理學和行為經濟學有個說法叫做“錨點效應”,證明方法類似這樣:

將人群分組ab測試,a組展示一個東西讓你估計是否值100,并且給一個估計數。b組直接給估計數。

然后實驗結果是被問過100的組,估計的平均數更接近100。

分析原因,大致是因為人的感知能力對于“絕對值”是不敏感的,對于“比較”是敏感的,說白了就是無論你多差還是多好,永遠都有一個“鄰居家的孩子”如何如何,只對比,不看絕對值。

再舉個不恰當例子可能是,當你是一群瞪羚里的一員,一起被獵豹追,那么你跑的快不快并不重要,重要的是,你是不是最慢的那一個。因此“重視對比,忽略絕對值”的本能,可以理解為是一種達爾文自然選擇的結果--雖然我也不太信達爾文。

回到錨點話題,既然人類天性就依賴對比,尋找對比,那么在毫無東西可對比的情況下,一旦先入為主,心理上就會不自禁地將哪怕毫無關系的東西當作比較的出發點,也就因此導致結果的不客觀。

這個理論可以廣泛用于產品定價,面試/相親技巧等,在類似怪誕行為學,魔鬼經濟學這些典型的機場讀物里經常看到,我們知道投資人/老板是坐飛機最多的,被影響也就最深,他們最愛問行業數據是多少,歷史同期是多少,說白了就是在努力掙脫別人的錨點,盡可能保證獨立思考。

這些論調往往稱為人類的心理和行為具備非理性的一面,理性人應該根據絕對值去做理性的判斷,好玩的是,下面我們嘗試用理性的方法來解釋一下如上內容。


現在開始自然科學部分:


最簡單的分類算法kmeans,目標是將一堆雜亂的數據點進行分類,步驟是:

首先隨意選取類別中心點,將所有其他點歸到距離最近的中心點,形成幾個分類,當然這時候是完全亂分的。

然后重新計算每個分類群的距離中心點,再打亂所有的數據點,根據新的中心再次按照距離歸類,第二次的歸類中心點顯然比第一次亂來的會好很多,再來一次會更好,但好的幅度會減小。

以此類推,不斷重復,新舊中心點的距離會逐漸減少,最后達到預設的最小值,完成分類。

圖示比較能看清楚整個過程。

圖片來源:網絡

讓我們閉上眼睛體會一下,這正是“先入為主”的錨點,當我們想對一堆雜亂的點進行分類,但毫無頭緒的時候,如果有誰拋出來任何一個分法,無論是合理還是隨機,也無論是真隨機還是假隨機,我們都可以根據這些預設錨點,不斷優化分類--也就是重新計算距離,來逐漸逼近最合理的分類。

這個幾乎是人工智能入門中入門的簡單算法,某種程度上還原了人類思考的模式,不僅可以解釋心理錨點,甚至還可以量化計算上文里心理學實驗的結果。

更為奇妙的是,kmeans迭代距離分類算法,還具備對于極端值敏感,對于非凸形狀敏感,即“容易被帶溝里去”的特點,這和心理錨點更加不謀而和。

唯一的不同是,現實生活中我們沒有太多機會可以迭代重復,并不是所有第一眼誤解都有機會解釋,人生苦短,一個偏離較大的”初始錨點“或許能帶歪半生。

anyway,這就是本文想說的:知識體系只是用不同方式來表達同一個事實而已,哪怕外在看起來是如此不相干,走下去的指向,卻是殊途同歸。

最后隨意寫寫,用程序的思考模式描述一下kmeans,參數完全沒設計,看個感覺。

可以對比開頭的語言、邏輯的描述,體會一下編程思維和正常人思維的不同,是一種從原材料、零件開始重新建造世界的感覺。

而從社科的角度無論理解、領悟、思辨的多深刻,也完全比不上用代碼,像砌墻一樣實現一遍,來的感受徹骨,這是怎么說呢,一種“形而下”天然優于“形而上”的掌控感。

//算距離,這里可以改到n維,btw如果認不出的人請回憶一下勾股定理

getDistance(){

d=sqrt((x1-x2)^2+(y1-y2)^2)

return d

}

//歸到某類

getCluster(){

tmp給一個極大值

for (類別id++){

if ((getDistance(x1,y1,類別中心點x,類別中心點y) < tmp)

label=該類別id

}

return label

}

//取類中心

getMeans(){

for (類別內所有點遍歷){

取距離means

}

根據mean距離,任取三個點算出新中心點x'y'

return 類別中心點x',類別中心點y'

}

//類中心偏移程度,抽出來方便定義更復雜的停止重復條件

getDiff(){

getDistance(類別中心點x,類別中心點y,類別中心點x',類別中心點y')

retuen diff

}

//終于開始正事兒了,隨機設中心,歸類,計算新中心,循環直到中心偏移移動小于1個單位,完成分類

kmean(){

srand(類別中心點xn,類別中心點yn)//隨機設幾個初始中心

while diff<1{

for(遍歷所有點){

getCluster()

}

for(遍歷分類){

getMeans()

getDiff

}

}

retuern 類別中心點xn,類別中心點yn

}

就到這了,謝謝閱讀。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容