一面,面试官很好,就是我太菜。
1. 自我介绍
2. 项目相关的事情
3.PCA的原理
4.K-means的k值怎么选?
5.介绍AUC
6.写出logistic regression交叉熵损失的形式,还有写出pk的公式。
7.KD树
8.介绍GBDT,gradient是什么意思
9.Xgboost和GBDT的区别,Xgboost如何处理稀疏数据
10.lightGBM
11.编程题:求有环数组 [1,4,9,5,10]中, 元素不相邻的子数组最大和,其中元素均不小于0:
分析:动态规划:
(1)先分析没有环的时候
表示第i个元素及之前的所有元素可以取得的最大元素和。由于元素不能相邻,当取第i个元素时只能加上
,当不考虑第i个元素时直接取
。因此有以下状态转移方程:
# 无环
def solve(array):
if not array:
return 0
if len(array) == 1:
return array[0]
if len(array) == 2:
return max(array)
dp = [i for i in array]
for i in range(2, len(array)):
dp[i] = max(dp[i - 2] + dp[i], dp[i - 1])
return max(dp)
(2)有环的时候
有环时,要注意第一个元素和最后一个元素不能够同时取得。需要列表sym记录当前是否使用到了首元素。同时需要循环移位,避免尾元素未被考虑的情况。
# 有环
def solve_loop(array):
if not array:
return 0
if len(array) == 1:
return array[0]
if len(array) == 2:
return max(array)
front = 0
MaxValue = 0
l = len(array)
while front < 2: # 需要循环移位
sym = [True] * l # 记录当前dp[i]是否使用到了首元素,True表示使用到了
sym[front + 1] = False # 第2个元素肯定不能用到首元素
dp = [x for x in array]
j = front + 2 # 记录循环开始指针
while j < l + front:
i = j % l # 循环队列下标
if dp[i - 2] + dp[i] > dp[i - 1]:
dp[i] = dp[i - 2] + dp[i]
sym[i] = sym[i - 2]
else:
dp[i] = dp[i - 1]
sym[i] = sym[i - 1]
j += 1
x = dp.pop(i) # 将最后的元素弹出
Value = x if max(dp) < x and not sym[i] else max(dp) # 求本次循环的最大值
MaxValue = max(MaxValue, Value) # 更新最大值
front += 1
return MaxValue