最近(2019.9.30日)参加了科大国创软件公司的算法工程师笔试,做的试卷内容主要偏大数据挖掘,试题内容如下,现在给出一些参考答案,如有错误和疑问,可以在后面给出评论。
1 选择题
1.1 下列有关k-mean算法说法正确的是()
A:能自动识别类的个数,随机挑选初始点为中心点计算
B:数据数量不多时,输入的数据的顺序不同会导致结果不同
C:不能自动识别类的个数,不是随机挑选初始点为中心点计算
D:初始聚类中心的选择对聚类结果的影响很大
答案:D
解析:
参考链接:https://www.nowcoder.com/questionTerminal/827a43485c4842a1a1485c2f23999468?toCommentId=120916
对于A选项(错误),k-means算法无法自动识别聚类类别个数,需要给定k值和k个初始化类簇中心,其中类簇中心是随机挑选的。
对于B选项(错误),优化目标函数的过程中,都遍历所有的点,输入数据的顺序对结果没有影响。
对于C选项(错误),解释同A,k-means算法不能自动识别类的个数,但是需要随机挑选初始点为中心点(类簇中心)。
对于D选项(正确),初始聚类(类簇)中心的选择对聚类结果的影响很大。
1.2 Nave Bayes是一种特殊的Bayes分类器,特征变量是X,类别标签是C,它的一个假定是()
A:各类别的先验概率P(C)是相等的
B:以0为均值,sqr(2)/2为标准差的正态分布
C:特征变量X的各个维度是类别条件独立随机变量
D:P(X|C)是高斯分布
答案:C
解析:
朴素贝叶斯成立的条件就是每个变量相互独立,故C正确。
1.3 以下几种模型方法属于判别式模型(Discriminative Model)的有()
1)混合高斯模型 2)条件随机场模型 3)区分度模型 4)隐马尔科夫模型
A:2,3
B:3,4
C:1,4
D:1,2
答案:A
解析:
参考链接:机器学习:生成式模型和判别式模型
这个题目还是很重要且基础的,看下图
1.4 已知列表a=[1,2,3,5,6], 当执行a.insert(4,9)命令后,a的值为()
A:[1,2,3,5,6,4,9]
B:[1,2,3,4,5,6,9]
C:[1,2,3,5,9,6]
D:[1,2,3,9,5,6]
答案:C
解析:
这个题目考察python中对列表的常规操作,需要注意的是列表的insert()方法直接对列表进行改变,并不会创建副本,并返回相应修改过后的副本,insert(a,b)相当于在列表的第a个索引位置插入一个值为b的元素,对应于a.insert(4,9)则相当于在第4个位置插入一个值为9的元素,则现在a的值变为[1,2,3,5,9,6]
1.5 已知字符串x='hello world',那么执行语句x.replace('hello','hi')后x的结果是()
A:‘hello world’
B:'hillo world'
C:'hi world'
D:'world'
答案:A
解析:
首先需要明白,python中调用一个对象的一个方法后,对象的变化情况无外乎两种情况。一种是函数无返回值,通过对象调用方法则直接对对象进行操作,操作后对象的值发生变化;另一种是通过对象调用方法,首先创建一个对象副本,然后对该副本执行方法的操作,操作后返回已经改变了的副本,这个时候其实对象本身没有变化。上题中insert()方法相当于第一种情形,而本题中属于第二种类型,当x = 'hello,world',当执行x.replace('hello','hi')时,首先创建一个x的副本,然后对该副本执行'hello' -> 'hi'替换操作,之后返回替换后的副本,也就是x.replace('hello','hi')的值为返回值。也就是'hi world',但是x的值本身并没有变化,故仍然为'hello world',选择A
1.6 下面哪种函数定义的方式不合法()
A:def fun(**args)
B:def fun(arg=1)
C:def fun(*args,a=1)
D:def fun(a=1,*args)
答案:C
解析:牛客网试题
1 在Python2中,C选项是错误的。因为a=1被当做了默认参数,而默认参数只能在可变参数之前。
Python参数顺序:必选参数、默认参数、可变参数和关键字参数。
2 在python3中,C选项是对的,因为a=1被当做了命名关键字参数,而命名关键字参数需要在可变参数之后
Python3参数顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
1.7 一段代码执行如下:
def funa(a):
def funb(b):
Return a ** b
Return funb
则下列正确的描述是:
A:funa(2)(3)=8
B:funa(2)(3)=6
C:funa(2,3)=8
D:funa(2,3)=6
答案:A
解析:
1.8 下列代码执行的结果是()
a = map(lambda x: x ** 3,[1,2,3])
A:[3,6,9]
B:[1,2,3]
C:[1,8,27]
D:[3,8,29]
答案:C
解析:
1 在python2中,map()直接返回一个列表,答案为C
2 在python3中,map()直接返回一个迭代器,需要通过list()函数转化一下才行
1.9 以下哪种不是Python元组的定义方式()
A:(1)
B:(1,)
C:(1,2)
D:(1,2,(3,4))
答案:A
解析:
考察元组的基础知识
元组的元素相当于一个常量,程序只能使用它的值,却不能对它重新赋值。
但是,要定义一个只有1个元素的tuple,不能这样定义:t = (1)
因为定义的不是tuple,是1
这个数!这是因为括号()
既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1
python中规定定义一个只有一个元素的元组时候,这样定义:t = (1,)
1.10 下面的代码运行后,a,b,c,d四个变量的值运行错误的是()
import copy
a = [1,2,3,4,['a','b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
A:a=[1,2,3,4,['a','b','c'],5]
B:b = [1,2,3,4,['a','b','c'],5]
C:c = [1,2,3,4,['a','b']]
D:d = [1,2,3,4,['a','b']]
答案:C
解析:牛客网试题
首先说下Python里面的传值和传址。下面列出Python中传值和传址操作相对应的数据类型。
传值:数字(整型,浮点型,bool型等),字符串,元组
传址:列表,字典
首先本题的a为列表,则对应传址。传值与传值最大的区别在于--如果函数里面(函数外面的引用)对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会改变的,用传址传入就会。
本题b=a,则当a改变时,b会相应的改变,当a=[1,2,3,4,['a','b','c'],5],b也变为[1,2,3,4,['a','b','c'],5],故选项A和选项B正确。
对于copy()和deepcopy()的用法,主要在于想新建一个与a的值相等的b变量,同时b的值与a的值没有关联
但是当列表或字典参数里面的值是列表或字典时,copy并不会复制参数里面的列表或字典,这时就要用到deepcopy了
所以C错误,D(不变)正确
详细的解法请看这篇:Python中copy()和deepcopy()的区别
2 简答题
2.1 在机器学习中,出现过拟合怎么解决?
答案:可以通过
L1和L2正则化
添加dropout层
使用早停策略
增大训练数据样本
适当减小网络的复杂结构
使用keras、tf框架中的checkpointer,实时监控最好的模型
2.2 简述Python中的List、Set、Dict的主要特点以及他们的应用场景
3 数学题
3.1 某高中三年级统考数学、物理、化学三门课程,成绩统计结果是,至少有一门课得满分的有130人,其中数学满分的62人,物理满分的53人,化学满分的67人,数学、物理都得满分得19人,物理、化学都得满分的20人,数学、化学都得满分的22人。问:有且只有两门课程得满分的有多少人
3.2 线性回归参数推导过程-最小二乘法