核心點:關(guān)于svm的介紹,以及代碼示例!
哈嘍,我是cos大壯!
記得最初學習SVM的時候,既有激動又有崇拜,也不知道為什么?總是和開始學習的回歸、聚類不太一樣。
在這之前咱們已經(jīng)接觸了 各個算法的優(yōu)缺點的總結(jié),以及8個回歸類算法、7個正則化算法的總結(jié)、5 個集成算法模型的全部總結(jié)!
感興趣的可以翻到之前看看~
咱們今天就大概一起學習一下關(guān)于SVM的方方面面。
先來啰嗦幾點關(guān)于 SVM 的優(yōu)勢和劣勢!
優(yōu)勢:
1、適用性廣泛:SVM支持向量機在解決分類和回歸問題上表現(xiàn)出色,可應用于各種數(shù)據(jù)類型和領(lǐng)域,例如文本分類、圖像識別和生物信息學等。
2、魯棒性強:SVM支持向量機對于訓練數(shù)據(jù)中的噪聲和異常點具有一定的魯棒性,可以有效地處理輸入數(shù)據(jù)中的噪聲。
3、可避免陷入局部最優(yōu)解:由于SVM支持向量機使用了結(jié)構(gòu)風險最小化原則,它能夠更好地避免陷入局部最優(yōu)解,并且具有較低的泛化誤差。
4、高維空間有效:SVM支持向量機通過核技巧將低維空間的非線性問題映射到高維空間,在高維空間中進行線性劃分,從而有效地解決了復雜的非線性問題。
5、可控制的過擬合:SVM支持向量機通過調(diào)整正則化參數(shù)和松弛變量來控制模型的復雜度,從而可以有效地避免過擬合問題。
劣勢:
1、計算復雜度高:SVM支持向量機在大規(guī)模數(shù)據(jù)集上的訓練時間較長,特別是對于非線性問題和核函數(shù)的使用。
2、參數(shù)選擇敏感:SVM支持向量機中的參數(shù)調(diào)優(yōu)過程通常需要進行交叉驗證,對于不同的問題和數(shù)據(jù)集,選擇合適的參數(shù)可能會比較困難。
3、對缺失數(shù)據(jù)敏感:SVM支持向量機對于含有大量缺失數(shù)據(jù)的情況可能表現(xiàn)不佳,需要在預處理階段進行適當?shù)奶幚怼?/p>
4、適用于二分類問題:原始的SVM支持向量機算法只能解決二分類問題,對于多類別問題需要進行擴展或使用其他方法。
盡管SVM支持向量機存在一些劣勢,但其優(yōu)勢使得它成為了數(shù)據(jù)分析和機器學習領(lǐng)域中一個重要的算法之一。
在實際工作中,我們可以根據(jù)具體問題的特點和需求來選擇合適的分類算法。
大家伙如果覺得還不錯!可以點贊、轉(zhuǎn)發(fā)安排起來,讓更多的朋友看到。
ok,咱們一起來學習一下~
線性支持向量機是一種用于解決分類問題的機器學習算法。
它的目標是找到一個能夠在數(shù)據(jù)中畫出一條直線(或者高維空間中的超平面),將不同類別的數(shù)據(jù)點分隔開,并且最大化兩側(cè)最靠近這條線的數(shù)據(jù)點之間的距離。
這兩側(cè)最靠近線的數(shù)據(jù)點被稱為支持向量。
線性SVM在以下情況下非常有用:
線性SVM的決策函數(shù)可以表示為:
其中, 是預測的類別, 是權(quán)重向量, 是輸入特征向量, 是偏置(或截距), 表示向量的點積。決策函數(shù)的目標是使支持向量到?jīng)Q策邊界的距離最大化,這個距離稱為間隔。
我們創(chuàng)建一個簡單的線性SVM模型,大家可以直接運行起來:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
# 生成一些隨機數(shù)據(jù)
X, y = datasets.make_classification(n_samples=100, n_features=2, n_classes=2, n_clusters_per_class=1, n_redundant=0)
# 創(chuàng)建SVM模型
clf = svm.SVC(kernel='linear')
clf.fit(X, y)
# 繪制數(shù)據(jù)點
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 繪制決策邊界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 創(chuàng)建網(wǎng)格來評估模型
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50), np.linspace(ylim[0], ylim[1], 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 繪制決策邊界和間隔
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
plt.show()
其中包括數(shù)據(jù)點、決策邊界和間隔。
非線性支持向量機的神奇之處在于,它可以幫助我們把不同形狀的數(shù)據(jù)分開,像拼圖一樣。
有時,我們不能僅僅用一條直線分開這些數(shù)據(jù),所以我們需要一些特殊的技巧,這就是非線性SVM的用武之地。
非線性SVM在很多情況下都非常有用,比如:
另外,非線性SVM的數(shù)學公式比較復雜,但我們可以簡化為:它是一種方法,可以將數(shù)據(jù)映射到一個不同的空間,然后在那個空間中使用線性SVM。這個映射是通過一個叫做核函數(shù)來完成的。這個核函數(shù)通常表示為,它將原始數(shù)據(jù)和映射到一個新的空間。
下面是一個使用非線性SVM的Python案例,以幫助理解。
我們將使用支持向量機庫svm
中的SVC
類,并使用徑向基函數(shù)(RBF)核。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
# 創(chuàng)建一些具有非線性特征的數(shù)據(jù)
X, y = datasets.make_circles(n_samples=100, factor=0.5, noise=0.1)
# 創(chuàng)建非線性SVM模型
clf = svm.SVC(kernel='rbf')
clf.fit(X, y)
# 繪制數(shù)據(jù)點
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 繪制決策邊界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 創(chuàng)建網(wǎng)格來評估模型
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50), np.linspace(ylim[0], ylim[1], 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 繪制決策邊界和間隔
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
plt.show()
上面代碼,展示了使用非線性SVM將非線性數(shù)據(jù)分隔開。
多類別支持向量機可以應用于許多實際問題中。
比如,當我們有很多動物的照片,我們想知道每個動物的種類;或者當我們有很多水果的特征數(shù)據(jù),我們想根據(jù)這些特征將水果分類。
我們可以用一些數(shù)學公式來描述多類別支持向量機。假設(shè)我們有n個數(shù)據(jù)點,每個數(shù)據(jù)點有兩個特征,分別用x和y表示。我們還有k個類別,用1到k的數(shù)字表示。
多類別支持向量機的目標是找到一條線(或曲線),可以將不同類別的點分開。我們可以使用以下公式表示多類別支持向量機的決策規(guī)則:
對于每個類別i(從到):
如果 ,則數(shù)據(jù)點屬于類別;否則,數(shù)據(jù)點不屬于類別。
其中和是用來控制決策邊界的參數(shù)。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt
# 加載數(shù)據(jù)集(這里使用鳶尾花數(shù)據(jù)集作為示例)
iris = datasets.load_iris()
X = iris.data[:, :2] # 只選取前兩個特征
y = iris.target
# 將數(shù)據(jù)集拆分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建多類別支持向量機模型,選擇線性核函數(shù)
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)
# 預測測試集中的類別
y_pred = svm.predict(X_test)
# 繪制決策邊界和樣本點
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
# 繪制支持向量
support_vectors = svm.support_vectors_
plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100, facecolors='none', edgecolors='k')
# 繪制特殊點
special_points = [[5.9, 3.0], [6.2, 2.8]]
plt.scatter([point[0] for point in special_points], [point[1] for point in special_points], color='red', marker='x')
# 繪制決策邊界
xlim = plt.gca().get_xlim()
ylim = plt.gca().get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = svm.decision_function(xy).reshape(XX.shape)
plt.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
plt.show()
圖中的點代表不同類型的花,顏色不同表示不同的類別。
核函數(shù)支持向量機使用場景很多,比如在圖像識別、文本分類和生物信息學等領(lǐng)域都有應用。
核函數(shù)支持向量機的公式表達如下:
給定一個訓練集 ,其中 是輸入特征向量, 是對應的類別標簽。核函數(shù)支持向量機的目標是找到一個超平面,將不同類別的樣本分隔開來。
公式表示為:
其中, 是核函數(shù),它的作用是將輸入特征映射到高維空間。 和 是模型參數(shù),通過訓練得到。
咱們再來舉一個例子:
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np
# 生成樣本數(shù)據(jù)
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
# 創(chuàng)建核函數(shù)支持向量機模型
model = svm.SVC(kernel='rbf')
# 擬合數(shù)據(jù)
model.fit(X, y)
# 繪制決策邊界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 創(chuàng)建網(wǎng)格來評估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = model.decision_function(xy).reshape(XX.shape)
# 繪制決策邊界和支持向量
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],
s=100, facecolors='none', edgecolors='k')
plt.show()
上述代碼首先使用樣本數(shù)據(jù)訓練一個核函數(shù)支持向量機模型,然后通過繪制決策邊界和支持向量的方式可視化分類結(jié)果。決策邊界是用實線表示的,支持向量是用空心圓點表示的。
當我們使用稀疏支持向量機來解決一個分類問題時,我們希望找到一個超平面,能夠?qū)⒉煌悇e的數(shù)據(jù)點有效地分開。
稀疏支持向量機通常用于處理大規(guī)模數(shù)據(jù)集或高維特征的分類問題。例如,在醫(yī)學圖像識別中,當需要處理數(shù)百萬個像素的圖像數(shù)據(jù)時,稀疏支持向量機可以高效地分類;在自然語言處理中,當需要處理大量文本特征時,該算法也能發(fā)揮作用。
給定訓練數(shù)據(jù)集 ,其中 是輸入特征向量, 是對應的類別標簽。
稀疏支持向量機的目標是找到一個超平面,使得盡可能多的訓練數(shù)據(jù)點離該超平面的距離最大化。
公式表示為:
其中, 是關(guān)于訓練數(shù)據(jù)點的權(quán)重系數(shù), 是對應數(shù)據(jù)點的類別(1代表正類,-1代表負類), 是核函數(shù),用于計算數(shù)據(jù)點和之間的相似度。
舉一個關(guān)于稀疏支持向量機的例子,大家只要安裝了相應的包即可直接運行起來:
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np
# 生成樣本數(shù)據(jù)
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
# 創(chuàng)建稀疏支持向量機模型
model = svm.SVC(kernel='linear')
# 擬合數(shù)據(jù)
model.fit(X, y)
# 繪制數(shù)據(jù)點
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
# 繪制超平面
w = model.coef_[0]
b = model.intercept_[0]
x_min, x_max = plt.xlim()
y_min, y_max = plt.ylim()
xx = np.linspace(x_min, x_max)
yy = -(w[0] * xx + b) / w[1]
plt.plot(xx, yy, 'k-')
# 繪制支持向量
support_vectors = model.support_vectors_
plt.scatter(support_vectors[:, 0], support_vectors[:, 1],
s=200, facecolors='none', edgecolors='k')
plt.show()
上述代碼使用給定的樣本數(shù)據(jù)訓練一個稀疏支持向量機模型,并繪制數(shù)據(jù)點、超平面以及支持向量。
超平面由w
和b
參數(shù)定義,支持向量表示離超平面最近的數(shù)據(jù)點。
核貝葉斯支持向量機通過學習一些已知的例子,并找到一個特殊的邊界,用于將不同的事物區(qū)分開來。
核貝葉斯支持向量機可以應用于很多現(xiàn)實生活中的問題。例如:
1、郵件分類:將電子郵件自動分為垃圾郵件和非垃圾郵件。
2、圖像識別:判斷圖像中是貓還是狗。
3、情感分析:自動判斷文本評論是正面還是負面情感。
核貝葉斯支持向量機的公式可以簡化為以下形式:
在這個公式中,代表我們要進行分類的事物。 是與樣本數(shù)據(jù)相關(guān)的權(quán)重, 是每個樣本數(shù)據(jù)對應的類別標簽(例如,1代表一類事物,-1代表另一類事物)。
舉個 Python 的例子
import numpy as np
import plotly.graph_objects as go
from sklearn.svm import SVC
# 生成示例數(shù)據(jù)
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
y = np.array([0, 1, 1, 0])
# 創(chuàng)建支持向量機模型
model = SVC(kernel='linear')
# 擬合數(shù)據(jù)
model.fit(X, y)
# 繪制數(shù)據(jù)點
data = [
go.Scatter3d(
x=X[:, 0],
y=X[:, 1],
z=X[:, 2],
mode='markers',
marker=dict(
size=6,
color=y,
colorscale='Viridis',
opacity=0.8
)
)
]
# 繪制決策邊界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
z_min, z_max = X[:, 2].min() - 1, X[:, 2].max() + 1
xx, yy, zz = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1),
np.arange(z_min, z_max, 0.1))
Z = model.predict(np.c_[xx.ravel(), yy.ravel(), zz.ravel()])
Z = Z.reshape(xx.shape)
# 添加決策邊界到圖形中
data.append(
go.Surface(
x=xx,
y=yy,
z=zz,
surfacecolor=Z,
colorscale='Viridis',
showscale=False
)
)
# 創(chuàng)建布局
layout = go.Layout(
scene=dict(
xaxis=dict(title='X'),
yaxis=dict(title='Y'),
zaxis=dict(title='Z')
),
margin=dict(l=0, r=0, b=0, t=0)
)
# 繪制圖形
fig = go.Figure(data=data, layout=layout)
fig.show()
上述代碼使用示例數(shù)據(jù)訓練了一個核貝葉斯支持向量機模型,并利用 Plotly 生成了直觀的一個三維圖像。
不平衡類別支持向量機是一種分類算法,它使用支持向量機的思想來處理不平衡類別數(shù)據(jù)集。
它的目標是通過調(diào)整決策邊界,使得分類模型能夠更好地識別少數(shù)類別,并提高整體分類準確率。
不平衡類別支持向量機常用于以下場景:
不平衡類別支持向量機的目標是最小化以下公式:
其中,是決策邊界的權(quán)重向量,是偏置項,是懲罰參數(shù),是松弛變量。
下面是一個簡單的使用不平衡類別支持向量機進行分類的示例代碼:
import numpy as np
from sklearn.svm import SVC
import plotly.graph_objects as go
# 創(chuàng)建訓練數(shù)據(jù)
X = np.array([[3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([0, 0, 1, 1])
# 創(chuàng)建不平衡類別支持向量機模型
model = SVC(class_weight='balanced')
# 擬合模型
model.fit(X, y)
# 生成網(wǎng)格點用于繪制決策邊界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 繪制三維圖
fig = go.Figure(data=[go.Surface(z=Z, x=xx, y=yy)])
fig.update_layout(title='Decision Boundary', autosize=False,
width=500, height=500, margin=dict(l=65, r=50, b=65, t=90))
fig.show()
這段代碼使用 Scikit-learn 庫中的 SVC 類來創(chuàng)建不平衡類別支持向量機模型,并使用plotly庫繪制三維圖來展示決策邊界。在訓練數(shù)據(jù)中,我們有兩個特征和兩個類別。通過擬合模型并預測網(wǎng)格點上的分類結(jié)果,我們可以得到?jīng)Q策邊界,并將其可視化。
聯(lián)系客服