快手搜推
一、从两种数学角度解释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=1∑n∣wi∣)
其中, 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=1∑nwi2) - 与 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. 人工干预
- 人工调整推荐结果,确保冷门内容获得一定曝光。
- 通过规则限制热门内容的推荐频率,增加冷门内容的曝光机会。