Python3 -- 数据科学初探

作者: 0han | 来源:发表于2017-05-25 20:38 被阅读48次

    【作者:0han 未经授权请勿转载】

    前面看了一篇文章,"非诚勿扰"的数学分析 很有意思的一个问题,来源于著名的“秘书问题”:要聘请一名秘书,有 n 个应聘者。每次面试一人,面试后就要及时决定是否聘他,如果当时决定不聘他,他便不会回来。面试后总能清楚了解应聘者的合适程度,并能和之前的每个人做比较。问什么样的策略,才使最佳人选被选中的概率最大。

    文章通过类似的微软面试题切入,通过计算得出了37法则,适用于恋爱中的男性女性理性地挑选另一半,适用的策略结论是:

    • 拒绝前M=N/e或者N/e+1个追求者,当其后的追求者比前M个追求者更适合则接受,否则拒绝。
    • N是追求者总数
    • e是自然对数底数,约等于2.718281828...
      很明显,追求者总数很难确认,但这是一个数学问题,作者在最后通过计算机做了一个频数分布,验证了这个n/e的公式在真实random选择中的作用,但并没有讲明算法。所以通过重写这个验证程序,可以感受使用python进行数据科学学习的美妙

    拓展库只需要pygal,pip3 install就可以了,这是个数据可视化库
    主算法:
    e=math.e#import math库获取自然对数底数e的值 initial=[]#初始数组 N=input("Input N:")#用户输入总数N,比如30个求偶者N就=30 for k in range(int(N)):#根据用户的输入创建一个数组准备分配这些可排列的数字 initial.append(k+1)#create an array called initial includes int numbers from 1 to n def run(n):#主函数 results_distribution=[] for i in range(n): random.shuffle(initial) M=round(float(N)/e) P=initial[M-1]#in python programming, the index of arry start from 0 before_array=[] Max_before_P=None final_choose=None for j in range(M): before_array.append(initial[j]) Max_before_P=max(before_array)#find the Max number in the range [1,P] for b in range(M,len(initial)-1):#set a range from the position of P (which is M-1) to the end N if initial[b]>=Max_before_P:#if any number in the range[M-1,N] bigger than before, final_choose=initial[b]#pick it, assign to final_choose var else:#if not, means 10 occurs before the position of P, choose the last one. final_choose=initial[len(initial)-1] results_distribution.append(final_choose) return results_distribution

    数据可视化:
    fre_dis= pygal.Bar() res=run(100000)#repeat 1000 times frequencies = frequencies(res) fre_dis.add('distribution', frequencies) # add the frequencies fre_dis.x_labels=map(str, range(1,int(N)+1)) fre_dis.x_title = 'Results' fre_dis.y_title = 'Frequency' fre_dis.title = 'Distribution of each size of diamond' fre_dis.render_to_file('bar_chart.svg')

    完整代码可以在github找我

    最后的效果如下,程序跑10000遍随机生成的数组,包含了30个元素的等差数列,按照策略,放弃30/e约等于11的“炮灰”,第12个人开始好好选,只要有比前11个好的,就选其,如果都没有的话就选最后一个,30号(最好的男人)被选中的概率确实高:

    Screen Shot 2017-05-25 at 9.59.13 pm.png

    相关文章

      网友评论

        本文标题:Python3 -- 数据科学初探

        本文链接:https://www.haomeiwen.com/subject/dcizxxtx.html