笔试题

一,列举至少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

 六,简述曼哈顿距离、欧式距离、明式距离、余弦距离、皮尔森相关系数的原理及定义,并在此基础上说明不同距离适合的应用场景。

1)曼哈顿距离:曼哈顿街道距离(出租车距离)。向量对应元素差值的绝对值之和。 
2)欧式距离:欧几里得向量空间几何距离(绝对距离)。对应元素差值的平方和,再开方。
3)明式距离:两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为: 
 
                       

                       其中p是一个变参数。

                      当p=1时,就是曼哈顿距离

                      当p=2时,就是欧氏距离

                      当p→∞时,就是切比雪夫距离

4)余弦距离:argcos夹角大小。对应元素相乘求和,除以各向量长度(模值)之积。
5)皮尔森相关系数:相关系数,向量减去自身均值之后的余弦距离 
应用场景:
1)如果数据存在“分数膨胀“问题,就使用皮尔逊相关系数
2)如果数据比较密集,变量之间基本都存在共有值,且这些距离数据都是非常重要的,那就使用欧几里得或者曼哈顿距离
3)如果数据是稀疏的,就使用余弦相似度

4)欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;

5)余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)

 七,1. 谈谈广义线性模型在机器学习算法中的应用。

         2. 在标准的SVM中,样本会被最优分类面分为+1或-1;而在实际应用中,后验概率是非常有用的。考虑如何使SVM实现后验概率的输出。

1. 广义线性模型相对于经典的线性模型(y=wx+b),核心在于引入了连接函数g(.)。

    在机器学习中应用广泛,比如逻辑回归中的用sigmoid函数进行转换;在神经网络中的激活函数也是链接函数。(4分)
2. 可以使用Sigmoid函数进行转换,对f(x)(即核函数)设学习参数,即Sigmoid((Af(x)+b))。概率SVM的构造主要分为两个步骤:首先训练标准的SVM模型。得到核函数的参数;其次训练Sigmoid函数,得到Sigmoid的参数。这样就可以对标准的SVM模型的输出值进行Sigmoid处理,将其转化为后验概率。(6分)
八,
1. 简述协方差的含义及协方差矩阵的计算过程。
 协方差就是计算了两个维度之间的相关性,即这个样本的这两个维度之间有没有关系。(2分)
    协方差矩阵的计算:(3分)
   1)先让样本矩阵中心化,即每一维度减去该维度的均值,使每一维度上的均值为0,
   2)然后直接用新的到的样本矩阵乘上它的转置
   3)然后除以(N-1)即可
2. 现有m条n列原始数据,试简述利用PCA算法对该数据进行降维的过程。
按行或按列组织样本均可。
    下面是按行组织样本: (5分)
    1)将原始数据按行组成n行m列矩阵X,代表有n个数据,每个数据m个特征
    2)将X的每一列(代表一个属性字段)进行零均值化,即减去这一列的均值
    3)求出协方差矩阵C=1/n* XXT
    4)求出协方差矩阵的特征值及对应的特征向量
    5)将特征向量按对应特征值大小从上到下按列排列成矩阵,取前k列组成矩阵P
    6)Y=XP即为降维到k维后的数据
九,简述梯度下降法、牛顿法与共轭梯度法的原理,并比较异同点及各自的使用范围。
1. 算法原理 (各2分,共6分)
    梯度下降法是利用一阶的梯度信息找到函数局部最优解的一种方法。如果目标函数是一个凸优化问题,那么梯度下降法获得的局部最优解就是全局最优解。
    牛顿法是利用局部的一阶和二阶偏导信息,去推测整个目标函数的形状,进而可以求得近似函数的全局最小值,然后将当前的最小值设定为近似函数的最小值。也就是说,牛顿法在二阶导数的作用下,从函数的凸性出发,直接搜索怎样到达极值点,即在选择方向时,不仅考虑当前坡度是否够大,还会考虑走了一步之后,坡度是否会变得更大。
    共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需一阶导数信息。基本思想是把共轭性与最速下降法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点。根据共轭方向的基本性质,这种方法具有二次终止性。核心迭代过程可以采取不同的方案,一种是直接延续,即总是用d^(k+1)=-g(k+1)+beta_k*d^(k)构造搜索方向;一种是把n步作为一轮,每搜索一轮之后,取一次最速下降方向,开始下一轮,此种策略称为“重置”。
2. 比较异同点 (满分6分,至少答3点)
    共轭梯度法仅需一阶导数信息,克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点。
    牛顿法和梯度下降法都必须给定一个初始点,且都容易陷入局部最优。但在初始点选取合理的情况下,牛顿法比梯度下降法收敛速度更快。
    牛顿法需要利用二阶导数信息,每次需要更新一个二维矩阵,计算难度和资源消耗相对梯度下降和共轭法都要更大,实际使用中常使用拟牛顿法。
    牛顿法对初始值有一定要求,在非凸优化问题中(如神经网络训练),牛顿法很容易陷入鞍点(牛顿法步长会越来越小);而梯度下降法则很容易逃离鞍点(因此在神经网络训练中一般使用梯度下降法,高维空间的神经网络中存在大量鞍点)
    梯度下降法在靠近最优点时会震荡,因此步长调整在梯度下降法中是必要的,具体有adagrad, adadelta, rmsprop, adam等一系列自适应学习率的方法。
十,L1正则和L2正则的区别
参考:https://blog.csdn.net/jinping_shi/article/details/52433975
L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。

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,朴素贝叶斯,支持向量机,神经网络

非参数机器学习算法的优势:

  • 可变性:可以拟合许多不同的函数形式。

  • 模型强大:对于目标函数不作假设或者作微小的假设

  • 表现良好:对于预测表现可以非常好。

非参数机器学习算法局限性:

  • 需要更多数据:对于拟合目标函数需要更多的训练数据

  • 速度慢:因为需要训练更多的参数,训练过程通常比较慢。

  • 过拟合:有更高的风险发生过拟合,对于预测也比较难以解释。

十二,归一化和标准化的作用

防止小数据被大数据吃掉

防止运行内存溢出

posted @ 2019-08-04 23:09  你爱谈天我爱笑  阅读(360)  评论(0编辑  收藏  举报