笔试题
一,列举至少2种排序算法,并写出实现代码。
参考:https://blog.csdn.net/qq_42199781/article/details/95676546
1,选择排序法
def select_sort(li): n = len(li) for cur in range(n-1): li_max = cur for i in range(cur+1, n): if li[i] > li[li_max]: li[i], li[li_max] = li[li_max], li[i] if li_max != cur: li[cur], li[li_max] = li[li_max], li[cur]
2,冒泡排序法
思想:比较第一个和第二个元素,如果第一个比第二个大,就交换他们两个
时间复杂度:o(n)
def BubbleSort(SortList): ListLength = len(SortList) while ListLength > 0: for i in range(ListLength - 1): if SortList[i] > SortList[i+1]: SortList[i] = SortList[i] + SortList[i+1] SortList[i+1] = SortList[i] - SortList[i+1] SortList[i] = SortList[i] - SortList[i+1] ListLength -= 1 print SortList if __name__ == '__main__': SortList = [6,5,4,3,2,1] BubbleSort(SortList)
或者
def func(li): for i in range(len(li)-1): for j in range(len(li)-1-i): if li[j]>=li[j+1]: li[j],li[j+1]=li[j+1],li[j] return li
3,快速排序法
思想:应用分而治之的范式。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都小,然后再按照此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
def QuickSort(L,low,high): i = low j = high if i >= j: return L key = L[i] while i < j: while i < j and L[j] >=key: j -= 1 L[i] = L[j] while i < j and L[i] <= key: i += 1 L[j] = L[i] L[i] = key QuickSort(L,low,i-1) QuickSort(L,j+1,high) return L if __name__ == '__main__': L = [6,5,4,8,2,1] QuickSort(L,0,len(L)-1) print(L)
或者:
def quick_sort(li): if len(li)<2: return li mid=li[(len(li)-1)//2] left,right=[],[] li.remove(mid) for i in li: if i>=mid: right.append(i) else: left.append(i) return quick_sort(left)+[mid]+quick_sort(right)
一行实现:
quick_sort=lambda li:li if len(li)<2 else quick_sort([item for item in li[1:] if item<=li[0]])+[li[0]]+quick_sort([item for item in li[1:] if item>=li[0]])
4,插入排序
def insert_sort(items): for i in range(1, len(items)): # 从第i个元素开始向前比较,如果小于前一个元素,交换位置 for j in range(i, 0, -1): if items[j] < items[j-1]: items[j], items[j-1] = items[j-1], items[j]
二,请列举生成模型和判别模型的区别
参考:https://wenku.baidu.com/view/775809eeec3a87c24028c4c4.html
https://wenku.baidu.com/view/64c19af8770bf78a652954ec.html?rec_flag=default&sxts=1564995862828
监督学习方法分为生成树方法(Generativeapproach)和判别式方法(Generativeapproach),所学到的模型分别称为生成模型和判别模型。
判别方法:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。典型的判别模型包括k近邻,感知级,决策树,支持向量机等。
生成方法:由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)=P(X,Y)/P(X)。基本思想是首先建立样本的联合概率概率密度模型P(X,Y),然后再得到后验概率P(Y|X),再利用它进行分类,就像上面说的那样。注意了哦,这里是先求出P(X,Y)才得到P(Y|X)的,然后这个过程还得先求出P(X)。P(X)就是你的训练数据的概率分布。哎,刚才说了,需要你的数据样本非常多的时候,你得到的P(X)才能很好的描述你数据真正的分布。这样的方法之所以称为生成方法,是因为模型表示了给定输入X产生输出Y的生成关系。用于随机生成的观察值建模,特别是在给定某些隐藏参数情况下。典型的生成模型有:朴素贝叶斯和隐马尔科夫模型等。
由生成模型可以得到判别模型,但是由判别模型不能得到生成模型。
常见的判别模型有线性回归、逻辑回归、对数回归、线性判别分析、支持向量机、CART、boosting、条件随机场、高斯过程Gaussian process、神经网络等。
常见的生产模型有隐马尔科夫模型HMM、朴素贝叶斯模型、高斯混合模型、LDA、Restricted Boltzmann Machine、判别式分析、KNN、贝叶斯网络、深度信念网络DBN、 隐含狄利克雷分布简称LDA(Latent Dirichlet allocation)、多专家模型(the mixture of experts model)等。
三,什么是欠拟合,过拟合?避免过拟合有哪些途径?
参考:https://blog.csdn.net/willduan1/article/details/53070777
https://blog.csdn.net/heyongluoyao8/article/details/49429629
过拟合是在统计模型中,由于使用的参数过多而导致模型对观测数据(训练数据)过度拟合,以至于用该模型来预测其他测试样本输出的时候与实际输出或者期望值相差很大的现象,。欠拟合则刚好相反,是由于统计模型使用的参数过少,以至于得到的模型难以拟合观测数据(训练数据)的现象。
相对来说,欠拟合比较容易解决。如果是统计回归模型,我们只需要增加模型的参数就可以了,原来是线性模型,那么现在改为二次模型就行,原来是线性回归,现在改为二次回归即可。如果是神经网络模型,我们可以通过增加网络的层数和每一层的神经元数目即可,尤其是增加网络层数的效果更好。如果你现在不知道神经网络是什么东东也不要紧,只要你能理解统计回归就行。但是过拟合就不是那么简单的了。
发生过拟合说到底还是训练数据与训练参数的比例太小而导致的,所以,我们可以通过增加数据量或者适当减小参数数量来解决。增加训练数据量是根据大数定理,当数据量足够大时,训练模型会无限逼近实际,而减小参数数量则是人工根据模型的需要,剔除那些跟得到模型不太相关的参数来实现。
避免过拟合的方法:
1,重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
2,增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
3,正则化:通常,为了防止过拟合,我们都会在目标方程中添加一个正则项(regularization term),且通过正则因子(或“正则化参数”,英文:Regularization Coefficient或Regularization Parameter)λ来平衡目标方程与正则项。比如,在对数几率回归(Logistic Regression)中,我们可以对其代价函数(Cost Function)和其梯度函数进行正则化。
更确切的来说,根据吴恩达教授在斯坦福大学机器学习公开课中的讲解,我们来用多项式拟合来说,如果我们只需要到二次项就可以了,如果还有更高次项的话,加入正则项,相当于减小参数的大小,因为是更高次的项的出现导致了过拟合,那么我们就减小它们使其趋近于0就好了,即权重衰减。所以,我们修改代价函数,对3次项4次项乃至更高次的项加入正则项,给予机器学习模型一些惩罚。不论是线性回归还是对数几率回归,我们可以对每一项都加入正则项来惩罚,不过根据惯例,我们不对θ0进行惩罚。
正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则
4,采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作
5,Early stopping:梯度下降学习算法。Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
Early stopping方法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。这种做法很符合直观感受,因为accurary都不再提高了,在继续训练也是无益的,只会提高训练的时间。那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30……
四、请列举Random Forest和GBDT的区别
参考:https://blog.csdn.net/wh137795233/article/details/47750151
https://blog.csdn.net/login_sonata/article/details/73929426
https://blog.csdn.net/qq_28031525/article/details/70207918
五,梯度下降求解最优化问题的原理与步骤
参考:https://www.jianshu.com/p/424b7b70df7b
https://www.nowcoder.com/questionTerminal/26882f078a824635b4e1371e447f1d6c
六,简述曼哈顿距离、欧式距离、明式距离、余弦距离、皮尔森相关系数的原理及定义,并在此基础上说明不同距离适合的应用场景。
其中p是一个变参数。
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
4)欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;
5)余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)
七,1. 谈谈广义线性模型在机器学习算法中的应用。
1. 广义线性模型相对于经典的线性模型(y=wx+b),核心在于引入了连接函数g(.)。
1)先让样本矩阵中心化,即每一维度减去该维度的均值,使每一维度上的均值为0,
2)然后直接用新的到的样本矩阵乘上它的转置
3)然后除以(N-1)即可
共轭梯度法仅需一阶导数信息,克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点。
梯度下降法在靠近最优点时会震荡,因此步长调整在梯度下降法中是必要的,具体有adagrad, adadelta, rmsprop, adam等一系列自适应学习率的方法。
L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为∣∣w∣∣1 ||w||_1∣∣w∣∣
L2正则化是指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为∣∣w∣∣2 ||w||_2∣∣w∣∣ 2
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0.
十一,参数模型和非参数模型
参考:https://blog.csdn.net/sinat_27652257/article/details/80543604
参数模型通常假设总体(随机变量)服从某一个分布,该分布由一些参数确定(比如正太分布由均值和方差确定),在此基础上构建的模型称为参数模型;
非参数模型对于总体的分布不做任何假设,只是知道总体是一个随机变量,其分布是存在的(分布中也可能存在参数),但是无法知道其分布的形式,更不知道分布的相关参数,只有在给定一些样本的条件下,能够依据非参数统计的方法进行推断。
其区别主要在于总体的分布形式是否已知。而为何强调“参数”与“非参数”,主要原因在于参数模型的分布可以有参数直接确定
参数机器学习算法包括:逻辑回归、线性成分分析、感知机
参数机器学习算法有如下优点:
-
简洁:理论容易理解和解释结果
-
快速:参数模型学习和训练的速度都很快
-
数据更少:通常不需要大量的数据,在对数据的拟合不很好时表现也不错
参数机器学习算法的局限性:
-
约束:以选定函数形式的方式来学习本身就限制了模型
-
有限的复杂度:通常只能应对简单的问题
-
拟合度小:实际中通常无法和潜在的目标函数吻合
非参数机器学习算法包括:决策树,例如cart和c4.5,朴素贝叶斯,支持向量机,神经网络
非参数机器学习算法的优势:
-
可变性:可以拟合许多不同的函数形式。
-
模型强大:对于目标函数不作假设或者作微小的假设
-
表现良好:对于预测表现可以非常好。
非参数机器学习算法局限性:
-
需要更多数据:对于拟合目标函数需要更多的训练数据
-
速度慢:因为需要训练更多的参数,训练过程通常比较慢。
-
过拟合:有更高的风险发生过拟合,对于预测也比较难以解释。
十二,归一化和标准化的作用
防止小数据被大数据吃掉
防止运行内存溢出