大家好,我是花哥。
近期,吳恩達老師 在其創(chuàng)辦的人工智能周訊《The Batch》上更新了一篇博文,總結(jié)了機器學習領域多個基礎算法的歷史溯源,并總結(jié)到:(機器學習中)不斷學習與更新基礎知識是十分重要的。與其他技術領域一樣,隨著研究人員的增加、研究成果數(shù)量的增長,機器學習領域也在不斷發(fā)展,但有些基礎算法與核心思想的貢獻是經(jīng)得起時間考驗的。
這六種算法分別是:線性回歸、邏輯回歸、梯度下降、神經(jīng)網(wǎng)絡、決策樹與k均值聚類算法。
本文會深入介紹下這六種基礎算法的背景、原理、優(yōu)缺點、應用場景。
1、線性回歸
?
算法歷程:線性回歸是一種古老的統(tǒng)計方法,它試圖找到最佳擬合數(shù)據(jù)的直線或超平面,最早可以追溯到19世紀初的高斯最小二乘法理論。
原理:線性回歸通過最小化預測值與真實值之間的平方誤差來找到最佳擬合的線性方程。
訓練過程:
選擇一個線性方程的形式(例如:y = mx + b)。
通過最小化平方誤差來找到最佳參數(shù)(m 和 b)。
使用梯度下降或最小二乘法算法來學習參數(shù)。
優(yōu)點:
簡單易懂,計算效率高。
適用于線性關系的數(shù)據(jù)。
缺點:
對非線性關系的數(shù)據(jù)效果不佳。
對異常值敏感。
適用場景:房價預測、股票預測、銷售預測等線性關系明顯的場景。
Python示例代碼:
?
?
from?sklearn.linear_model?import?LinearRegression import?numpy?as?np #?假設X是特征數(shù)據(jù),y是目標變量 X?=?np.array([[1],?[2],?[3],?[4],?[5]]) y?=?np.array([2,?4,?6,?8,?10]) #?創(chuàng)建并訓練模型 model?=?LinearRegression() model.fit(X,?y) #?預測 prediction?=?model.predict([[6]]) print(prediction)
二、邏輯回歸
?
算法歷程:邏輯回歸最初是由David Cox在1958年提出,但真正被廣泛應用是在統(tǒng)計和機器學習領域?qū)Χ诸悊栴}的研究中。
原理:邏輯回歸是一種廣義線性模型,通過邏輯函數(shù)(通常是sigmoid函數(shù))將線性回歸的輸出映射到[0, 1]區(qū)間,從而得到屬于某個類別的概率。
訓練過程:
選擇sigmoid函數(shù)作為激活函數(shù)。
通過最大化對數(shù)似然函數(shù)或使用梯度下降來找到最佳參數(shù)。
優(yōu)點:
計算效率高,實現(xiàn)簡單。
可以輸出概率,便于解釋。
缺點:
對非線性可分的數(shù)據(jù)效果可能不佳。
對特征間的多重共線性敏感。
適用場景:二分類問題,如垃圾郵件分類、疾病檢測等。
Python示例代碼:
from?sklearn.linear_model?import?LogisticRegression import?numpy?as?np #?假設X是特征數(shù)據(jù),y是二分類標簽 X?=?np.array([[1,?2],?[3,?4],?[5,?6],?[7,?8]]) y?=?np.array([0,?0,?1,?1]) #?創(chuàng)建并訓練模型 model?=?LogisticRegression() model.fit(X,?y) #?預測概率 probs?=?model.predict_proba([[9,?10]]) print(probs)
?
?
三、梯度下降
?
算法歷程:梯度下降是一種優(yōu)化算法,最早由Cauchy在1847年提出,用于求解函數(shù)的局部最小值。梯度下降對復雜的神經(jīng)網(wǎng)絡提供了一種有效的優(yōu)化方法,大大推進了深度學習的發(fā)展。
原理:通過計算損失函數(shù)關于模型參數(shù)的梯度,并沿梯度的反方向更新參數(shù),以逐漸減小損失函數(shù)的值。
訓練過程:
初始化模型參數(shù)。
計算損失函數(shù)關于參數(shù)的梯度。
使用學習率乘以梯度來更新參數(shù)。
重復步驟2和3,直到滿足停止條件(如達到最大迭代次數(shù)或梯度足夠小)。
優(yōu)點:
通用性強,可用于多種機器學習模型。
簡單直觀,易于實現(xiàn)。
缺點:
對學習率的設置敏感。
可能陷入局部最小值。
適用場景:用于訓練各種機器學習模型,如線性回歸、邏輯回歸、神經(jīng)網(wǎng)絡等。
Python示例代碼(以線性回歸為例):
import?numpy?as?np #?假設X是特征數(shù)據(jù),y是目標變量 X?=?np.array([[1],?[2],?[3],?[4],?[5]]) y?=?np.array([2,?4,?6,?8,?10]) #?初始化參數(shù) m,?b?=?0,?0 learning_rate?=?0.01 epochs?=?1000 #?梯度下降訓練過程 for?epoch?in?range(epochs): ????y_pred?=?m?*?X?+?b ????loss?=?np.mean((y_pred?-?y)?**?2) ????grad_m?=?2?*?np.mean((y_pred?-?y)?*?X) ????grad_b?=?2 ????*grad_b?=?2?*?np.mean(y_pred?-?y) ???? ????#?更新參數(shù) ????m?-=?learning_rate?*?grad_m ????b?-=?learning_rate?*?grad_b ???? ????#?可選:打印損失值以觀察收斂情況 ????if?epoch?%?100?==?0: ????????print(f'Epoch?{epoch},?Loss:?{loss}') #?打印最終參數(shù)和損失 print(f'Final?m:?{m},?Final?b:?,?Final?Loss:?{loss}')
?
?
四、神經(jīng)網(wǎng)絡
?
算法歷程:神經(jīng)網(wǎng)絡的研究始于20世紀40年代,由于早期算力的瓶頸,經(jīng)歷了多次興衰。直到2006年深度學習的提出,數(shù)據(jù)、算力、算法的發(fā)展,神經(jīng)網(wǎng)絡再次成為研究熱點。
原理:神經(jīng)網(wǎng)絡通過模擬人腦神經(jīng)元的連接和工作方式,構(gòu)建多層的神經(jīng)元網(wǎng)絡來學習和逼近復雜的函數(shù)。
訓練過程:
前向傳播:輸入數(shù)據(jù)通過神經(jīng)網(wǎng)絡得到輸出。
計算損失:比較輸出與真實值之間的差距。
反向傳播:根據(jù)損失函數(shù)計算梯度,并通過鏈式法則逐層回傳梯度。
更新參數(shù):使用梯度下降或其他優(yōu)化算法更新神經(jīng)網(wǎng)絡的權(quán)重和偏置。
優(yōu)點:
強大的表示學習能力,適用于復雜的問題。
可以自動提取特征。
缺點:
容易過擬合,需要正則化技術。
訓練需要大量數(shù)據(jù)和時間。
適用場景:圖像識別、語音識別、自然語言處理等復雜任務。
Python示例代碼(使用Keras庫構(gòu)建簡單神經(jīng)網(wǎng)絡):
?
?
from?keras.models?import?Sequential from?keras.layers?import?Dense import?numpy?as?np #?假設X是特征數(shù)據(jù),y是目標變量 X?=?np.array([[0,?0],?[0,?1],?[1,?0],?[1,?1]]) y?=?np.array([0,?1,?1,?0]) #?創(chuàng)建神經(jīng)網(wǎng)絡模型 model?=?Sequential() model.add(Dense(2,?input_dim=2,?activation='relu'))??#?隱藏層 model.add(Dense(1,?activation='sigmoid'))??#?輸出層 #?編譯模型 model.compile(loss='binary_crossentropy',?optimizer='adam',?metrics=['accuracy']) #?訓練模型 model.fit(X,?y,?epochs=100,?batch_size=1) #?預測 predictions?=?model.predict(X) print(predictions)
?
?
五、決策樹
?
算法歷程:決策樹算法最早由Ross Quinlan在1986年提出,用于解決分類和回歸問題?;跊Q策樹的集成學習模型,無疑是數(shù)據(jù)挖掘任務上的王者。
原理:決策樹通過一系列的問題(即決策節(jié)點)對數(shù)據(jù)進行劃分,每個劃分基于某個特征的值,最終到達葉子節(jié)點得到預測結(jié)果。
訓練過程:
選擇最優(yōu)特征進行劃分(基于信息增益、基尼不純度等指標)。
對每個劃分遞歸地構(gòu)建子樹,直到滿足停止條件(如所有樣本屬于同一類、特征用盡等)。
優(yōu)點:
易于理解和解釋。
可以處理非數(shù)值型數(shù)據(jù)。
對缺失值不敏感。
缺點:
容易過擬合,需要剪枝技術。
對不平衡數(shù)據(jù)敏感。
適用場景:分類問題,尤其是需要有很強的決策解釋性的場景(如貸款審批、客戶分類等)。
Python示例代碼:
?
?
from?sklearn.tree?import?DecisionTreeClassifier import?numpy?as?np #?假設X是特征數(shù)據(jù),y是目標變量 X?=?np.array([[1,?2],?[1,?3],?[2,?1],?[3,?1],?[4,?4],?[5,?5]]) y?=?np.array([0,?0,?1,?1,?0,?0]) #?創(chuàng)建并訓練決策樹模型 model?=?DecisionTreeClassifier() model.fit(X,?y) #?預測 prediction?=?model.predict([[2,?2]]) print(prediction)
?
?
六、k均值
?
算法歷程:k均值算法最早由MacQueen在1967年提出,是一種非常流行的無監(jiān)督學習算法。
原理:k均值算法通過迭代的方式將數(shù)據(jù)劃分為k個簇,每個簇由其質(zhì)心(即簇中所有點的均值)表示。
訓練過程:
隨機選擇k個點作為初始質(zhì)心。
將每個數(shù)據(jù)點分配給最近的質(zhì)心,形成k個簇。
重新計算每個簇的質(zhì)心,即簇中所有點的均值。
重復步驟2和3,直到質(zhì)心的位置不再發(fā)生顯著變化或達到最大迭代次數(shù)。
優(yōu)點:
實現(xiàn)簡單,計算效率高。
對大數(shù)據(jù)集處理效果良好。
缺點:
需要預先設定簇的數(shù)量k。
對初始質(zhì)心的選擇敏感,可能導致不同的聚類結(jié)果。
對于非凸形狀的簇或大小差異很大的簇,效果可能不佳。
適用場景:數(shù)據(jù)聚類、文檔分類等。
Python示例代碼:
?
?
from?sklearn.cluster?import?KMeans import?numpy?as?np #?假設X是需要聚類的數(shù)據(jù) X?=?np.array([[1,?2],?[1,?4],?[1,?0],?[4,?2],?[4,?4],?[4,?0]]) #?創(chuàng)建并訓練k均值模型 kmeans?=?KMeans(n_clusters=2,?random_state=0) kmeans.fit(X) #?預測簇標簽和質(zhì)心 labels?=?kmeans.labels_ centroids?=?kmeans.cluster_centers_ print("Labels:",?labels) print("Centroids:",?centroids) 審核編輯:黃飛
?
?
?
評論
查看更多