昨天,我用 Python 寫了一個婚介模型

2020-08-27   AI科技大本營

原標題:昨天,我用 Python 寫了一個婚介模型

作者 | 天元浪子

來源 | CSDN(ID:CSDNnews)

先聲明一下:本文純屬七夕應景娛樂之作。如果有人因為遵循本模型提出的擇偶理論而導致失戀或單身,除了同情,我不能補償更多。

在中國的傳統節日裡,七夕可能是起源最神秘、內涵最深刻的一個了。當然,這不是本文的重點,我們的核心問題是:在七夕這個特有紀念意義的日子,你真的想好了要向TA表白嗎?TA 真的是你唯一正確的選擇嗎?這個婚介模型,也許對你有一些啟發。

我的婚介所生意興隆,無數想找到理想伴侶的單身人士都來光顧。根據顏值、人品、能力、財富等因素,我給每位客戶確定了一個素質指數(Quality Index),簡寫為 qidx。統計發現,qidx 呈現均值 8.0、標準差 0.5 正態分布。

下面是1萬客戶的 qidx 統計分布圖,可以看出絕大多數單身人士的 qidx 位於 7.0~9.0 之間,評價較為負面的和非常優秀的,都屬於少數派。

importnumpy asnp

importmatplotlib.pyplot asplt

singles = np.random.normal(loc= 8.0, scale= 0.5, size= 10000)

plt.hist(singles, bins= 8, histtype= 'step')

plt.show

一般情況下,我的客戶繳費 1 次,將獲得有 10 次選擇機會。我向客戶推薦目標的策略基於「門當戶對」,總是選擇和客戶的 qidx 相適應的異性,具體說就是以客戶的 qidx 為均值,以 0.1 的方差,按照正態分布隨機生成。

通常,客戶有兩種方式從我為他們推薦的目標中做出選擇。第一種是基於傳統的擇偶觀念,具體規則如下:

  1. 有 10% 的客戶會對當前的推薦目標一見鍾情,不在意雙方的 qid 是否匹配。

  2. 如果當前推薦目標的 qid 比客戶高,但不超過 0.2,客戶選擇當前推薦目標的機率,會隨剩餘選擇機會的減少而增加,大約從 0.35 升至 0.8。

  3. 如果當前推薦目標的 qid 比客戶高 0.2 以上,客戶選擇當前推薦目標的機率,會隨剩餘選擇機會的減少而增加,大約從 0.55 升至 1.0。

  4. 如果當前推薦目標的 qid 比客戶低,但不超過 0.2,客戶選擇當前推薦目標的機率,會隨剩餘選擇機會的減少而增加,大約從 0.25 升至 0.7。

  5. 如果當前推薦目標的 qid 比客戶低 0.2 以上,求偶者選擇當前目標的機率,會隨剩餘選擇機會的減少而增加,大約從 0 升至 0.18。

第二種匹配方式則是基於「麥穗理論」,聽起來很高大上。這裡省略了關於麥穗理論的講解,感興趣的同學可以自行檢索。具體說,就是客戶在前 4 次的推薦中,不做出選擇,只記下其中的最高的 qidx;從第 5 次開始,只要遇到大於或等於前 4 次最高 qidx 的推薦目標,就做出選擇。

下面,我分別用兩種匹配方式為 1 萬名顧客選擇配偶,結果會怎樣呢?

# -*- encoding: utf-8 -*-

import numpy as np

classSingle:

def__init__( self, qidx, times) :

self.times = times # 婚介所提供的匹配次數

self.counter = 0# 當前匹配次數

self.qidx = qidx # 客戶的qidx

self.spouse = None # 匹配成功的配偶的qidx

self.histroy = list # 基於麥穗理論的前times/e次的推薦對象的qidx

defmath_classical( self, spouse) :

self.counter += 1

ifnp.random.random < 0. 1:

self.spouse = spouse

ifspouse - self.qidx >= 0. 2:

ifnp.random.random < 1- 0. 05*( 10- self.counter):

self.spouse = spouse

elif spouse - self.qidx > 0:

ifnp.random.random < 0. 8- 0. 05*( 10- self.counter):

self.spouse = spouse

elif self.qidx - spouse >= 0. 2:

ifnp.random.random < 0. 18- 0. 02*( 10- self.counter):

self.spouse = spouse

elif self.qidx - spouse >= 0:

ifnp.random.random < 0. 7- 0. 05*( 10- self.counter):

self.spouse = spouse

defmatch_technical( self, spouse) :

self.counter += 1

ifself.counter < self.times/np. e:

self.histroy.append(spouse)

elif spouse >= max( self.histroy):

self.spouse = spouse

defmain(math_mode, total= 10000, times= 10) :

# 生成總數為total的客戶,其qids有正態隨機函數生成

singles = [Single(np.random.normal(loc= 8.0, scale= 0. 5), times) fori inrange(total)]

forp insingles:

fori inrange( 10):

ifp.counter < 10andnotp. spouse:

spouse = np.random.normal(loc=p.qidx, scale= 0. 1)

getattr(p, math_mode)(spouse)

matched = np.array([(p.qidx, p.spouse) forp insingles ifp.spouse])

diff = matched[ :, 0] - matched[ :, 1]

print( '----------------------------------')

print( '成功匹配%d人,成功率%0.2f%%'%(matched.shape[0], matched.shape[0]*100/total))

print( '客戶qidx均值%0.2f,配偶均值%0.2f'%(np.sum(matched[:,0])/matched.shape[ 0], np.sum(matched[ :, 1])/matched.shape[ 0]))

print( '匹配方差%0.2f,匹配標準差%0.2f'%(diff.var, diff.std))

print

if__name_ _== '__main__':

print( '基於傳統方式擇偶的統計結果')

main( 'math_classical')

print( '基於麥穗理論擇偶的統計結果')

main( 'match_technical')

比較兩種方案的匹配成功率、匹配成功的客戶的平均 qids、匹配成功的客戶配偶的平均 qids、客戶和配偶的 qids 的方差等,你會發現,這個結果真的有點意思。

基於傳統方式擇偶的統計結果

----------------------------------

成功匹配10000人,成功率100 .00%

客戶 qidx均值8 .00,配偶均值8 .02

匹配方差0 .01,匹配標準差0 .10

基於麥穗理論擇偶的統計結果

----------------------------------

成功匹配7138人,成功率71 .38%

客戶 qidx均值8 .00,配偶均值8 .11

匹配方差0 .00,匹配標準差0 .07

結論:

  1. 基於傳統方式的擇偶,成功率更高(100% VS 71.38%);
  2. 基於麥穗理論擇偶,配偶素質指數更高(8.11 VS 8.02);
  3. 基於麥穗理論擇偶,雙方qids差的標準差更小(0.07 VS 0.10),這意味著雙方匹配更好。