Loren谈MATLAB的艺术

将想法转化为MATLAB

请注意

Loren谈MATLAB的艺术已退役,将不再更新。

速配实验

情人节很快就要到了,那些正在恋爱中的人可能会开始考虑计划了。对于那些没有那么幸运的人,请继续往下读!今天的嘉宾博主,今天的嘉宾博主,古原竹内,探讨了如何通过数据在速配活动中获得成功。

内容

速配数据集

我最近发现了一个有趣的Kaggle数据集快速约会实验——什么特质会影响选择一个浪漫的伴侣?.我从来没有经历过闪电约会,所以我很好奇。

这些数据来自哥伦比亚大学2002年至2004年间的一系列异性速配实验。在这些实验中,你们每个人与所有异性参与者见面四分钟。第一次约会的人数因活动的不同而不同——平均有15人,但也可能少则5人,多则22人。然后你被问到是否还想再见到他们中的任何一个。你还提供了约会对象的6个属性:

  • 吸引力
  • 真诚
  • 情报
  • 有趣的
  • 雄心壮志
  • 共同利益

该数据集还包括参与者在过程中不同阶段对这些属性的偏好,以及其他人口统计信息。

选择= detectImportOptions (“速配Data.csv”);% set导入选项opts.VariableTypes([9, 38岁,50:结束])= {“双”};%作为双重对待opts.VariableTypes([35岁,49])= {“分类”};%作为绝对的对待csv = readtable (“速配Data.csv”、选择);%导入数据csv。学费= str2double (csv.tuition);%转换为doublecsv。zipcode = str2double (csv.zipcode);%转换为doublecsv。收入= str2double (csv.income);%转换为double

参与者在异性身上寻找什么

参与者在注册时填写了调查问题,包括他们在异性身上寻找什么,以及他们认为同性的其他人在异性身上寻找什么。如果你取平均值,然后从同伴评价中减去自我评价,你会发现参与者认为其他人更看重外表,而他们也更看重真诚和智力。听起来有点偏颇。我们将看到他们是如何做出决定的。

var = csv.Properties.VariableNames;%获取变量名称[G, res] = findgroups(csv(:,{)“iid”“性别”}));%分组的id和性别[idx, ~ ~] =独特(G);%获得唯一索引参照= table2array (csv (idx,包含(var,“1 _1”)));%子集pref作为数组参照(isnan(参照))= 0;%将NaN替换为0pre1_1 = pref ./ sum(pref,2) * 100;%转换为100 pt alloc参照= table2array (csv (idx,包含(var,“4 _1”)));%子集pref作为数组参照(isnan(参照))= 0;%将NaN替换为0Pref4_1 = pref ./ sum(pref,2) * 100;%转换为100 pt alloc标签= {“attr”“sinc”“英特尔”“有趣”“amb”“莎尔”};%属性数字%的新人物b =酒吧([意味着(pref4_1 (res。性别= = 1:),“omitnan”) -...%酒吧情节意思是(pref1_1 (res。性别= = 1:),“omitnan”);...意思是(pref4_1 (res。性别= = 0:),“omitnan”) -...意思是(pref1_1 (res。性别= = 0:),“omitnan”)]);(1)。FaceColor = [0.45 .74];(2)。FaceColor =[。85 .33。1);脸部变色百分比(1)。FaceAlpha = 0.6;(2)。FaceAlpha = 0.6;%改变脸标题(“在异性中,同龄人比你更看重什么?”%添加标题xticklabels(标签)%的标签栏ylabel (“平均评分的差异——同伴vs自我”% y轴标签传奇(“男人”“女性”%添加传奇

他们能找到火柴吗?

让我们先来看看这些速配活动有多成功。如果你和你的伴侣在第一次约会之后都要求再次约会,那么你们就配对了。最初的约会中有多少比例是匹配的?

  • 大多数人都找到了匹配——中位数匹配率约为13%
  • 有些人非常成功,匹配率超过80%
  • 不幸的是,约17-19%的男性和女性没有找到配偶
  • 总而言之,这些速配活动似乎达到了预期的效果
res.rounds = splitapply(@numel, G, G);% #初始日期Res.matched = splitapply(@sum, csv. csv)匹配,G);% #匹配Res.matched_r = res.matched ./ res.rounds;%匹配率边=[0 0.4 1:9]。/ 10;%本边缘数字%的新人物直方图(res.matched_r (res。性别== 1),边,...%的柱状图“归一化”“概率”男性配对率%持有%覆盖另一个图直方图(res.matched_r (res。性别== 0),边,...%的柱状图“归一化”“概率”女性配对率%持有%停止覆盖标题(“第一次约会成功的比例是多少?”%添加标题包含(sprintf ('%%匹配(中位数-男性%。1 f % %,女人% .1f % %)”...%轴标签中位数(res.matched_r (res。性别= = 1))* 100,...%值的男人中位数(res.matched_r (res。性别= = 0))* 100))%值女性xticklabels (string (0:10:90))%使用百分比xlim ([-0.05 - 0.95])%轴范围ylabel (' %参与者的%轴标签yticklabels (string (0:5:30))%使用百分比传奇(“男人”“女性”%添加传奇文本(-0.04,0.21,“0比赛”%注释

如果你提出更多的请求,你会得到更多的匹配吗?

为了匹配,你需要请求另一个约会,并让对方接受你的请求。这意味着一些配对率非常高的人肯定会要求与几乎所有他们遇到的人进行第二次约会,而他们的帮助也得到了回报。这是否意味着配对次数较少的人更挑剔,也不会像配对成功率较高的人那样经常要求再次约会?让我们画出请求率和匹配率——如果它们相互关联,那么我们应该看到一条对角线!

  • 你可以在50%的请求率以下看到一些相关性——尤其是对女性。在某种程度上,他们提出的请求越多,得到的匹配似乎就越多
  • 在请求率上有明显的性别差异——女性往往提出较少的请求——男性的请求中位数为44%,而女性为37%
  • 如果你要求每个人,你的里程是不同的-你可能仍然没有得到匹配。最后,只有当您的请求被接受时,您才会得到匹配
res.requests = splitapply(@sum, csv.dec, G);% #请求Res.request_r = res.requests ./ res.rounds;%请求速率数字%的新人物次要情节(2,1,1)%添加次要情节散射(res.request_r (res。性别= = 1),...%散点图男性res.matched_r (res。性别= = 1),“填充”“MarkerFaceAlpha”, 0.6)%覆盖另一个图散射(res.request_r (res。性别= = 0),...%散点图女性res.matched_r (res。性别= = 0),“填充”“MarkerFaceAlpha”, 0.6) r = refline(1,0);r.Color =“r”; r。线型=':'%参考线持有%停止覆盖标题(“你问得越多,火柴就越多吗?”%添加标题包含('%第二次约会请求'%轴标签xticklabels (string (0:10:100))%使用百分比ylabel (“%匹配”%轴标签yticklabels (string (0:50:100))%使用百分比传奇(“男人”“女性”“位置”“西北”%添加传奇次要情节(2,1,2)%添加次要情节直方图(res.request_r (res。性别= = 1),...%的柱状图“归一化”“概率”男性配对率%持有%覆盖另一个图直方图(res.request_r (res。性别= = 0),...%的柱状图“归一化”“概率”女性配对率%持有%停止覆盖标题(“女性提出的要求比男性少吗?”%添加标题包含(sprintf ('%%第二次约会请求(中位数-男性%。1 f % %,女人% .1f % %)”...中位数(res.request_r (res。性别= = 1))* 100,...%值的男人中位数(res.request_r (res。性别= = 0))* 100))%值女性xticklabels (string (0:10:100))%使用百分比ylabel (' %参与者的%轴标签yticklabels (string (0:5:20))%使用百分比传奇(“男人”“女性”%添加传奇

决定同意第二次约会

大多数人对第二次约会的对象更加挑剔。做出这样的决定最明显的两个因素是,他们有多喜欢他们遇到的人,以及他们认为他们会从对方那里得到“是”的可能性有多大。当你觉得没有可能得到对方的同意时,无论你多么喜欢他或她,向他请求第二次约会都是没有意义的。使用这两个因素,你可以看到Yes和No之间相当好的相关性。

请注意,我将“喜欢”和“可能”(得到肯定)的评分标准化了,因为实际的评分尺度因人而异。您可以从数据中减去平均值以使数据以零为中心,然后除以标准差以规范化值范围。

Func = @(x) {(x - mean(x))./std(x)};% func正常化f = csv.like;%得到喜欢f (isnan (f)) = 0;%将NaN替换为0f = splitapply(func, f, G);%按组规范化像= vertcat (f {:});%添加标准化的f = csv.prob;%得到概率f (isnan (f)) = 0;%将NaN替换为0f = splitapply(func, f, G);%按组规范化概率= vertcat (f {:});%添加规范化问题数字%的新人物次要情节(1、2、1)%添加次要情节gscatter(如(csv。性别= = 1),...%散点图男性概率(csv。性别= =1),csv。dec(csv.gender == 1),rb的“o”)标题(“第二次约会的决定——男人”%添加标题包含(“喜欢,归一化”%轴标签ylabel (“得到“是”的可能性,正常化”%轴标签ylim (5 [5])%轴范围传奇(“不”“是的”%添加传奇次要情节(1、2、2)%添加次要情节gscatter(如(csv。性别= = 0),...%散点图女性概率(csv。性别= =0),csv。dec(csv.gender == 0),rb的“o”)标题(“第二次约会的决定——女性”%添加标题包含(“喜欢,归一化”%轴标签ylabel (“得到“是”的可能性,正常化”%轴标签ylim (5 [5])%轴范围传奇(“不”“是的”%添加传奇

影响决策的因素

如果你能正确猜测得到肯定的概率,那应该会有很大帮助。我们能否只使用可观察和可发现的因素来做出这样的预测?

特征是通过标准化和其他技术生成的feature_eng.m为更多的细节。为了确定哪些特征更重要,生成的特征集被分成训练集和抵制集,训练集用于生成随机森林模型bt_all.mat使用分类学习者应用.有什么好随机森林它能告诉你吗预测重要性估计根据随机更改特定预测器值时误差增加的方式。如果它们无关紧要,错误率就不会增加太多,对吧?

基于这些分数,最重要的特征是:

  • 吸引力差——参与者对伴侣吸引力的评价与他们自己的评价之间的差异
  • 参与者给他们的伴侣的吸引力打分
  • 分享-参与者给他们的伴侣的共同利益的评分
  • 乐趣-参与者给他们的伴侣的乐趣评级
  • Field_cd -参与者的研究领域

最不重要的特征是:

  • 年龄差-参与者和他们的伴侣之间的年龄差
  • 顺序——他们在活动的哪一部分第一次见面——早一点或晚一点
  • 相同——参与者和他们的伴侣是否属于同一种族
  • 阅读-参与者对阅读兴趣的评分
  • Race_o——合伙人的比赛
feature_eng%工程师特性负载bt_all%负载训练模型小鬼= oobPermutedPredictorImportance (bt_all.ClassificationEnsemble);%获取预测器重要性var = bt_all.ClassificationEnsemble.PredictorNames;%预测的名字数字%的新人物次要情节(2,1,1)%添加次要情节[~,排名]=排序(imp,“下”);%获得排名酒吧(imp(等级(1:10)));% plot前10标题(“袋外排列预测器重要性估计”);%添加标题ylabel (“估计”);%轴标签包含(“十大预测”);%轴标签xticks (1:20);%设置x轴刻度xticklabels (var(等级(1:10)))%的标签栏xtickangle (45)%旋转标签甘氨胆酸ax =;%获得电流轴斧子。TickLabelInterpreter =“没有”关闭乳胶%次要情节(2,1,2)%添加次要情节[~,排名]= (imp)进行排序;%获得排名酒吧(imp(等级(1:10)));%图底部10标题(“袋外排列预测器重要性估计”);%添加标题ylabel (“估计”);%轴标签包含(“底10预测”);%轴标签xticks (1:10);%设置x轴刻度xticklabels (var(等级(1:10)))%的标签栏xtickangle (45)%旋转标签甘氨胆酸ax =;%获得电流轴斧子。TickLabelInterpreter =“没有”关闭乳胶%

用坚持集验证模型

为了对预测器值有信心,让我们检查一下它的预测性能。模型保留了没有底部的2个预测因子-见bt_45.mat所得模型对参与者决策的预测准确率达到79.6%。这看起来比人类参与者要好得多。

负载bt_45%负载训练模型Y = holdout.dec;%地面实况X =抵抗(:1:end-1);%预测Ypred = bt_45.predictFcn (X);%的预测c = confusionmat (Y, Ypred);%得到混淆矩阵disp (array2table (c,...%表示矩阵为表“VariableNames”,{“Predicted_No”“Predicted_Yes”},...“RowNames”,{“Actual_No”“Actual_Yes”}));精度=总和(c(逻辑(眼(2))))/总和(和(c))%的分类精度
Predicted_No Predicted_Yes ____________ _____________ Actual_No 420 66 Actual_Yes 105 246 accuracy = 0.7957

相对吸引力

我们发现,相对吸引力是决定说“是”的一个主要因素。attrgap分数表明伴侣相对于参与者的吸引力有多大。正如你所看到的,当人们的伴侣比自己更有吸引力时,无论性别,人们都倾向于说“是”。

  • 这是一个两难的处境,因为如果你对比你更有吸引力的人说“是”,他们更有可能说“不”,因为你没有那么有吸引力。
  • 但如果你有一些可取的品质,比如有更多共同的兴趣爱好或有趣,那么你可能会从更有吸引力的伴侣那里得到肯定
  • 这对男女都适用。是不是只有我这么想,或者是不是男性更愿意接受不那么有魅力的伴侣,而女性更容易接受有趣的伴侣?罗兰不确定——她认为只有我这么想。
数字%的新人物次要情节(1、2、1)%添加次要情节gscatter (train.fun(火车。性别= =' 1 '),...%散射男性train.attrgap(火车。性别= =' 1 '), train.dec (train.gender = =' 1 '),rb的“o”)标题(“第二次约会的决定——男人”%添加标题包含(“伙伴”年代有趣评级”%轴标签ylabel (伙伴”年代相对Attractivenss%轴标签ylim (4 [4])%轴范围传奇(“不”“是的”%添加传奇次要情节(1、2、2)%添加次要情节gscatter (train.fun(火车。性别= =' 0 '),...%散射女train.attrgap(火车。性别= =' 0 '), train.dec (train.gender = =' 0 '),rb的“o”)标题(“第二次约会的决定——女性”%添加标题包含(“伙伴”年代有趣评级”%轴标签ylabel (伙伴”年代相对Attractivenss%轴标签ylim (4 [4])%轴范围传奇(“不”“是的”%添加传奇

我们擅长评估自己的吸引力吗?

如果相对吸引力是我们决定说“是”的关键因素之一,那么我们对自己吸引力的评估有多好呢?让我们把对吸引力的自我评价与参与者收到的平均评价进行比较。如果你从自我评价中减去收到的平均评分,你可以看到人们高估自己吸引力的程度。

  • 我们通常高估了自己的吸引力——在1-10的范围内,中位数几乎高出1分
  • 男人往往比女人高估得多
  • 如果你高估了,那么你就更有可能对你得到“是”答案的概率过度自信
Res.attr_mu = splitapply(@(x) mean(x,“omitnan”), csv。attr_o G);%平均attr评分[idx, ~ ~] =独特(G);%获得唯一索引res.attr3_1 = csv.attr3_1 (idx);%删除重复的Res.atgap = res.attr3_1 - res.attr_mu;%加上评分差距数字%的新人物直方图(res.atgap (res。性别= = 1),“归一化”“概率”% histpgram男性持有%覆盖另一个图直方图(res.atgap (res。性别= = 0),“归一化”“概率”% histpgram女持有%停止覆盖标题(“人们有多高估自己的吸引力?”%添加标题包含([“评级差异”...%轴标签sprintf ((中位数-男性%。2 f,女人% .2f)”...中位数(res.atgap (res。性别= = 1),“omitnan”),...中位数(res.atgap (res。性别= = 0),“omitnan”))) ylabel (' %参与者的%轴标签传奇(“男人”“女性”%添加传奇

吸引力在情人眼里

我们不善于判断自己的吸引力的一个可能的原因是,对大多数人来说,它是在情人眼里的。如果你把人们收到的评价的标准差画出来,差距是相当大的,尤其是对男性。

图res.attr_sigma = splitapply(@(x) std(x,“omitnan”), csv。attr_o G);attr评分的% sigma直方图(res.attr_sigma (res。性别= = 1),...% histpgram男性“归一化”“概率”)举行%覆盖另一个图直方图(res.attr_sigma (res。性别= = 0),...% histpgram女“归一化”“概率”)举行%停止覆盖标题(“收到的吸引力评分分布”%添加标题包含(“收到的吸引力评分的标准差”%轴标签ylabel (' %参与者的%轴标签yticklabels (string (0:5:30))%使用百分比传奇(“男人”“女性”%添加传奇

谦虚是成功的关键

考虑到人们并不总是善于评估自己的吸引力,这对最终目标——配对有什么影响呢?让我们关注长相一般的人(给自己打6分或7分的人),看看自我评估是如何影响结果的。

  • 现实地估计自己吸引力的人,与平均值的差距小于0.9,表现得相当不错
  • 高估的人表现最差
  • 低估的人表现最好
Is_realistic = abs(res.atgap) < 0.9;% lealitics估计Is_over = res.atgap >= 0.9;%高估Is_under = res.atgap <= -0.9;%低估is_avg = ismember (res.attr3_1者;%平均看起来组数字%的新人物散射(res。attr_mu (is_avg & is_over),...%绘制高估Res.matched_r (is_avg & is_over))保持%覆盖另一个图散射(res。attr_mu (is_avg & is_under),...%绘制低估res.matched_r(is_avg & is_under))attr_mu (is_avg & is_realistic),...%绘制lealiticsRes.matched_r (is_avg & is_realistic))保持%停止覆盖标题(“自我评价6-7分的吸引力匹配率”%添加标题包含(“收到的平均吸引力评分”%轴标签ylabel (“%匹配”%轴标签传奇(“Overestimators”“Underestimators”....%添加传奇“现实的估计”“位置”“西北”

总结

看起来,只要你适当地设定自己的期望,你就能在快速约会中找到合适的对象。以下是我的一些建议。

  • 相对吸引力比人们承认的更重要,因为你不会在四分钟内对你的伴侣有太多了解。
  • 但是人们对谁有吸引力的看法千差万别。
  • 如果你们有更多共同的兴趣或更多的乐趣,你们仍然可以做得很好——所以要明智地利用这四分钟。
  • 对自己的外表要谦虚,寻找那些对自己的外表也很谦虚的人——你更有可能找到匹配的对象。

我们还应该记住,数据来自当时在哥伦比亚大学就读的学生——正如研究领域等变量所表明的那样——因此,研究结果可能不能推广到其他情况。

当然,我也完全缺乏快速约会的实际经验——如果你有,请让我们知道你对下面的分析和你自己的经验有什么看法。




发布与MATLAB®R2016b

|