面试 | 字节跳动秋招提前批算法岗

岗位:头条提前批 算法岗

一面

1、自我介绍讲项目

2、说一下LDA模型原理

3、说一下LDA哪些是潜在的变量 哪些是显示变量

【重新梳理一下LDA主题模型的技术细节!回答的不是太好~】

4、概率题:甲乙两人掷骰子 甲掷一次 乙掷n次取最大点数 求乙点数比甲点数大的概率?

这题概率论还是有点难意思的,当时自己确实没想好,没有回答出来,回来和室友交流了下,把答案总结下,其实当时应该反过来思考的:

当时自己的思路:

首先,分析特殊情况,如果n取1的情况,那么结果应该是:

  • 总共有 6 × 6 = 36 6×6=36 6×6=36种情况,甲取1 2 3 4 5;乙对应可以取[2,3,4,5,6],[3,4,5,6],[4,5,6],[5,6],[6],即15种情况,所以概率为 15 36 = 5 12 \frac{15}{36}=\frac{5}{12} 3615=125

推广到一般情况下呢?

  • 如果甲=1,那么乙只需要有一次是大于1的即可
  • 如果甲=2,那么乙只需要有一次是大于2的即可
  • 如果甲=3,那么乙只需要有一次是大于3的即可
  • 如果甲=4,那么乙只需要有一次是大于4的即可
  • 如果甲=5,那么乙只需要有一次是大于5的即可
  • 甲不可能为6

面试过程中就是把自己的思路说了下,其实当时应该顺着这个思路反过来思考!也就是:

  • 如果甲=1,那么乙每一次全输的概率是多少?如果1-全输的概率=至少赢一次的概率!而对应题意,至少赢一次=乙只需要有一次是大于1的即可!而全输的概率=全为小于等于1= ( 1 6 ) n (\frac{1}{6})^n (61)n,所以 P(至少赢一次) = P(乙只需要有一次是大于1) = 1 − ( 1 6 ) n 1-(\frac{1}{6})^n 1(61)n
  • 如果甲=2,同理,P(乙只需要有一次是大于2) = 1 − ( 2 6 ) n 1-(\frac{2}{6})^n 1(62)n
  • 如果甲=3,同理,P(乙只需要有一次是大于2) = 1 − ( 3 6 ) n 1-(\frac{3}{6})^n 1(63)n
  • 如果甲=4,同理,P(乙只需要有一次是大于2) = 1 − ( 4 6 ) n 1-(\frac{4}{6})^n 1(64)n
  • 如果甲=5,同理,P(乙只需要有一次是大于2) = 1 − ( 5 6 ) n 1-(\frac{5}{6})^n 1(65)n

而甲每次取不同值的概率为 1 6 \frac{1}{6} 61,所以乙点数比甲点数大的概率为:
1 6 × [ 1 − ( 1 6 ) n + 1 − ( 2 6 ) n + 1 − ( 3 6 ) n + 1 − ( 4 6 ) n + 1 − ( 5 6 ) n ] = 1 6 × [ 5 − ( 1 6 ) n − ( 2 6 ) n − ( 3 6 ) n − ( 4 6 ) n − ( 5 6 ) n ] \frac{1}{6} ×[1-(\frac{1}{6})^n+1-(\frac{2}{6})^n+1-(\frac{3}{6})^n+1-(\frac{4}{6})^n+1-(\frac{5}{6})^n]=\frac{1}{6}×[5-(\frac{1}{6})^n-(\frac{2}{6})^n-(\frac{3}{6})^n-(\frac{4}{6})^n-(\frac{5}{6})^n] 61×[1(61)n+1(62)n+1(63)n+1(64)n+1(65)n]=61×[5(61)n(62)n(63)n(64)n(65)n]

代入n=1进行检验,结果为 5 12 \frac{5}{12} 125 没问题!说明上面概率求得是对的!

小结:概率论的问题如果正面思考比较有难度,不好计算,尝试从反面来思考,也就是它的对立事件,有时候就会豁然开朗了!

5、平常用什么语言?来写个代码吧。问题是这样的,我们来做个字符串的变换!
两种情况,

  • 第一种字符串为:appleBananaConment,即每个字母拼在一起,然后单词首字母为大写,我们希望变成 apple_banana_comment,也即大写变成小写,然后在单词之间用一个下划线来进行分割!
  • 第二种字符串为:appleHTTPBanana,这时候有个特殊情况就是会有连续的大写字母的存在,它们为专有名词,我们也希望把它们全变为小写,同时前后还是用下划线来分割!
  • 对于上述两种情况,请用Python进行实现!
  • 判断字符串是否为大小写
s = 'A'
print(s.isupper())
s = 'aBa'
print(s.islower())
s = 'a'
print(s.islower())
True
False
True
  • 转变字符串大小写
'aaa'.upper()
'AAA'
  • 完整版代码:
'aBc'.lower()
'abc'
def Trans(s):
    '''转换字符串为指定格式'''
    
    n = len(s)-1
    new_s = ''
    i = 0
    while i<=n:
        while i <= n and s[i].islower():
#             print(i)
            # 如果是小写
            new_s += s[i]
            i += 1
        # 跳出循环表明遇到了大写 这时候加一个下划线
        j = 0
        while i <= n and s[i].isupper():
            # 如果是大写
            j += 1
            i += 1
        if j == 1:
            new_s += '_' # 首先加下划线
            new_s += s[i-j:i].lower() # 然后变成小写
        elif j > 1:
            new_s += '_' # 首先加下划线
            new_s += s[i-j:i-1].lower() # 然后变成小写
            new_s += '_'
            new_s += s[i-1].lower()
        else:
            return new_s
#         print(new_s)
    return new_s

  • 实验结果:
Trans('appleBananaConment')
'apple_banana_conment'
Trans('appleHTTPBanana')
'apple_http_banana'

6、说下下采样的方法。然后比较抠easyensemble 概率分布的问题 好像和bias相关?

面试官一直在关注EasyEnsemble的抽样问题!

可参考:

  • http://www.danniguo.com/index.php/archives/202/
  • http://vividfree.github.io/机器学习/2015/12/15/model-calibration-for-logistic-regression-in-rare-events-data

你可能感兴趣的:(Python,面试题)