10本电子书放文末,自取~
1、如何理解交叉熵的物理意义
交叉熵是一种用于比较两个概率分布之间的差异的指标。在机器学习中,它通常用于比较真实标签分布与模型预测分布之间的差异。
2、过拟合如何去解决?L1正则为什么能够使得参数稀疏,从求导的角度阐述。
过拟合的解决方法有很多:
数据的角度:获取和使用更多的数据(数据集增强);
模型角度:降低模型复杂度、L1\L2\Dropout正则化、Early stopping(提前终止)
模型融合的角度:使用bagging等模型融合方法。
L1正则化在损失函数中加入参数的绝对值之和,可以使得一些参数变得非常小或者为零,从而使得模型更加稀疏,减少过拟合的风险。从求导的角度上看,L1正则化的导数在某些点处为零,从而使得参数变得非常小或者为零,达到了稀疏的效果。
3、类别不平衡是如何去处理的?如果进行采样,策略是什么?
类别不平衡可以通过对数据进行采样来处理。一种常用的采样策略是欠采样,即随机从多数类中选择一部分样本使得样本平衡。另一种常用的采样策略是过采样,即从少数类中复制一些样本使得样本平衡。还有一种策略是生成新的少数类样本,比如SMOTE算法,其中通过对少数类样本进行随机插值来生成新的样本。
4、介绍一下attention,做过哪些尝试和改进。
Attention是一种机器学习中的技术,主要用于提取输入序列中的关键信息。在自然语言处理和图像处理中,Attention机制已经成为了重要的技术。对于Attention的一些实现方法和改进,一种常见的Attention实现方法是Soft Attention,它可以用于提取序列数据中的重要信息。另外,还有一些改进方法,比如Multi-Head Attention和Self-Attention等,可以进一步提高Attention的性能。
5、对于一个时间顺序的推荐数据,如何划分训练集和验证集,能不能随机?
对于时间顺序的推荐数据,通常可以使用时间轴来划分训练集和验证集。具体地,可以选取一段时间作为训练集,另一段时间作为验证集。如果数据量足够大,也可以将数据随机划分为训练集和验证集。但是,需要注意的是,在时间序列数据中,训练集和验证集应该按照时间顺序进行划分,以保证模型的泛化能力。
6、欠拟合如何去解决,训练过程不收敛如何去解决?
欠拟合的解决方法有很多,其中一个是增加模型的复杂度。可以增加模型的参数数量、增加网络层数、使用更复杂的模型结构等来提高模型的拟合能力。另外,还可以尝试调整学习率、修改损失函数、增加训练数据等方法。如果训练过程不收敛,可能是学习率过大或者网络结构不合理导致的。可以尝试减小学习率、使用不同的优化器、增加网络层数等方法来解决这个问题。
7、正则化和最大似然的关系。
正则化和最大似然有一定的关系。最大似然是一种用于估计模型参数的方法,其目标是找到使得观测数据出现的概率最大的模型参数。正则化是一种对模型参数进行限制的方法,可以使得模型参数更加稳定和泛化能力更强。在最大似然估计中,通过添加正则化项可以达到类似的目的,即防止模型过拟合。常见的正则化方法包括L1正则化和L2正则化。
8、Leetcode:数组中第K大的元素。
难度:【中等】
三种思路:一种是直接使用sorted函数进行排序,一种是使用小顶堆,一种是使用快排(双指针 + 分治)。
方法一:直接使用sorted函数进行排序
代码如下:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
return sorted(nums, reverse = True)[k-1]
方法二:使用堆
维护一个size为 k 的小顶堆,把每个数丢进去,如果堆的 size > k,就把堆顶pop掉(因为它是最小的),这样可以保证堆顶元素一定是第 k 大的数。
代码如下:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
heap = []
for num in nums:
heappush(heap,num)
if len(heap) > k:
heappop(heap)
return heap[0]
时间复杂度:O(nlogk)
空间复杂度:O(k)
方法三:双指针 + 分治
partition部分
定义两个指针left 和 right,还要指定一个中心pivot(这里直接取最左边的元素为中心,即 nums[i])
不断将两个指针向中间移动,使得大于pivot的元素都在pivot的右边,小于pivot的元素都在pivot的左边,注意最后满足时,left是和right相等的,因此需要将pivot赋给此时的left或right。
然后再将中心点的索引和 k - 1 进行比较,通过不断更新left和right找到最终的第 k 个位置。
代码如下:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
left, right, target = 0, len(nums)-1, k-1
while True:
pos = self.partition(nums, left, right)
if pos == target:
return nums[pos]
elif pos > target:
right = pos -1
else:
left = pos + 1
def partition(self, nums, left, right):
pivot = nums[left]
while left < right:
while nums[right] <= pivot and left < right:
right -=1
nums[left] = nums[right]
while nums[left] >= pivot and left < right:
left +=1
nums[right] = nums[left]
nums[left] = pivot
return left
看完本篇如果对你有用请三连,你的支持是我持续输出的动力,感谢,笔芯~
↓ ↓ ↓以下10本书电子版免费领,直接送 ,想要哪本私我下说声,我发你↓ ↓ ↓
以上8本+《2022年Q3最新大厂面试题》+《2022年Q4最新大厂面试题》电子书,部分截图如下: