搜广推校招面经二十五

快手搜推

一、从两种数学角度解释l1和l2的 (一个是画图,一个是数值角度)

1.1. 图形角度:几何解释

当优化目标函数(比如损失函数)和正则化项相加时,最优解会在约束区域与损失函数等高线的切点处。L1的菱形顶点在坐标轴上,容易导致某些参数为零,从而产生稀疏性;而L2的圆形切点通常不会在坐标轴上,所以参数往往非零但较小。

1.1.1. L1 正则化(Lasso)

  • 在几何意义上,L1 正则化相当于在参数空间中构造一个 菱形(diamond shape)约束。
  • 在优化过程中,目标函数的解会在这个菱形的边界上,特别是在菱形的尖角位置,因为这种约束促进了稀疏性,即很多系数会变为零。
  • 这意味着 L1 正则化倾向于“选择”一些特征,而“忽略”其他特征,通常会导致一些特征的系数完全为零。
   L1 约束(菱形)
    / \
   /   \
  /     \
  --------
*图示:L1 正则化的约束域(菱形)*

1.1.2. L2 正则化(Ridge)

  • L2 正则化相当于在参数空间中构造一个 圆形(circle shape)约束。
  • 这种约束促使所有的参数尽可能小,但不会像 L1 那样使某些参数为零。L2 正则化更倾向于将所有参数向零压缩,而不是完全消除它们。
  • L2 的效果是使参数平滑分布,避免过度拟合,同时不会使某个特征的权重完全消失。
           L2 约束(圆形)
             ****
           *      *
          *        *
           *      *
             ****
*图示:L2 正则化的约束域(圆形)*

1.2. 数值角度:代数解释

1.2.1. L1 正则化

  • L1 正则化通过对模型的权重进行绝对值惩罚,目标函数变为:
    minimize   ( Loss Function + λ ∑ i = 1 n ∣ w i ∣ ) \text{minimize} \, \left( \text{Loss Function} + \lambda \sum_{i=1}^{n} |w_i| \right) minimize(Loss Function+λi=1nwi)
    其中, w i w_i wi 是模型的参数, λ \lambda λ 是正则化参数,控制着惩罚的强度。
  • 通过这种方式,L1 正则化鼓励许多 w i w_i wi 变为零,从而产生稀疏解。

1.2.2. L2 正则化

  • L2 正则化通过对模型的权重进行平方惩罚,目标函数变为:
    minimize   ( Loss Function + λ ∑ i = 1 n w i 2 ) \text{minimize} \, \left( \text{Loss Function} + \lambda \sum_{i=1}^{n} w_i^2 \right) minimize(Loss Function+λi=1nwi2)
  • 与 L1 不同,L2 正则化并不强迫权重为零,而是使得所有权重尽可能小,但不会完全消失。
  • L2 正则化的效果是使得模型的权重分布更加平滑,从而避免过拟合。

1.3. 总结

  • L1 正则化:几何上是一个菱形约束,倾向于产生稀疏解,使得部分特征的系数为零。
  • L2 正则化:几何上是一个圆形约束,倾向于平滑所有参数,不会使某个特征的系数为零,但会使它们变得尽可能小。
    通过这两种正则化方法,我们可以有效地控制模型的复杂度,避免过拟合。

二、快排

2.1. quicksort排序( l o g n logn logn

  • partition方法 -> 选择基准值
  • quicksort方法 -> 快速排序主函数
  • topk_split方法 -> 排序一部分
class Solution:
    def partition(self, nums, left, right):
        """划分函数,选择右端元素为基准,返回基准值的正确位置索引"""
        pivot = nums[right] # 将基准值临时保存起来
        i = left - 1        # 指向小于基准的子数组的末尾
        for j in range(left, right):
            if nums[j] <= pivot:
                i += 1 # 小于基准值的数组加一个元素
                nums[i], nums[j] = nums[j], nums[i]  # 将小于基准的元素交换到左侧
        # 基准值换位置
        nums[i+1], nums[right] = nums[right], nums[i+1]
        return i + 1  # 返回基准值的索引
        
    def quicksort(self, nums, left, right):
        """快速排序主函数"""
        if left < right:
            index = self.partition(nums, left, right)  # 获取基准位置
            self.quicksort(nums, left, index-1)        # 递归排序左半部分
            self.quicksort(nums, index+1, right)       # 递归排序右半部分
        return nums
        
def topk_split(nums, k, left, right):
    #寻找到第k个数停止递归,使得nums数组中index左边是前k个小的数,index右边是后面n-k个大的数
    if (left<right):
        index = partition(nums, left, right)
        if index==k:
            return 
        elif index < k:
            topk_split(nums, k, index+1, right)
        else:
            topk_split(nums, k, left, index-1)

能默写这三个方法,就能解决所有的topk问题。

2.1.1. 获得前k小的数

def topk_smalls(nums, k):
    topk_split(nums, k, 0, len(nums)-1)
    return nums[:k]

arr = [1,3,2,3,0,-19]
k = 2
print(topk_smalls(arr, k))
print(arr)

2.1.2. 获得前k大的数

#获得前k大的数 
def topk_larges(nums, k):
    #parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数
    topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-k
    return nums[len(nums)-k:] 
arr = [1,3,-2,3,0,-19]
k = 3
print(topk_larges(arr, k))
print(arr)

2.1.3. 只排序前k个小的数

#获得前k小的数O(n),进行快排O(klogk)
def topk_sort_left(nums, k):
    topk_split(nums, k, 0, len(nums)-1) 
    topk = nums[:k]
    quicksort(topk, 0, len(topk)-1)
    return topk+nums[k:] #只排序前k个数字

arr = [0,0,1,3,4,5,0,7,6,7]
k = 4
topk_sort_left(arr, k)

2.2. 215. 数组中的第K个最大元素(hot100_堆_中等)

class Solution:
    def partition(self, nums, left, right):
        """划分函数:以nums[right]为基准,返回基准值的正确位置索引"""
        pivot = nums[right]
        i = left - 1  # 指向小于基准的子数组末尾
        for j in range(left, right):
            if nums[j] <= pivot:
                i += 1
                nums[i], nums[j] = nums[j], nums[i]  # 将小元素交换到左侧
        nums[i+1], nums[right] = nums[right], nums[i+1]  # 基准归位
        return i + 1

    def topk_split(self, nums, k, left, right):
        """快速选择算法核心:找到第k小元素的位置后停止递归"""
        if left < right:
            # 注意必须添加 self. 调用类方法
            index = self.partition(nums, left, right)
            if index == k:
                return  # 找到目标位置,终止递归
            elif index < k:
                self.topk_split(nums, k, index+1, right)  # 处理右半部分
            else:
                self.topk_split(nums, k, left, index-1)  # 处理左半部分

    def findKthLargest(self, nums, k):
        """
        查找第k大元素(时间复杂度 O(n))
        :param nums: 输入数组(会被原地修改)
        :param k: 第k大(从1开始计数)
        :return: 第k大的元素值
        """
        # 转换为找第 len(nums)-k 小的元素(即升序排列后的目标索引)
        target_pos = len(nums) - k
        self.topk_split(nums, target_pos, 0, len(nums)-1)
        return nums[target_pos]

三、推荐系统如何解决马太效应?

在推荐系统中,马太效应(Matthew Effect)指的是“强者愈强,弱者愈弱”的现象,即某些受欢迎的物品或用户会因为更频繁的推荐和更多的反馈而获得更多的推荐,而一些冷门的物品或用户则由于缺乏足够的曝光度而难以获得推荐。

3.1. 多样化推荐算法

推荐系统可以通过多样化的推荐策略,打破热门内容和冷门内容之间的恶性循环。常见的策略包括:

  • 加权推荐:除了推荐热门物品,还需要推荐一些冷门的物品。这可以通过调整推荐系统中的权重来实现,确保每个物品有一定的曝光机会。
  • 结合多种算法:将协同过滤与基于内容的推荐相结合,既能利用用户行为数据,又能通过内容特征推荐冷门项目。

3.2. 冷启动问题解决

对于新用户或新物品(冷启动问题),推荐系统可以通过以下方式提升冷门物品的曝光度:

  • 基于内容的推荐:通过分析物品的内容特征,向用户推荐与其历史行为相似的物品,避免冷门物品被忽略。
  • 社交网络信息:利用社交推荐系统,通过用户的社交关系网络,推送一些冷门但可能符合兴趣的小众物品。
  • 用户标签或兴趣建模:通过用户的兴趣标签、行为数据等模型,帮助发现用户可能感兴趣的冷门物品。

3.3. 引入多目标优化

在优化推荐效果的同时,兼顾多样性、公平性等目标,避免过度集中推荐热门内容。

3.4. 样本偏差纠正策略

在数据收集阶段,通过采集更均衡的样本(例如,使用过采样或欠采样技术),避免数据本身带有马太效应的偏差。比如,可以对冷门物品做适当的数据增强,提升其被推荐的机会。

3.5. 人工干预

  • 人工调整推荐结果,确保冷门内容获得一定曝光。
  • 通过规则限制热门内容的推荐频率,增加冷门内容的曝光机会。
### 关于目标检测的招聘试经验分享 #### 准备基础知识的重要性 目标检测作为计算机视觉中的重要分支,在过程中通常会涉及基础理论和实际应用两方。为了更好地应对目标检测方向的技术试,应聘者需掌握扎实的基础知识,包括但不限于卷积神经网络(CNN)、常见目标检测算法(如 YOLO、Faster R-CNN 和 SSD),以及这些模型的核心原理和技术特点[^1]。 #### 实施细节的关注 某些技术试官可能会深入探讨具体实现细节,因此建议提前熟悉主流框架(如 TensorFlow 或 PyTorch)下的目标检测模型搭建过程。例如,可以尝试自己动手实现一个简单的 Faster R-CNN 模型,并理解其 Region Proposal Network (RPN) 的工作机制及其优化方法。 以下是基于 Python 使用 PyTorch 构建简单目标检测器的一个代码片段: ```python import torch from torchvision.models.detection import fasterrcnn_resnet50_fpn def load_model(num_classes=91): model = fasterrcnn_resnet50_fpn(pretrained=True) in_features = model.roi_heads.box_predictor.cls_score.in_features model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes) return model model = load_model() ``` #### 时间管理和沟通技巧 除了技术能力外,良好的时间管理能力和清晰表达也是成功通过试的关键因素之一。系统化地安排好每一轮试环节,及时接收并确认试通知;同时利用试评估工具反馈个人表现以便改进下一次的表现[^2]。 #### 工作环境适应力考察 部分公司可能还会关注候选人的团队协作精神及对公司文化的认同感。比如金山办公软件以其较为轻松自由的工作氛围著称,即便是在正式场合中也可能允许员工穿便服上班,体现了企业内部开放包容的态度[^3]。 #### 失败案例分析与成长反思 即使经历失败也不要气馁,每一次挫折都是宝贵的学习机会。一位求职者曾因准备不足而未能顺利通过阿里巴巴集团针对应届毕业生开展的一轮电话初筛考试,但他从中认识到持续学习更新专业知识体系的重要性,并决定调整策略重新出发[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值