常用機器學習算法匯總(中)

機器學習入門系列(2)--如何構(gòu)建一個完整的機器學習項目,第八篇!

該系列的前七篇文章:

上一篇文章介紹了線性回歸、邏輯回歸、決策樹和隨機森林四種算法,本文會繼續(xù)介紹四種算法--SVM、樸素貝葉斯、KNN 以及 kmean 算法,其中最后一種是無監(jiān)督學習的聚類算法,前面三種也是非常常見的算法,特別是 SVM,在 2012 年 AlexNet 網(wǎng)絡的成功之前,一直都是圖像分類中非常常用的分類算法。

因為公眾號不支持外鏈,所以可以點擊文末“閱讀原文”查看外部鏈接。


5. 支持向量機(SVM)

簡述

定義:SVM 是一種二類分類模型,其基本模型定義為特征空間上的間隔最大的線性分類器,即支持向量機的學習策略便是間隔最大化,最終可轉(zhuǎn)化為一個凸二次規(guī)劃問題的求解。

或者簡單的可以理解為就是在高維空間中尋找一個合理的超平面將數(shù)據(jù)點分隔開來,其中涉及到非線性數(shù)據(jù)到高維的映射以達到數(shù)據(jù)線性可分的目的。

訓練數(shù)據(jù)線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機,又稱為硬間隔支持向量機;訓練數(shù)據(jù)近似線性可分時,通過軟間隔最大化,也學習一個線性分類器,即線性支持向量機,也稱為軟間隔支持向量機;訓練數(shù)據(jù)線性不可分時,通過使用核技巧和軟間隔最大化,學習非線性支持向量機。

原始的 SVM 是一個二類分類器,但后續(xù)針對多類分類問題,也進行了拓展,有以下幾種改進來實現(xiàn)多類分類問題:

1.直接法

直接在目標函數(shù)上進行修改,將多個分類面的參數(shù)求解合并到一個最優(yōu)化問題中,通過求解該優(yōu)化就可以實現(xiàn)多分類。

但是計算復雜度很高,實現(xiàn)起來較為困難。一般很少使用這種方法

2.間接法,間接法又分為以下幾種:

  • 一對多:每次訓練的時候設置其中某個類為一類,其余所有類為另一個類。

比如有 A,B,C,D 四個類,第一次 A 是一個類,B,C,D 是一個類,訓練一個分類器,第二次 B 是一個類,然后 A,C,D 是一個類,訓練一個分類器,依次類推。因此,如果總共有 n 個類,最終將訓練 n 個分類器。

測試的時候,將測試樣本都分別送入所有分類器中,取得到最大值的類別作為其分類結(jié)果。這是因為到分類面距離越大,分類越可信。

這種方法的優(yōu)點是每個優(yōu)化問題的規(guī)模比較小,而且分類速度很快,因為分類器數(shù)目和類別數(shù)目相同;但是,有時會出現(xiàn)這樣兩種情況:對一個測試樣本,每個分類器都得到它屬于分類器所在類別;或者都不屬于任意一個分類器的類別。前者稱為分類重疊現(xiàn)象,后者叫不可分類現(xiàn)象。前者可以任意選擇一個結(jié)果或者就按照其到每個超平面的距離來分,哪個遠選哪個類別;而后者只能分給新的第 n+1 個類別了。最大的缺點還是由于將 n-1 個類別作為一個類別,其數(shù)目會數(shù)倍于只有 1 個類的類別,這樣會人為造成數(shù)據(jù)集偏斜的問題

  • 一對一:任意兩個類都訓練一個分類器,預測的時候通過投票選擇最終結(jié)果。

這個方法同樣會有分類重疊的現(xiàn)象,但不會有不可分類現(xiàn)象,因為不可能所有類別的票數(shù)都是 0。這種方法會比較高效,每次訓練使用的樣本其實就只有兩類數(shù)據(jù),而且預測會比較穩(wěn)定,但是缺點是預測時間會很久

優(yōu)缺點

優(yōu)點
  1. 使用核函數(shù)可以向高維空間進行映射
  2. 使用核函數(shù)可以解決非線性的分類
  3. 分類思想很簡單,就是將樣本與決策面的間隔最大化
  4. 分類效果較好
缺點
  1. 對大規(guī)模數(shù)據(jù)訓練比較困難
  2. 無法直接支持多分類,但是可以使用間接的方法來做
  3. 噪聲也會影響SVM的性能,因為SVM主要是由少量的支持向量決定的。

代碼實現(xiàn)

線性 SVM 的代碼實現(xiàn):

from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_split

iris = datasets.load_iris() # 由于Iris是很有名的數(shù)據(jù)集,scikit-learn已經(jīng)原生自帶了。
X = iris.data[:, [2, 3]]
y = iris.target # 標簽已經(jīng)轉(zhuǎn)換成0,1,2了
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 為了看模型在沒有見過數(shù)據(jù)集上的表現(xiàn),隨機拿出數(shù)據(jù)集中30%的部分做測試

# 為了追求機器學習和最優(yōu)化算法的最佳性能,我們將特征縮放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train) # 估算每個特征的平均值和標準差
sc.mean_ # 查看特征的平均值,由于Iris我們只用了兩個特征,所以結(jié)果是array([ 3.82857143,  1.22666667])
sc.scale_ # 查看特征的標準差,這個結(jié)果是array([ 1.79595918,  0.77769705])
X_train_std = sc.transform(X_train)
# 注意:這里我們要用同樣的參數(shù)來標準化測試集,使得測試集和訓練集之間有可比性
X_test_std = sc.transform(X_test)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))

# 導入SVC
from sklearn.svm import SVC
svm = SVC(kernel='linear', C=1.0, random_state=0) # 用線性核,你也可以通過kernel參數(shù)指定其它的核。
svm.fit(X_train_std, y_train)
# 打印決策邊界,這個函數(shù)是我自己寫的,如果你想要的話,我發(fā)給你
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()

接下來是使用非線性 SVM 的代碼:

svm = SVC(kernel='rbf', random_state=0, gamma=x, C=1.0) # 令gamma參數(shù)中的x分別等于0.2和100.0
svm.fit(X_train_std, y_train) # 這兩個參數(shù)和上面代碼中的訓練集一樣
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()

6. 樸素貝葉斯

簡述

樸素貝葉斯是基于貝葉斯定理與特征條件獨立假設的分類方法。

貝葉斯定理是基于條件概率來計算的,條件概率是在已知事件 B 發(fā)生的前提下,求解事件 A 發(fā)生的概率,即
P(A|B)=\frac{P(AB)}{P(B)}

所以貝葉斯定理如下所示:

P(B|A) = \frac{P(A|B)P(B)}{P(A)}

樸素貝葉斯分類器可表示為:

f(x)=argmax P(y_{k})\prod_{i=1}^{n}P(x_{i}|y_{k})

這里 P(y_k) 是先驗概率,而 P(y_k|x) 則是后驗概率,樸素貝葉斯的目標就是最大化后驗概率,這等價于期望風險最小化。

樸素貝葉斯根據(jù)特征是否離散,分為三種模型,如下所示:

  • 貝葉斯估計/多項式模型:當特征是離散的時候,使用該模型;
  • 高斯模型:特征是連續(xù)的時候采用該模型;
  • 伯努利模型:特征是離散的,且取值只能是 0 和 1。

優(yōu)缺點

優(yōu)點
  • 對小規(guī)模的數(shù)據(jù)表現(xiàn)很好,適合多分類任務,適合增量式訓練。
缺點
  • 對輸入數(shù)據(jù)的表達形式很敏感(離散、連續(xù),值極大極小之類的)。

對比邏輯回歸和樸素貝葉斯

相同點
  1. 兩者都是對特征的線性表達
  2. 兩者建模的都是條件概率,對最終求得的分類結(jié)果有很好的解釋性
與邏輯回歸的不同
  1. 樸素貝葉斯是一個生成模型,在計算 P(y|x) 之前,先要從訓練數(shù)據(jù)中計算 P(x|y) 和 P(y) 的概率,從而利用貝葉斯公式計算 P(y|x)。

    邏輯回歸是一個判別模型,它通過在訓練數(shù)據(jù)集上最大化判別函數(shù) P(y|x) 學習得到,不需要知道 P(x|y) 和 P(y) 。

  2. 樸素貝葉斯是建立在條件獨立假設基礎之上的,設特征 X 含有n個特征屬性(X1,X2,...Xn),那么在給定Y的情況下,X1,X2,...Xn是條件獨立的。

    邏輯回歸的限制則要寬松很多,如果數(shù)據(jù)滿足條件獨立假設,能夠取得非常好的效果;當數(shù)據(jù)不滿足條件獨立假設時,邏輯回歸仍然能夠通過調(diào)整參數(shù)讓模型最大化的符合數(shù)據(jù)的分布,從而訓練得到在現(xiàn)有數(shù)據(jù)集下的一個最優(yōu)模型。

  3. 當數(shù)據(jù)集比較小的時候,應該選用Naive Bayes,為了能夠取得很好的效果,數(shù)據(jù)的需求量為 O(log n)

    當數(shù)據(jù)集比較大的時候,應該選用Logistic Regression,為了能夠取得很好的效果,數(shù)據(jù)的需求量為 O( n)

代碼實現(xiàn)

下面是使用sklearn的代碼例子,分別實現(xiàn)上述三種模型,例子來自 樸素貝葉斯的三個常用模型:高斯、多項式、伯努利

首先是高斯模型的實現(xiàn):

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> iris.feature_names  # 四個特征的名字
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
>>> iris.data
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 5.4,  3.9,  1.7,  0.4],
       [ 4.6,  3.4,  1.4,  0.3],
       [ 5. ,  3.4,  1.5,  0.2],
       ......
       [ 6.5,  3. ,  5.2,  2. ],
       [ 6.2,  3.4,  5.4,  2.3],
       [ 5.9,  3. ,  5.1,  1.8]]) #類型是numpy.array
>>> iris.data.size  
600  #共600/4=150個樣本
>>> iris.target_names
array(['setosa', 'versicolor', 'virginica'], 
      dtype='|S10')
>>> iris.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,....., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ......, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
>>> iris.target.size
150
>>> from sklearn.naive_bayes import GaussianNB
>>> clf = GaussianNB()
>>> clf.fit(iris.data, iris.target)
>>> clf.predict(iris.data[0])
array([0])   # 預測正確
>>> clf.predict(iris.data[149])
array([2])   # 預測正確
>>> data = numpy.array([6,4,6,2])
>>> clf.predict(data)
array([2])  # 預測結(jié)果很合理

接著,多項式模型如下:

>>> import numpy as np
>>> X = np.random.randint(5, size=(6, 100))
>>> y = np.array([1, 2, 3, 4, 5, 6])
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2]))
[3]

值得注意的是,多項式模型在訓練一個數(shù)據(jù)集結(jié)束后可以繼續(xù)訓練其他數(shù)據(jù)集而無需將兩個數(shù)據(jù)集放在一起進行訓練。在 sklearn 中,MultinomialNB() 類的partial_fit() 方法可以進行這種訓練。這種方式特別適合于訓練集大到內(nèi)存無法一次性放入的情況。

在第一次調(diào)用 partial_fit() 時需要給出所有的分類標號。

>>> import numpy
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB() 
>>> clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb'])
GaussianNB()
>>> clf.partial_fit(numpy.array([6,1]), numpy.array(['bb']))
GaussianNB()
>>> clf.predict(numpy.array([9,1]))
array(['bb'], 
      dtype='|S2')

伯努利模型如下:

>>> import numpy as np
>>> X = np.random.randint(2, size=(6, 100))
>>> Y = np.array([1, 2, 3, 4, 4, 5])
>>> from sklearn.naive_bayes import BernoulliNB
>>> clf = BernoulliNB()
>>> clf.fit(X, Y)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2]))
[3]

7. KNN 算法

簡述

k 近鄰(KNN)是一種基本分類與回歸方法。

其思路如下:給一個訓練數(shù)據(jù)集和一個新的實例,在訓練數(shù)據(jù)集中找出與這個新實例最近的 k 個訓練實例,然后統(tǒng)計最近的 k 個訓練實例中所屬類別計數(shù)最多的那個類,就是新實例的類。其流程如下所示:

  1. 計算訓練樣本和測試樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);
  2. 對上面所有的距離值進行排序;
  3. 選前 k 個最小距離的樣本;
  4. 根據(jù)這 k 個樣本的標簽進行投票,得到最后的分類類別;

KNN 的特殊情況是 k=1 的情況,稱為最近鄰算法。對輸入的實例點(特征向量)x,最近鄰法將訓練數(shù)據(jù)集中與 x 最近鄰點的類作為其類別。

三要素

  1. k 值的選擇
  2. 距離的度量(常見的距離度量有歐式距離,馬氏距離)
  3. 分類決策規(guī)則(多數(shù)表決規(guī)則)

k 值的選擇

  1. k 值越小表明模型越復雜,更加容易過擬合,其偏差小,而方差大
  2. 但是 k 值越大,模型越簡單,如果 k=N 的時候就表明無論什么點都是訓練集中類別最多的那個類,這種情況,則是偏差大,方差小

所以一般 k 會取一個較小的值,然后用過交叉驗證來確定
這里所謂的交叉驗證就是將樣本劃分一部分出來為預測樣本,比如 95% 訓練,5% 預測,然后 k 分別取1,2,3,4,5 之類的,進行預測,計算最后的分類誤差,選擇誤差最小的 k

距離的度量

KNN 算法使用的距離一般是歐式距離,也可以是更一般的 Lp 距離或者馬氏距離,其中 Lp 距離定義如下:

L_p(x_i, x_j) = (\sum_{l=1}^n |x_i^{(l)} - x_j^{(l)} |^p)^{\frac{1}{p}}

KNN的回歸

在找到最近的 k 個實例之后,可以計算這 k 個實例的平均值作為預測值。或者還可以給這 k 個實例添加一個權重再求平均值,這個權重與度量距離成反比(越近權重越大)

優(yōu)缺點

優(yōu)點

  1. 思想簡單,理論成熟,既可以用來做分類也可以用來做回歸
  2. 可用于非線性分類
  3. 訓練時間復雜度為 O(n);
  4. 準確度高,對數(shù)據(jù)沒有假設,對異常值不敏感;

缺點

  1. 計算量大
  2. 樣本不平衡問題(即有些類別的樣本數(shù)量很多,而其它樣本的數(shù)量很少);
  3. 需要大量的內(nèi)存

代碼實現(xiàn)

使用sklearn的簡單代碼例子:

#Import Library
from sklearn.neighbors import KNeighborsClassifier

#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create KNeighbors classifier object model 

KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5

# Train the model using the training sets and check score
model.fit(X, y)

#Predict Output
predicted= model.predict(x_test)

最后,在用KNN前你需要考慮到:

  • KNN的計算成本很高
  • 所有特征應該標準化數(shù)量級,否則數(shù)量級大的特征在計算距離上會有偏移。
  • 在進行KNN前預處理數(shù)據(jù),例如去除異常值,噪音等。

8. Kmeans 算法

簡述

K-均值(Kmeans)是最普及的聚類算法,算法接受一個未標記的數(shù)據(jù)集,然后將數(shù)據(jù)集聚類成不同的組。

K-均值是一個迭代算法,假設我們想要將數(shù)據(jù)聚類成 n 個組,其方法為:

  1. 首先選擇 K 個隨機的點,稱其為聚類中心
  2. 對于數(shù)據(jù)集中的每一個數(shù)據(jù),按照距離 K 個中心點的距離,將其與距離最近的中心點關聯(lián)起來,與同一個中心點關聯(lián)的所有點聚成一個類
  3. 計算每一個組的平均值,將該組所關聯(lián)的中心點移動到平均值的位置
  4. 重復步驟 2-3,直到中心點不再變化

這個過程中分兩個主要步驟,第一個就是第二步,將訓練集中的樣本點根據(jù)其與聚類中心的距離,分配到距離最近的聚類中心處,接著第二個就是第三步,更新類中心,做法是計算每個類的所有樣本的平均值,然后將這個平均值作為新的類中心值,接著繼續(xù)這兩個步驟,直到達到終止條件,一般是指達到設定好的迭代次數(shù)。

當然在這個過程中可能遇到有聚類中心是沒有分配數(shù)據(jù)點給它的,通常的一個做法是刪除這種聚類中心,或者是重新選擇聚類中心,保證聚類中心數(shù)還是初始設定的 K 個

隨機初始化

在運行 K-均值算法之前,首先需要隨機初始化所有的聚類中心點,做法如下:

  1. 首先應該選擇 K<m ,即聚類中心點的個數(shù)要小于所有訓練集實例的數(shù)量
  2. 隨機選擇 K 個訓練實例,然后令 K 個聚類中心分別和這 K 個訓練實例相等

K-均值的一個問題在于,它有可能會停留在一個局部最小值處,而這取決于初始化的情況。

為了解決這個問題,通常需要多次運行 K-均值算法,每一次都重新進行隨機初始化,最后再比較多次運行 K-均值的結(jié)果,選擇代價函數(shù)最小的結(jié)果。這種方法在** K 較小(2-10)**的時候還是可行的,但是如果 K 較大,這種做法可能不會有明顯地改善。

優(yōu)缺點

優(yōu)點

  1. k-means 算法是解決聚類問題的一種經(jīng)典算法,算法簡單、快速
  2. 對處理大數(shù)據(jù)集,該算法是相對可伸縮的和高效率的,因為它的復雜度大約是 O(nkt),其中 n 是所有對象的數(shù)目,k 是簇的數(shù)目, t 是迭代的次數(shù)。通常 k<<n。這個算法通常局部收斂
  3. 算法嘗試找出使平方誤差函數(shù)值最小的k個劃分。當簇是密集的、球狀或團狀的,且簇與簇之間區(qū)別明顯時,聚類效果較好。

缺點

  1. k-平均方法只有在簇的平均值被定義的情況下才能使用,且對有些分類屬性的數(shù)據(jù)不適合。
  2. 要求用戶必須事先給出要生成的簇的數(shù)目 k。
  3. 對初值敏感,對于不同的初始值,可能會導致不同的聚類結(jié)果。
  4. 不適合于發(fā)現(xiàn)非凸面形狀的簇,或者大小差別很大的簇
  5. 對于"噪聲"和孤立點數(shù)據(jù)敏感,少量的該類數(shù)據(jù)能夠?qū)ζ骄诞a(chǎn)生極大影響。

代碼實現(xiàn)

代碼參考自K-Means Clustering

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2016/10/21 16:35
@Author  : cai

實現(xiàn) K-Means 聚類算法
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
import os

# 尋址最近的中心點
def find_closest_centroids(X, centroids):
    m = X.shape[0]
    k = centroids.shape[0]
    idx = np.zeros(m)

    for i in range(m):
        min_dist = 1000000
        for j in range(k):
            # 計算每個訓練樣本和中心點的距離
            dist = np.sum((X[i, :] - centroids[j, :]) ** 2)
            if dist < min_dist:
                # 記錄當前最短距離和其中心的索引值
                min_dist = dist
                idx[i] = j

    return idx

# 計算聚類中心
def compute_centroids(X, idx, k):
    m, n = X.shape
    centroids = np.zeros((k, n))

    for i in range(k):
        indices = np.where(idx == i)
        # 計算下一個聚類中心,這里簡單的將該類中心的所有數(shù)值求平均值作為新的類中心
        centroids[i, :] = (np.sum(X[indices, :], axis=1) / len(indices[0])).ravel()

    return centroids

# 初始化聚類中心
def init_centroids(X, k):
    m, n = X.shape
    centroids = np.zeros((k, n))
    # 隨機初始化 k 個 [0,m]的整數(shù)
    idx = np.random.randint(0, m, k)

    for i in range(k):
        centroids[i, :] = X[idx[i], :]

    return centroids

# 實現(xiàn) kmeans 算法
def run_k_means(X, initial_centroids, max_iters):
    m, n = X.shape
    # 聚類中心的數(shù)目
    k = initial_centroids.shape[0]
    idx = np.zeros(m)
    centroids = initial_centroids

    for i in range(max_iters):
        idx = find_closest_centroids(X, centroids)
        centroids = compute_centroids(X, idx, k)

    return idx, centroids

dataPath = os.path.join('data', 'ex7data2.mat')
data = loadmat(dataPath)
X = data['X']

initial_centroids = init_centroids(X, 3)
# print(initial_centroids)
# idx = find_closest_centroids(X, initial_centroids)
# print(idx)

# print(compute_centroids(X, idx, 3))

idx, centroids = run_k_means(X, initial_centroids, 10)
# 可視化聚類結(jié)果
cluster1 = X[np.where(idx == 0)[0], :]
cluster2 = X[np.where(idx == 1)[0], :]
cluster3 = X[np.where(idx == 2)[0], :]

fig, ax = plt.subplots(figsize=(12, 8))
ax.scatter(cluster1[:, 0], cluster1[:, 1], s=30, color='r', label='Cluster 1')
ax.scatter(cluster2[:, 0], cluster2[:, 1], s=30, color='g', label='Cluster 2')
ax.scatter(cluster3[:, 0], cluster3[:, 1], s=30, color='b', label='Cluster 3')
ax.legend()
plt.show()

# 載入一張測試圖片,進行測試
imageDataPath = os.path.join('data', 'bird_small.mat')
image = loadmat(imageDataPath)
# print(image)

A = image['A']
print(A.shape)

# 對圖片進行歸一化
A = A / 255.

# 重新調(diào)整數(shù)組的尺寸
X = np.reshape(A, (A.shape[0] * A.shape[1], A.shape[2]))
# 隨機初始化聚類中心
initial_centroids = init_centroids(X, 16)
# 運行聚類算法
idx, centroids = run_k_means(X, initial_centroids, 10)

# 得到最后一次的最近中心點
idx = find_closest_centroids(X, centroids)
# map each pixel to the centroid value
X_recovered = centroids[idx.astype(int), :]
# reshape to the original dimensions
X_recovered = np.reshape(X_recovered, (A.shape[0], A.shape[1], A.shape[2]))

# plt.imshow(X_recovered)
# plt.show()

完整代碼例子和數(shù)據(jù)可以查看Kmeans練習代碼


小結(jié)

這四種算法就簡單介紹這么多內(nèi)容,下一篇會介紹最后幾種常見的算法,包括目前非常常用的深度學習網(wǎng)絡--卷積神經(jīng)網(wǎng)絡。

如果對本文有任何建議或者想法,都可以在后臺留言給我,謝謝!


參考


歡迎關注我的微信公眾號--算法猿的成長,或者掃描下方的二維碼,大家一起交流,學習和進步!

往期精彩推薦

機器學習系列
Github項目 & 資源教程推薦
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內(nèi)容