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