跨学科知识体系或许是殊途同归的

最近的娱乐之一是自学R,当读到kmeans例子时,意识到一个很有趣的事情:

这里可以写一篇诠释“知识体系只是用不同方式来表达同一个事实而已”的短文。


本文分成社科和自然科学两个知识体系,首先是社科:


心理学和行为经济学有个说法叫做“锚点效应”,证明方法类似这样:

将人群分组ab测试,a组展示一个东西让你估计是否值100,并且给一个估计数。b组直接给估计数。

然后实验结果是被问过100的组,估计的平均数更接近100。

分析原因,大致是因为人的感知能力对于“绝对值”是不敏感的,对于“比较”是敏感的,说白了就是无论你多差还是多好,永远都有一个“邻居家的孩子”如何如何,只对比,不看绝对值。

再举个不恰当例子可能是,当你是一群瞪羚里的一员,一起被猎豹追,那么你跑的快不快并不重要,重要的是,你是不是最慢的那一个。因此“重视对比,忽略绝对值”的本能,可以理解为是一种达尔文自然选择的结果--虽然我也不太信达尔文。

回到锚点话题,既然人类天性就依赖对比,寻找对比,那么在毫无东西可对比的情况下,一旦先入为主,心理上就会不自禁地将哪怕毫无关系的东西当作比较的出发点,也就因此导致结果的不客观。

这个理论可以广泛用于产品定价,面试/相亲技巧等,在类似怪诞行为学,魔鬼经济学这些典型的机场读物里经常看到,我们知道投资人/老板是坐飞机最多的,被影响也就最深,他们最爱问行业数据是多少,历史同期是多少,说白了就是在努力挣脱别人的锚点,尽可能保证独立思考。

这些论调往往称为人类的心理和行为具备非理性的一面,理性人应该根据绝对值去做理性的判断,好玩的是,下面我们尝试用理性的方法来解释一下如上内容。


现在开始自然科学部分:


最简单的分类算法kmeans,目标是将一堆杂乱的数据点进行分类,步骤是:

首先随意选取类别中心点,将所有其他点归到距离最近的中心点,形成几个分类,当然这时候是完全乱分的。

然后重新计算每个分类群的距离中心点,再打乱所有的数据点,根据新的中心再次按照距离归类,第二次的归类中心点显然比第一次乱来的会好很多,再来一次会更好,但好的幅度会减小。

以此类推,不断重复,新旧中心点的距离会逐渐减少,最后达到预设的最小值,完成分类。

图示比较能看清楚整个过程。

跨学科知识体系或许是殊途同归的_第1张图片
图片来源:网络

让我们闭上眼睛体会一下,这正是“先入为主”的锚点,当我们想对一堆杂乱的点进行分类,但毫无头绪的时候,如果有谁抛出来任何一个分法,无论是合理还是随机,也无论是真随机还是假随机,我们都可以根据这些预设锚点,不断优化分类--也就是重新计算距离,来逐渐逼近最合理的分类。

这个几乎是人工智能入门中入门的简单算法,某种程度上还原了人类思考的模式,不仅可以解释心理锚点,甚至还可以量化计算上文里心理学实验的结果。

更为奇妙的是,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

}

就到这了,谢谢阅读。

你可能感兴趣的:(跨学科知识体系或许是殊途同归的)