数据挖掘面试

问题一:

你简历中上过的数据挖掘、机器学习等课程,是学校的研究生课程还是自己单独学习的;回答道:研究生课程有学习,自己单独私下也有学习

1、监督学习和无监督学习的区别?分类回归一般属于哪种?聚类属于哪种?请举例你知道的相关有监督学习和无监督学习算法

1:监督学习和无监督学习的区别在于:监督学习数据样本是带有标签的,而无监督学习的数据样本是没有标签的;分类回归一般属于监督学习,聚类是无监督学习;无监督学习大致又有层次聚类、核密度聚类等(本人对无监督研究并不是很深入,大致答了)常见的监督学习:KNN、决策树(后面陆续问到决策树有几种,区别是什么)、SVM(后续问到常用的核函数有哪些)、随机森林、xgboost、朴素贝叶斯、逻辑回归、神经网络;无监督学习主要有:K-means,基于密度聚类、基于谱聚类、ISO-Forest接触的等等

2、生成式模型和判别式模型的区别

2:判别式模型建模过程主要是依靠代价准则函数,通过代价准则函数,拟合出一个最优判别方程,进行判别,而生成式模型主要是依靠挖掘数据的内在规则(因此数据量要求也高),生成一个概率估计;例如逻辑回归和朴素贝叶斯,前者是判别模型,后者是生成模型

3、你对集成算法有了解吗?为什么集成要求的是弱分类器,弱分类器的定义是什么?而不能是强分类器?GBDT和xgboost的区别是什么?

3:对集成学习有一定的了解;弱分类器(这个貌似没有严格的理论定义),大致的意思就是分类性能较弱的一类分类器;集成学习可以是一类强分类器的集合,但是强分类器的话,可能每个分类器都拟合的很好,充分挖掘了数据的内在信息,因此无法实现多样性,使得集成之后的性能也就是近似于若干个强分类器中的一个,而没有达到我们需要的再次进化分类器性能的目的;至于GBDT和RF的区别在于:GBDT是一个串行建树的过程,是boost算法,通过生成下一棵决策树,来拟合数据集,使得模型在训练过程中尽量的减少bias;而RF是一个bagging算法,通过并行训练,生成模型,最后结果输出子树的投票结果

4、问了一下第一篇论文的一些细节东西

4:这里略过

5、现在开始问一下数据结构和JAVA相关的东西(没怎么学过,以下问题简答一下,怕误导人,大家看看就好);数据结构里面你了解哪些数据结构,Java的继承、多态、重载、Java序列化和反序列化你讲解一下

5:了解过链表、数组、队列、树、堆栈等;JAVA重载是可以命名若干个函数名一样的函数,但是由于函数输入类型不一样,使得我们可以通过输入类型来载入需要的函数模块;至于继承,就是子类继承父类,使得子类能够继承和使用父类的一些功能和变量(再难一点估计就向上转型和向下转型了,不过没问);多态是指一个对象能够有多种表现形式?序列化就是将对象转化为字节序的过程,将字节序转化为对象的过程即反序列化;作用在于,通过序列化之后,能够将数据从内存中存入到磁盘进行保存,应对高并发情况,减小内存的压力;

6、Python常用的数据结构有哪些;举例说一下,然后又问到DataFrame的用途,List 和Set 区别,如何对List去重

6:Python数据结构:array、list、set、tuple、dict、(DataFrame、Series)属于Pandas;DataFrame存在一些内置函数,如merge等,能够方便的进行数据处理和数据分析,plot函数能够方便进行数据展示,List去重就是:list(set(list))

7、链表和数组的区别,哪个放连续内存,哪个可以放不连续内存,插入时哪个更快

7:链表有指针,能够让上一位数据指到下一位,而数组是不存在这些的,相当于一整块数组,因此数组放连续内存,而链表可以放在不连续内存,因此指针的存在,插入时链表应该更快的;

8、深度学习了解吗?CNN了解吗

8:了解一些,做过一个人脸识别在项目,后面没深问,不清楚

9、Linux查看内存,查看磁盘空间

9:忘记复习这块了,在公司也没怎么常用,看内存可以用ps,top;磁盘空间df,文件使用内存du;

10、如何在HDFS上看数据

10:Hadoop fs -text -----|less;Hadoop fs -head  or -tail ; Hadoop  fs -cat 

11、项目是离线的还是Streaming,数据量有多少,数据存放在哪里?输出到哪里?

11:离线的项目,在Spark下训练好,上线的,数据量大概在500W条,每条450W维度,存储格式Libsvm,存在在Hive,输出到HDFS上面

12、碧桂园智慧城市里面用到了什么AI技术

12:是一个调研工作,在沟通中,暂时没有具体落地

13、有什么想问的吗?

13.1:我有什么不足? 回答:公司规定,不能说,无果

13.2:部门的数据研发主要干什么;多端数据/实时数据流/数据挖掘.......了解清楚了

14:面试结束了,一个小时,后面觉得没考我代码,来了一个补刀,三个问题

14.1、实现一个环形buffer类接口,插入数据和读数据、

14.2、用加法实现乘除减操作

14.3、二分查找

代码早上发过去了,刚才收到消息,功能都实现了,但是有一些小问题:命名问题(环形接口)、异常抓取和处理问题(乘除减法问题)、边界问题(二分查找);毕竟还是年轻,有些问题考虑还不是很周到,有待加强!三段代码贴在后面了。

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 6 23:15:28 2018
@author: dapeng
Function:Buffer interface
Input:List and Int
"""

class Solution:
def __init__(self):
self.read = 0
self.write = 0
self.buffer = [0] * 100
self.number = 0

def Append(self,List):
if type(List) is list:
if self.number == 100 and self.read == self.write:
print("Buffer is enough")
else:
for j in List:
self.buffer[self.write] = j
self.number += 1
self.write += 1
if self.write>= 100:
self.write = 0
print("initial write pointer")
break
print(self.write)
return (self.buffer)
else:
print("Please Input Type of list")


def Read(self,num):
if type(num) is int:
if self.number ==0 and self.read == self.write:
print("buffer is empty")

else:
result_read = []
for k in range(self.read,self.read + num):
result_read.append(self.buffer[k])
self.buffer[k] = 0
self.read += 1
self.number -= 1
if self.read >=100:
self.read =0

if self.number <= 0:
print("Buffer has not element")
break
return result_read
print(self.read)
else:
print("Please Input Type of int")

solution = Solution()
List = [i for i in range(1,10)]
result_append = solution.Append(List)
result_read = solution.Read(5)
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 6 15:28:50 2018
@author: dapeng
Function: Using the addition completes Subtraction,Multiplication and Division
Input: org_value(Int),method(Str),next_bumber(Int)
Method:Subtraction,Multiplication and Division

Return: Completed value
"""

def Add_complete_three_function(org,method,next_number):
if type(org) is int and type(next_number) is int:
if method == 'Multiplication':
complete_val = 0
if (org>0 and next_number>0) or (org<0 and next_number<0):
org = abs(org)
next_number = abs(next_number)

while next_number>0:
next_number = next_number + int('-' + str(1))
complete_val += org
return complete_val - next_number

elif org<0 or next_number<0:
org = abs(org)
next_number = abs(next_number)
while next_number>0:
next_number = next_number + int('-' + str(1))
complete_val += org
return int('-' + str(complete_val))

elif org==0 or next_number==0:
return 0

if method == 'Subtraction':
if next_number == 0:
return org
elif next_number<0:
return (org + abs(next_number))

elif next_number>0:
return (org + int('-' + str(next_number)))


if method == 'Division':
if abs(next_number) == 0:
print("Divisor can not be 0")

elif (org>0 and next_number>0) or (org<0 and next_number<0):
org = abs(org)
next_number = abs(next_number)
num = 0
count = 0
while count<= org:
num +=1
count += next_number
return num-1

elif (org>0 and next_number<0) or (org<0 and next_number>0):
org = abs(org)
next_number = abs(next_number)
num = 0
count = 0
while count<= org:
num +=1
count += next_number
return int('-' + str(num-1))

else:
print("please input reasonable Type and Method")




result = Add_complete_three_function(-9,'Subtraction',-10)
print(result)
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 6 15:28:50 2018
@author: dapeng
function: search
input_type:List and value

Flag: Flag = 1 indicates that the val was found
Flag = -1 is not

Return: Return val in List' index when Flag=1
others
"""

def Two_split_search(data,val):
if type(data) is list:
org = 0
end = len(data) - 1
Flag = -1
while org <= end:
mid = int((org + end)/2)
if val == data[mid]:
Flag = 1
break

elif val > data[mid]:
org = mid + 1

elif val < data[mid]:
end = mid -1

if Flag == 1:
return mid

else:
print("not find the val")

else:
print("the input type is List")


data = [1,2,3,5,6,7,9]
val = 10
result_index = Two_split_search(data,val)
print(result_index)
 
————————————————
版权声明:本文为CSDN博主「Peng__Ge」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zehui6202/article/details/81474933

猜你喜欢

转载自www.cnblogs.com/shushu66/p/11895662.html