文章目录
牛客网真题
笔试部分
一、美团点评2020校招数据分析方向
1、广告分析
1、广告是互联网企业重要的变现模式,在美团的广告业务中,商家会和美团的销售签订不同类型的广告合同(比如,按点击收费的广告cpc、按曝光收费的广告cpm、按时长收费的广告cpt)。美团会为商家创建相关的广告内容素材创意(比如,门店图片、活动图片、促销文字等),并通过美团的广告引擎,根据用户访问的行为特征,基于算法策略将商家的广告内容投放到美团的app或者外部合作伙伴(比如如:腾讯,头条)的app不同的展示位置上。普通用户访问这些广告后,会对商家产生兴趣,可能产生购买转换行为,美团会和商家做广告的计费结算,同时为商户提供用户的广告效果信息(比如:广告带来的门店访问量、订单数等)。
(1)、 如果让你对这个业务进行抽象,你会抽象出哪些数据分析主题,并说出你这样分的原因;
收费模式:按点击收费的广告cpc,按曝光收费的广告cpm,按时长收费的广告cpt
广告投放流程:广告素材创意 => 用户访问的行为特征 => 基于算法策略 => 投放到美团的app或者外部合作伙伴的app => 不同的展示位置上
商家引流流程:广告投放 => 用户访问 => 购买转换行为 => 和商家做广告的计费结算 => 为商户提供用户的广告效果信息(访问量、订单数量)
从广告的角度: 广告素材特点和用户访问量的主题:用来分析不同特点和素材的广告对吸引用户访问是否有较大的关系。
从用户的角度: 用户访问行为特征和最终购买行为主题:分析用户在广告页面滑动、点击、停留等特征,是否对最终购买行为有较大的关系。
收费模式、商户类型、商户付费的关系:分析不同类型的商户在不同模式下的付费意愿,用于向未使用广告业务的商户推广
投放时段和访问量订单数的关系:能带来高访问量或订单数的投放时段,价格可以适当调整
不同类型商户广告投放的效果分析:分析哪些类型商户广告投放效果较差,可以帮助商户调整引流策略
(2)、 请你根据问题1抽象的主题,进行主题模型设计,并说明设计的模型内容,以及模型之间的关系。
用户访问行为特征和最终购买行为主题:特征值可以选择用户点击进入广告后的行为特征,包括滑动速度、滑动方向、停留时间、点击等。
结合最终购买行为,用来分析用户行为特征对购买行为的影响。可以实时预测用户行为是否有较大几率产生购买行为。对购买意愿弱的用户,可以在页面中实施其他推广营销策略,加强用户的购买意愿。
2、说明关系型数据库通过索引提升查询效率的背后原理
-
如果没有索引,数据库引擎需要通过全表扫描来查找数据,这会产生大量的磁盘IO。
-
关系型数据库使用B+树构建索引来加速加快查询。B+树是一种二叉查找树(每个节点的键值必须:比保存在左子树的任何键值都要大,比保存在右子树的任何键值都要小),这样随机查找某个键值时可以通过从根节点执行二叉查找来加速查询,查询成本取决于树的层数。
-
针对范围查询和排序的优化:在每个叶子节点保存其下一个叶子节点的指针,这样当指定范围范围查询时,先从根节点根据范围的左值找到其叶子节点,之后通过向后遍历叶子节点即可找到对应范围右值,这样可以加速范围查询、排序、分组等数据库查询动作。
-
针对磁盘读写速度的优化:除了叶子节点之外的其他节点只保存键值,这样对磁盘的单次读写可以获取到尽可能多的数据。以MySQL为例,一个1000万行的表对应的B+树按照主键查找理论上只需要3次磁盘IO,这相对于全表扫描带来的磁盘IO是多个量级的性能提升。
-
MySQL等数据库引擎在实际实现B+树索引的时候,针对磁盘读写做了优化:非叶子节点中只存放key值,叶子节点中除了key值也会存放数据,按照存放数据的不同索引区分为主索引(聚簇索引)和辅助索引:
a) 主索引的叶子节点中存放该key值对应的完整记录,使用主索引进行查找时,可以直接输出记录;一个表只能创建一个主索引。
b) 普通索引的叶子节点则存放对应主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找;一个表可以创建多个辅助索引。
- 除了B+树,关系型数据库一般也支持哈希索引,哈希索引能够非常高效地进行随机查找,但是对于范围查询、排序和分组都不支持。
3、污水处理问题
一家污水处理厂通过去掉污水中有害的污物来净化水质,生产出用于灌溉使用的水源。该处理过程每小时可以去掉处理池中剩余污物的12%。
问:1.一天后处理池中将大概处理掉百分之几的污物?
2.要多长时间才能把污物的量减少一半?
4、编程题:旗子翻转
在4*4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
输入描述
给定两个数组,分两行,第一行为分别为初始棋盘,为4*4矩阵,其中0表示白色棋子,1表示黑色棋子,第二行为翻转位置,其中翻转位置共有3个
输出描述
请返回翻转后的棋盘,为4*4矩阵
输入例子:[[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]] [[2,2],[3,3],[4,4]]
输出例子:[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]]
def tools(x):
return 0 if x == 1 else 1
def reverse(board, position):
for pos in position:
row,col = pos[0]-1, pos[1]-1
if row > 0:
board[row-1][col] = tools(board[row-1][col])
if row < 3:
board[row+1][col] = tools(board[row+1][col])
if col > 0:
board[row][col-1] = tools(board[row][col-1])
if col < 3:
board[row][col+1] = tools(board[row][col+1])
return board
if __name__ == '__main__':
board = eval(input())
position = eval(input())
board = reverse(board,position)
print(str(board).replace(' ',''))
print(type(str(board).replace(' ','')))
5、编程题:寻找最后的山峰
def top(l):
# 考虑边界
l.insert(0,float('-inf'))
l.append(float('-inf'))
for i in range(len(l)-1,-1,-1):
if l[i] >= l[i-1] and l[i] >= l[i+1]:
return i - 1
if __name__ == '__main__':
l = list(map(int, input().split()))
print(top(l))
7、[编程题]关联查询。
数据对象data1List,员工表,存储员工ID,员工姓名 数据对象data2List, 员工工作时长表,存储员工ID,月份,工时 计算每个员工1-3月每月工时及总工时。
(1)输入描述:
员工ID 员工姓名
员工ID 月份 工时 月份 工时 月份 工时
(2)输出描述:
员工姓名 空格 一月份工时 空格 二月份工时 空格 三月份工时 空格 总工时
(3)输入例子:
1 zhangwei01
1 01 200 02 150 03 196
(4)输出例子:
zhangwei01 200 150 196 546
def workingTime(list1, list2):
t1 = list2[2]
t2 = list2[4]
t3 = list2[6]
t = int(t1)+int(t2)+int(t3)
result = [list1[1], t1, t2, t3, t]
return ' '.join(map(str, result))
if __name__ == '__main__':
list1 = input().split()
list2 = input().split()
print(workingTime(list1, list2))
一些小知识:input()输入的是一个str; split()后返回的是一个列表,列表中的元素是str
对于input(),如果你要传递参数是一个列表而且要求你输入的也是列表的形式,你需要使用eval函数,将引号去掉eval(input())
;
如果你传递的参数是列表,但是你输入的是数字 空格 数字 空格形式,你需要使用split()函数,input().split()
,他是一个列表,列表中的数字是字符串的形式;但可以使用map将元素形式改为整形:list(map(int, input().split()))
,对于map(int, input().split())他得到的是一个map类型,你可以使用list打开转化成list,也可以根据里面元素的多少进行赋值,比如a,b = map(int, input().split())\
9、[编程题]月份天数。输入年份月份,请输出这个月的天数
(1)输入描述:
多组输入输出
第一个参数为年份,如2018代表2018年,2019代表2019年第二个参数为月份,如1代表1月,2代表2月
(参数间均以空格隔开)
(2)输出描述:
输出当月的实际天数。
(3)输入例子:
2018 2
2020 2
2019 1
(4)输出例子:
28
29
31
def judge(year, month):
if month in (1,3,5,7,8,10,12):
return 31
if month in (4,6,9,11):
return 30
if month == 2:
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
return 29
else:
return 28
if __name__ == "__main__":
while True:
try:
year, month = map(int, input().split())
print(judge(year, month))
except:
break
二、知乎上找了一篇2018网易游戏数据挖掘实习生笔试面经
单选
1.哪些是基于规则的分类器?
KNN?Bayes?ANN?C4.5?
Apriori(基于关联规则的数据挖掘算法),决策树
2.K均值与DBSCAN比较?
两者比较来这里看
我根本不知道什么是DBSCAN好吗!
DBSCAN密度聚类算法,DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。K均值算法的时间复杂度是O(m),而DBSCAN的时间复杂度是O(m^2)。
3.数据粒度的性质
这个也不认识!
确定数据仓库中数据的恰当粒度是数据仓库开发者需要面对的一个最重要的设计问题。数据粒度主要针对指标数据的计算范围,如人口这个数据项在统计部门是以街区范围还是一个社区为范围统计的。人口数据细化程度越高,粒度级就越小;相反,细化程度越低,粒度级就越大。粒度是数据仓库主要设计问题,因为它极大地影响存放在数据仓库中的数据量的大小,同时影响数据仓库所 能回答的查询类型。在设计数据仓库的时候权衡数据量大小和查询类型得出合理的粒度大小。
4.召回率 准确率
混淆矩阵:
准确率:
精确度(precision):
他的意义是在你预测为是少数类的样本中,真实的少数类所占的比例,精确度越低,代表你误伤了过多的多数类
召回率:
代表被我们预测为少数类的样本中,真正的少数类所占的比例。
F1:
5.多元线性回归:某一x对其他x判定系数接近1 表明什么?
6.LR中的R2是什么?
7.X={1,2,3}可产生___个关联规则?
{1}→{2,3}
{2}→{1,3}
{3}→{1,2}
{1,2}→{3}
{1,3}→{2}
{2,3}→{1}
8,.有关数据仓库的开发特点
面向主题
集成性
相对稳定性
反映历史变化
9.logistic可以做SVM的核函数吗?
好像不能吧
下列不是SVM核函数的是:
多项式核函数
logistic核函数
径向基核函数
Sigmoid核函数
这道题的答案是logistic核函数。不要把这里的sigmoid和logistic混淆了,为什么?看下面解释:支持向量机是建立在统计学习理论基础之上的新一代机器学习算法,支持向量机的优势主要体现在解决线性不可分问题,它通过引入核函数,巧妙地解决了在高维空间中的内积运算,从而很好地解决了非线性分类问题。构造出一个具有良好性能的SVM,核函数的选择是关键.
核函数的选择包括两部分工作:一是核函数类型的选择,二是确定核函数类型后相关参数的选择.因此如何根据具体的数据选择恰当的核函数是SVM应用领域遇到的一个重大难题,也成为科研工作者所关注的焦点,即便如此,却依然没有得到具体的理论或方法来指导核函数的选取.
1、经常使用的核函数 核函数的定义并不困难,根据泛函的有关理论,只要一种函数 K( xi, xj) 满足Mercer条件,它就对应某一变换空间的内积.对于判断哪些函数是核函数到目前为止也取得了重要的突破,得到Mercer定理和以下常用的核函数类型:
(1)线性核函数 K( x, xi) = x ⋅ xi
(2)多项式核 K( x, xi) = (( x⋅ xi) + 1 )d
(3)径向基核(RBF) K( x, xi) = exp ( − ∥x− xi∥2σ2)Gauss径向基函数则是局部性强的核函数,其外推能力随着参数 σ的增大而减弱。多项式形式的核函数具有良好的全局性质。局部性较差。
(4)傅里叶核 K( x, xi) = 1− q22( 1− 2q cos( x− xi) + q2)
(5)样条核 K( x, xi) = B2n +1 (x −xi)
(6)Sigmoid核函数 K( x, xi) = tanh ( κ ( x , xi) − δ ) 采用Sigmoid函数作为核函数时,支持向量机实现的就是一种多层感知器神经网络,应用SVM方法,隐含层节点数目(它确定神经网络的结构)、隐含层节点对输入节点的权值都是在设计(训练)的过程中自动确定的。而且支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部最小值,也保证了它对于未知样本的良好泛化能力而不会出现过学习现象。
10.什么办法可以减少过拟合
正则化
早停
多选
1.数据清理中处理缺失值的办法?
2.数据仓库的特点?
3.评价分类模型的尺度?
4.影响K均值的主要因素?(与样本数有没有关?
5.PCA的原理是?
PCA算法的三种求解形式对比
小波分析怎么降维?
线性判别法?
LASSO可以减少参数?
分析题
如何划分用户群体?
RFM、四象限模型
哪些是核心群体?为什么?
仓库
考察数据仓库和数据粒度的基本概念
数据仓库分为哪些层?
数据仓库一般分为ODS层
、DWD和DWS层
、应用层
。
- ODS层:数据缓存层,数据仓库源头系统的数据表通常会原封不动地存储一份,这成为ODS(Operation Data Store)层。它们是后续数据仓库层加工数据的来源,同时也存储着历史的增量数据或全量数据。
- DWD和DWS层:数据仓库明细层(Data Warehouse Detail, DWD)和数据仓库汇总层(Data Warehouse Summery, DWS)是数据平台的主体内容,这两个层的数据是ODS层数据经过ETL清洗、转换、加载生成的。
- 应用层(ADS):应用层主要是各个业务方或者部门基于DWD和DWS建立的数据集市(Data Market, DM),一般来说应用层的数据来源于DW层,而且相对于DW层,应用层只包含部门或者业务方面自己关心的明细层和汇总层的数据。
小知识点
1、l1正则化本质上是假设参数先验分布服从Laplace分布
2、l2正则化本质上是假设参数先验分布服从高斯分布
3、用梯度下降训练神经网络的参数,为什么参数有时会被训练为nan值?
输入数据本身存在nan值,或者梯度爆炸了(可以降低学习率、或者设置梯度的阈值)
4、