2022年4月10日百度机器学习方向暑期实习面试题

1、介绍下SVM算法

    是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机。

    SVM可分为三种:

    线性可分SVM

    当训练数据线性可分时,通过最大化硬间隔(hard margin)可以学习得到一个线性分类器,即硬间隔SVM。

    线性SVM

    当训练数据不能线性可分但是近似线性可分时,通过最大化软间隔(soft margin)也可以学习到一个线性分类器,即软间隔SVM。

    非线性SVM

    当训练数据线性不可分时,通过使用核技巧(kernel trick)和最大化软间隔,可以学习到一个非线性SVM。

    SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

    SVM如何选择核函数

    Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。

     RBF核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。

2、介绍下逻辑回归算法

    逻辑回归是在数据服从伯努利分布的假设下,通过极大似然的方法,运用梯度下降法来求解参数,从而达到将数据二分类的目的。

    逻辑回归的优缺点

    优点:

    形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。

    模型效果不错。在工程上是可以接受的(作为 baseline),如果特征工程做的好,效果不会太差,并且特征工程可以并行开发,大大加快开发的速度。

    训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。

    缺点:

    准确率欠佳。因为形式非常的简单,而现实中的数据非常复杂,因此,很难达到很高的准确性。很难处理数据不平衡的问题。

3、介绍下决策树算法

    常见的决策树算法有三种:ID3、C4.5、CART树

    ID3算法的核心是在决策树的每个节点上应用信息增益准则选择特征,递归地构架决策树。

    C4.5算法的核心是在生成过程中用信息增益比来选择特征。

    CART树算法的核心是在生成过程中用基尼指数来选择特征。

4、用通俗的语言介绍下强化学习(Reinforcement Learning)

    监督学习的特点是有一个“老师”来“监督”我们,告诉我们正确的结果是什么。在我们在小的时候,会有老师来教我们,本质上监督学习是一种知识的传递,但不能发现新的知识。对于人类整体而言,真正(甚至唯一)的知识来源是实践——也就是强化学习。比如神农尝百草,最早人类并不知道哪些草能治病,但是通过尝试,就能学到新的知识。

    学习与决策者被称为智能体,与智能体交互的部分则称为环境。智能体与环境不断进行交互,具体而言,这一交互的过程可以看做是多个时刻,每一时刻,智能体根据环境的状态,依据一定的策略选择一个动作(这里的策略指的是从环境状态到智能体动作或者动作概率之间的映射),然后环境依据一定的状态转移概率转移到下一个状态,与此同时根据此时状态的好坏反馈给智能体一个奖励。智能体可以根据环境的反馈调整其策略,然后继续在环境中探索,最终学习到一个能够获得最多奖励的最优策略。

5、Leetcode34 在排序数组中查找元素的第一个和最后一个位置

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)
        left, right = 0, n - 1
        while left <= right:
            mid = left + (right - left) // 2
            if target == nums[mid]:
                p = q = mid
                while p >= 0 and nums[p] == target:
                    p -= 1
                while q < n and nums[q] == target:
                    q += 1
                return [p + 1, q - 1]
            if target > nums[mid]:
                left = mid + 1
            else:
                right = mid -1
        return [-1,-1]

6、Letcode102 层序遍历

    思路:BFS

    1、如果 root 为空,直接返回 [ ]

    2、定义一个数组queue,并将 root 添加到 queue中,再定义一个res 数组保存结果

    3、遍历 当前层 queue 的每个左子节点,右子节点,入队列,且要把 queue 更新成当前层的孩子节点列表,直到 queue 为空。

    代码如下:

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        queue = [root]
        res = []
        while queue:
            res.append([node.val for node in queue])
            l1 = []
            for node in queue: 
                if node.left:
                    l1.append(node.left)
                if node.right:
                    l1.append(node.right)
            queue = l1
        return res
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七月在线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值