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最新大廠面試題》電子書,部分截圖如下: