新手村:邏輯回歸04:熵是什么?
熵是什么?
前置條件
在開始學習邏輯回歸中的熵理論之前,需要掌握以下基礎知識:
-
概率論與統計學:
- 概率分布(如伯努利分布、正態分布)。
- 條件概率和貝葉斯定理。
- 期望值和方差的基本概念。
-
線性代數:
- 向量和矩陣的基本運算。
- 線性組合的概念。
-
微積分:
- 導數和偏導數的計算。
- 極值問題和梯度下降的基本思想。
-
機器學習基礎:
- 分類與回歸的區別。
- 基本的監督學習模型(如線性回歸)。
-
Python編程:
- 熟悉NumPy和Pandas庫的基本操作。
- 基本的Matplotlib可視化技能。
章節 | 內容概述 | 重要知識點 | 通俗解釋 | 知識點評分(1-5) |
---|---|---|---|---|
第1章:熵的基本概念 | 介紹熵的定義及其在信息論中的意義。 | - 熵的數學定義 - 香農熵 - 聯合熵與條件熵 | 熵可以理解為“不確定性”的量化:信息越多,不確定性越低。 | 5(核心概念) |
第2章:交叉熵與對數損失函數 | 講解交叉熵的定義及其在分類任務中的作用。 | - 交叉熵公式 - 對數損失函數 - 最大似然估計 | 交叉熵衡量預測分布與真實分布的距離,類似于“誤差”。 | 5(核心概念) |
第3章:邏輯回歸與熵的關系 | 將熵理論應用于邏輯回歸模型。 | - Sigmoid函數 - 邏輯回歸的目標函數 - 損失函數優化 | 邏輯回歸通過最小化交叉熵來找到最佳參數,從而降低分類誤差。 | 5(核心概念) |
第4章:梯度下降與參數優化 | 學習如何通過梯度下降優化邏輯回歸模型的參數。 | - 梯度下降算法 - 學習率選擇 - 收斂性分析 | 梯度下降像是“找最低點”,每一步都朝著減少誤差的方向前進。 | 4(重要但不核心) |
第5章:教學示例與代碼實現 | 使用一個具體的數據集進行邏輯回歸建模。 | - 數據預處理 - 特征工程 - 模型訓練與評估 | 從數據到模型的完整流程,幫助理解理論與實踐的結合。 | 4(重要但不核心) |
第6章:后續練習題與進階學習 | 提供練習題,并規劃下一階段的學習內容。 | - 練習題類型 - 進階資源推薦 - 下一階段目標 | 通過練習鞏固知識,并為更復雜的模型打下基礎。 | 3(輔助內容) |
第1章:熵的基本概念
?????? 1.1 熵的數學定義
熵
是信息論中的一個重要概念,用于衡量隨機變量的不確定性
。
假設隨機變量 X X X 的概率分布為 P ( X = x i ) = p i P(X = x_i) = p_i P(X=xi?)=pi?,則熵 H ( X ) H(X) H(X) 定義為:
H ( X ) = ? ∑ i p i ln ? ( p i ) H(X) = -\sum_{i} p_i \ln(p_i) H(X)=?i∑?pi?ln(pi?)
其中, p i p_i pi? 是事件 x i x_i xi? 發生的概率, ln ? \ln ln 表示以2為底的對數。
示例字符串
example_string = "123123124351512431234123414321368969867898706785874674"
通俗解釋:
想象你正在猜一個骰子的結果。如果骰子是公平的(每個面的概率都是 1 / 6 1/6 1/6),那么不確定性最高;如果骰子被做了手腳(比如某一面的概率接近1),那么不確定性最低。熵就是用來量化這種不確定性的指標。
1.2 ??香農熵
香農熵是熵的一種形式,專門用于
描述離散隨機變量的信息量
。
例如,對于二分類問題(如是否購買手機),伯努利分布的熵為:
H ( p ) = ? p log ? 2 ( p ) ? ( 1 ? p ) log ? 2 ( 1 ? p ) H(p) = -p \log_2(p) - (1-p) \log_2(1-p) H(p)=?plog2?(p)?(1?p)log2?(1?p)
其中 p p p 是事件發生的概率。
通俗解釋:
假設你正在預測一個人是否會點擊某個廣告。如果點擊的概率是0.5(完全隨機),那么不確定性最大;如果點擊的概率接近0或1(幾乎確定),那么不確定性最小。
1.3 聯合熵與條件熵
聯合熵 H ( X , Y ) H(X, Y) H(X,Y) 衡量兩個隨機變量 X X X 和 Y Y Y 的聯合不確定性:
H ( X , Y ) = ? ∑ x , y P ( x , y ) log ? 2 ( P ( x , y ) ) H(X, Y) = -\sum_{x,y} P(x, y) \log_2(P(x, y)) H(X,Y)=?x,y∑?P(x,y)log2?(P(x,y))
條件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X) 衡量在已知 X X X 的情況下, Y Y Y 的剩余不確定性:
H ( Y ∣ X ) = ? ∑ x , y P ( x , y ) log ? 2 ( P ( y ∣ x ) ) H(Y|X) = -\sum_{x,y} P(x, y) \log_2(P(y|x)) H(Y∣X)=?x,y∑?P(x,y)log2?(P(y∣x))
通俗解釋:
聯合熵就像是兩個人一起猜謎語時的總不確定性,而條件熵則是當你知道一部分答案后,剩下的不確定性。
??????第2章:交叉熵與對數損失函數
2.1 交叉熵公式
交叉熵衡量兩個概率分布之間的差異。假設真實分布為 P P P,預測分布為 Q Q Q,則交叉熵 H ( P , Q ) H(P, Q) H(P,Q) 定義為:
H ( P , Q ) = ? ∑ i P ( i ) log ? ( Q ( i ) ) H(P, Q) = -\sum_{i} P(i) \log(Q(i)) H(P,Q)=?i∑?P(i)log(Q(i))
通俗解釋:
交叉熵可以看作是“預測錯誤的成本”。如果你的預測分布越接近真實分布,交叉熵就越小;反之,預測分布偏離真實分布越多,交叉熵就越大。
2.2 對數損失函數
在邏輯回歸中,對數損失函數是對交叉熵的具體應用。對于二分類問題,對數損失函數為:
L ( w ) = ? 1 N ∑ i = 1 N [ y i log ? ( y ^ i ) + ( 1 ? y i ) log ? ( 1 ? y ^ i ) ] L(w) = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] L(w)=?N1?i=1∑N?[yi?log(y^?i?)+(1?yi?)log(1?y^?i?)]
其中 y i y_i yi? 是真實標簽, y ^ i \hat{y}_i y^?i? 是預測概率。
通俗解釋:
對數損失函數衡量的是模型預測的準確性。
- 如果預測概率 y ^ \hat{y} y^?接近真實標簽(如 y = 1 y=1 y=1 且 y ^ = 0.9 \hat{y}=0.9 y^?=0.9),損失會很小;
- 如果預測概率 y ^ \hat{y} y^?遠離真實標簽(如 y = 1 y=1 y=1 且 y ^ = 0.1 \hat{y}=0.1 y^?=0.1),損失會很大。
??2.3 最大似然估計
新手村:邏輯回歸-理解03:邏輯回歸中的最大似然函數
邏輯回歸通過最大化似然函數(等價于最小化交叉熵)來優化參數。似然函數 L ( w ) L(w) L(w) 定義為:
L ( w ) = ∏ i = 1 N P ( y i ∣ x i ; w , b ) L(w) = \prod_{i=1}^N P(y_i|x_i; w,b) L(w)=i=1∏N?P(yi?∣xi?;w,b)
取對數后得到對數似然函數:
log ? L ( w ) = ∑ i = 1 N [ y i log ? ( y ^ i ) + ( 1 ? y i ) log ? ( 1 ? y ^ i ) ] \log L(w) = \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] logL(w)=i=1∑N?[yi?log(y^?i?)+(1?yi?)log(1?y^?i?)]
通俗解釋:
最大似然估計的目標是找到一組參數,使得模型預測的概率分布最接近真實分布。
??第3章:邏輯回歸與熵的關系
3.1 Sigmoid函數
Sigmoid函數將線性組合 z = w ? x + b z = w \cdot x + b z=w?x+b 映射到概率空間:
σ ( z ) = 1 1 + e ? z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e?z1?
通俗解釋:
Sigmoid函數就像一個“壓縮器”,把任何實數壓縮到0到1之間,方便解釋為概率。
#####???? 3.2 邏輯回歸的目標函數
邏輯回歸的目標是最小化對數損失函數(即最大化似然函數)
。通過梯度下降法不斷調整參數 w w w 和 b b b,使預測概率 y ^ \hat{y} y^? 更接近真實標簽 y y y。
通俗解釋:
邏輯回歸的核心思想是通過調整模型參數,讓預測結果盡可能準確,同時用交叉熵來衡量預測的誤差。
第4章:梯度下降與參數優化
4.1 梯度下降算法
梯度下降是一種迭代優化算法,用于最小化損失函數。更新規則為:
w : = w ? η ? ? L ? w w := w - \eta \cdot \frac{\partial L}{\partial w} w:=w?η??w?L?
其中 η \eta η 是學習率。
通俗解釋:
梯度下降就像是沿著山坡向下走,每次邁出一步,直到找到最低點。
4.2 學習率選擇
學習率 η \eta η 決定了每次更新的步長。如果學習率過大,可能會錯過最優解;如果過小,收斂速度會很慢。
通俗解釋:
學習率就像是走路的步伐大小,太大容易踩空,太小走得太慢。
第5章:教學示例與代碼實現
教學示例
假設我們有一個簡單的數據集,包含學生的考試成績和是否被錄取的信息。我們將使用邏輯回歸預測學生是否會被錄取。
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 數據集
data = {'Exam1': [45, 78, 65, 89, 90],'Exam2': [52, 89, 70, 95, 85],'Admitted': [0, 1, 0, 1, 1]
}# 數據預處理
X = np.array([[data['Exam1'][i], data['Exam2'][i]] for i in range(len(data['Exam1']))])
y = np.array(data['Admitted'])# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 訓練邏輯回歸模型
model = LogisticRegression()
model.fit(X_train, y_train)# 預測
y_pred = model.predict(X_test)# 評估
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
第6章:后續練習題與進階學習
練習題
- 使用自定義的梯度下降算法實現邏輯回歸。
- 修改上述代碼,嘗試添加多項式特征。
- 討論為什么邏輯回歸不能直接用于多分類問題。
進階學習內容
- 支持向量機(SVM)。
- 決策樹與隨機森林。
- 神經網絡與深度學習。
術語與術語解釋
術語 | 解釋 |
---|---|
熵 | 衡量隨機變量不確定性的指標。 |
交叉熵 | 衡量兩個概率分布之間的差異。 |
對數損失函數 | 在分類任務中常用的損失函數,基于交叉熵。 |
Sigmoid函數 | 將任意實數映射到[0,1]區間的函數,用于概率估計。 |
梯度下降 | 一種優化算法,用于最小化損失函數。 |
總結陳述
邏輯回歸中的熵理論是機器學習的重要基礎之一
。通過學習熵、交叉熵以及它們在邏輯回歸中的應用,你可以更好地理解分類模型的工作原理。建議按照上述計劃逐步深入學習,并通過代碼實踐鞏固理論知識。
代碼
香農熵
import numpy as np
import matplotlib.pyplot as plt# 計算香農熵的函數
def shannon_entropy(p):if p == 0 or p == 1:return 0else:return - (p * np.log2(p) + (1-p) * np.log2(1-p))# 定義概率范圍從0到1
probabilities = np.linspace(0, 1, 400)
entropies = [shannon_entropy(p) for p in probabilities]# 繪制香農熵隨概率變化的曲線
plt.figure(figsize=(8, 6))
plt.plot(probabilities, entropies, label='香農熵')
plt.title('香農熵與事件發生概率的關系')
plt.xlabel('事件發生概率 (p)')
plt.ylabel('熵')
plt.grid(True)
plt.legend()
plt.show()
聯合熵和條件熵
import numpy as np
import matplotlib.pyplot as plt# 定義聯合概率分布P(x, y)
joint_prob = np.array([[0.1, 0.2], [0.3, 0.4]])# 計算邊緣概率P(x)和P(y)
marginal_X = joint_prob.sum(axis=1) # P(x), 按列求和
marginal_Y = joint_prob.sum(axis=0) # P(y), 按行求和# 計算條件概率P(y|x)
conditional_prob_Y_given_X = joint_prob / marginal_X[:, None] # P(y|x)# 聯合熵H(X, Y)
def joint_entropy(joint_prob):non_zero_probs = joint_prob[joint_prob > 0] # 過濾掉零概率項return -np.sum(non_zero_probs * np.log2(non_zero_probs)) # 條件熵H(Y|X)
def conditional_entropy(joint_prob, marginal_X):cond_ent = 0for i in range(joint_prob.shape[0]): # 遍歷每個xpx = marginal_X[i]if px > 0:py_given_x = joint_prob[i] / px # P(y|x)non_zero_py_given_x = py_given_x[py_given_x > 0] # 過濾掉零概率項cond_ent -= px * np.sum(non_zero_py_given_x * np.log2(non_zero_py_given_x))return cond_ent# 計算聯合熵和條件熵
h_xy = joint_entropy(joint_prob)
h_y_given_x = conditional_entropy(joint_prob, marginal_X)# 打印結果
print(f"聯合熵 H(X, Y): {h_xy:.4f}")
print(f"條件熵 H(Y|X): {h_y_given_x:.4f}")# 可視化聯合概率分布和條件概率分布
fig, axes = plt.subplots(1, 2, figsize=(12, 5))# 繪制聯合概率分布熱力圖
im = axes[0].imshow(joint_prob, cmap='Blues', interpolation='nearest')
axes[0].set_title("聯合概率分布 P(x, y)")
axes[0].set_xlabel("Y")
axes[0].set_ylabel("X")
for (i, j), val in np.ndenumerate(joint_prob):axes[0].text(j, i, f"{val:.2f}", ha='center', va='center', color='black', fontsize=12)
fig.colorbar(im, ax=axes[0])# 繪制條件概率分布條形圖
bar_width = 0.35
indices = np.arange(len(marginal_X))
bars = []
for i in range(joint_prob.shape[1]):bar = axes[1].bar(indices + i * bar_width, conditional_prob_Y_given_X[:, i], bar_width, label=f"P(y={i}|x)")bars.append(bar)
axes[1].set_title("條件概率分布 P(y|x)")
axes[1].set_xticks(indices + bar_width / 2)
axes[1].set_xticklabels([f"x={i}" for i in indices])
axes[1].legend()plt.tight_layout()
plt.show()
交叉熵
import numpy as np
import matplotlib.pyplot as plt# 定義交叉熵函數
def cross_entropy(P, Q):"""計算交叉熵 H(P, Q):param P: 真實分布 (list 或 numpy array):param Q: 預測分布 (list 或 numpy array):return: 交叉熵值"""P = np.array(P)Q = np.array(Q)# 過濾掉Q中的零概率項以避免log(0)錯誤Q_nonzero_mask = Q > 0return -np.sum(P[Q_nonzero_mask] * np.log2(Q[Q_nonzero_mask]))# 示例的真實分布P
P = [0.5, 0.3, 0.2]# 構造一系列不同的預測分布Q,并計算對應的交叉熵
q1_values = np.linspace(0.01, 0.98, 100) # 第一個分量q1從0.01到0.98
entropy_values = []for q1 in q1_values:q2 = (1 - q1) * 0.6 # 剩余概率按固定比例分配給q2和q3q3 = (1 - q1) * 0.4Q = [q1, q2, q3]entropy_values.append(cross_entropy(P, Q))# 找到最小交叉熵及其對應的Q
min_index = np.argmin(entropy_values)
optimal_q1 = q1_values[min_index]
optimal_Q = [optimal_q1, (1 - optimal_q1) * 0.6, (1 - optimal_q1) * 0.4]
min_cross_entropy = entropy_values[min_index]# 輸出最優解
print(f"最小交叉熵: {min_cross_entropy:.4f}")
print(f"對應的最優預測分布 Q: {optimal_Q}")# 可視化交叉熵隨q1變化的趨勢
plt.figure(figsize=(10, 6))
plt.plot(q1_values, entropy_values, label="交叉熵", color='blue')
plt.scatter(optimal_q1, min_cross_entropy, color='red', label=f"最小交叉熵 ({min_cross_entropy:.4f})", zorder=5)
plt.axvline(x=optimal_q1, color='gray', linestyle='--', linewidth=1)plt.title("交叉熵隨預測分布的第一個分量 $q_1$ 的變化", fontsize=16)
plt.xlabel("$q_1$", fontsize=14)
plt.ylabel("交叉熵值", fontsize=14)
plt.grid(True)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()
場景設定
假設我們有一個真實分布 P = [ 0.5 , 0.3 , 0.2 ] P = [0.5, 0.3, 0.2] P=[0.5,0.3,0.2],代表某個事件發生的三種可能性的概率。接著,我們嘗試使用不同的預測分布 Q Q Q 來逼近 P P P,并通過計算交叉熵來評估預測的準確性。
我們將逐步調整 Q Q Q的值,并觀察交叉熵如何變化。為了簡化問題,這里只調整 Q Q Q的第一個分量 q 1 q_1 q1?,其他分量按比例分配剩余概率。
代碼解析
-
交叉熵公式:
- 函數
cross_entropy
根據公式 H ( P , Q ) = ? ∑ i P ( i ) log ? 2 ( Q ( i ) ) H(P, Q) = -\sum_i P(i) \log_2(Q(i)) H(P,Q)=?∑i?P(i)log2?(Q(i))實現。 - 使用掩碼過濾掉 Q Q Q 中的所有零概率項,以避免出現 log ? ( 0 ) \log(0) log(0)錯誤。
- 函數
-
構造預測分布:
- 我們讓 Q Q Q的第一個分量 q 1 q_1 q1? 在區間 [ 0.01 , 0.98 ] [0.01, 0.98] [0.01,0.98] 內變化。
- 其他兩個分量 q 2 q_2 q2? 和 q 3 q_3 q3? 按照固定的比值分配剩余概率( q 2 = 0.6 × ( 1 ? q 1 ) q_2 = 0.6 \times (1-q_1) q2?=0.6×(1?q1?), q 3 = 0.4 × ( 1 ? q 1 ) q_3 = 0.4 \times (1-q_1) q3?=0.4×(1?q1?))。
-
尋找最優解:
- 記錄每個 q 1 q_1 q1?對應的交叉熵值,并找出使交叉熵最小化的 q 1 q_1 q1?值。
- 最優預測分布 Q Q Q應該接近真實分布 P P P。