核心點(diǎn):關(guān)于svm的介紹,以及代碼示例!
哈嘍,我是cos大壯!
記得最初學(xué)習SVM的時(shí)候,既有激動(dòng)又有崇拜,也不知道為什么?總是和開(kāi)始學(xué)習的回歸、聚類(lèi)不太一樣。
在這之前咱們已經(jīng)接觸了 各個(gè)算法的優(yōu)缺點(diǎn)的總結,以及8個(gè)回歸類(lèi)算法、7個(gè)正則化算法的總結、5 個(gè)集成算法模型的全部總結!
感興趣的可以翻到之前看看~
咱們今天就大概一起學(xué)習一下關(guān)于SVM的方方面面。
先來(lái)啰嗦幾點(diǎn)關(guān)于 SVM 的優(yōu)勢和劣勢!
優(yōu)勢:
1、適用性廣泛:SVM支持向量機在解決分類(lèi)和回歸問(wèn)題上表現出色,可應用于各種數據類(lèi)型和領(lǐng)域,例如文本分類(lèi)、圖像識別和生物信息學(xué)等。
2、魯棒性強:SVM支持向量機對于訓練數據中的噪聲和異常點(diǎn)具有一定的魯棒性,可以有效地處理輸入數據中的噪聲。
3、可避免陷入局部最優(yōu)解:由于SVM支持向量機使用了結構風(fēng)險最小化原則,它能夠更好地避免陷入局部最優(yōu)解,并且具有較低的泛化誤差。
4、高維空間有效:SVM支持向量機通過(guò)核技巧將低維空間的非線(xiàn)性問(wèn)題映射到高維空間,在高維空間中進(jìn)行線(xiàn)性劃分,從而有效地解決了復雜的非線(xiàn)性問(wèn)題。
5、可控制的過(guò)擬合:SVM支持向量機通過(guò)調整正則化參數和松弛變量來(lái)控制模型的復雜度,從而可以有效地避免過(guò)擬合問(wèn)題。
劣勢:
1、計算復雜度高:SVM支持向量機在大規模數據集上的訓練時(shí)間較長(cháng),特別是對于非線(xiàn)性問(wèn)題和核函數的使用。
2、參數選擇敏感:SVM支持向量機中的參數調優(yōu)過(guò)程通常需要進(jìn)行交叉驗證,對于不同的問(wèn)題和數據集,選擇合適的參數可能會(huì )比較困難。
3、對缺失數據敏感:SVM支持向量機對于含有大量缺失數據的情況可能表現不佳,需要在預處理階段進(jìn)行適當的處理。
4、適用于二分類(lèi)問(wèn)題:原始的SVM支持向量機算法只能解決二分類(lèi)問(wèn)題,對于多類(lèi)別問(wèn)題需要進(jìn)行擴展或使用其他方法。
盡管SVM支持向量機存在一些劣勢,但其優(yōu)勢使得它成為了數據分析和機器學(xué)習領(lǐng)域中一個(gè)重要的算法之一。
在實(shí)際工作中,我們可以根據具體問(wèn)題的特點(diǎn)和需求來(lái)選擇合適的分類(lèi)算法。
大家伙如果覺(jué)得還不錯!可以點(diǎn)贊、轉發(fā)安排起來(lái),讓更多的朋友看到。
ok,咱們一起來(lái)學(xué)習一下~
線(xiàn)性支持向量機是一種用于解決分類(lèi)問(wèn)題的機器學(xué)習算法。
它的目標是找到一個(gè)能夠在數據中畫(huà)出一條直線(xiàn)(或者高維空間中的超平面),將不同類(lèi)別的數據點(diǎn)分隔開(kāi),并且最大化兩側最靠近這條線(xiàn)的數據點(diǎn)之間的距離。
這兩側最靠近線(xiàn)的數據點(diǎn)被稱(chēng)為支持向量。
線(xiàn)性SVM在以下情況下非常有用:
線(xiàn)性SVM的決策函數可以表示為:
其中, 是預測的類(lèi)別, 是權重向量, 是輸入特征向量, 是偏置(或截距), 表示向量的點(diǎn)積。決策函數的目標是使支持向量到?jīng)Q策邊界的距離最大化,這個(gè)距離稱(chēng)為間隔。
我們創(chuàng )建一個(gè)簡(jiǎn)單的線(xiàn)性SVM模型,大家可以直接運行起來(lái):
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
# 生成一些隨機數據
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)
# 繪制數據點(diǎn)
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)格來(lái)評估模型
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()
其中包括數據點(diǎn)、決策邊界和間隔。

非線(xiàn)性支持向量機的神奇之處在于,它可以幫助我們把不同形狀的數據分開(kāi),像拼圖一樣。
有時(shí),我們不能僅僅用一條直線(xiàn)分開(kāi)這些數據,所以我們需要一些特殊的技巧,這就是非線(xiàn)性SVM的用武之地。
非線(xiàn)性SVM在很多情況下都非常有用,比如:
另外,非線(xiàn)性SVM的數學(xué)公式比較復雜,但我們可以簡(jiǎn)化為:它是一種方法,可以將數據映射到一個(gè)不同的空間,然后在那個(gè)空間中使用線(xiàn)性SVM。這個(gè)映射是通過(guò)一個(gè)叫做核函數來(lái)完成的。這個(gè)核函數通常表示為,它將原始數據和映射到一個(gè)新的空間。
下面是一個(gè)使用非線(xiàn)性SVM的Python案例,以幫助理解。
我們將使用支持向量機庫svm中的SVC類(lèi),并使用徑向基函數(RBF)核。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
# 創(chuàng )建一些具有非線(xiàn)性特征的數據
X, y = datasets.make_circles(n_samples=100, factor=0.5, noise=0.1)
# 創(chuàng )建非線(xiàn)性SVM模型
clf = svm.SVC(kernel='rbf')
clf.fit(X, y)
# 繪制數據點(diǎn)
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)格來(lái)評估模型
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()
上面代碼,展示了使用非線(xiàn)性SVM將非線(xiàn)性數據分隔開(kāi)。

多類(lèi)別支持向量機可以應用于許多實(shí)際問(wèn)題中。
比如,當我們有很多動(dòng)物的照片,我們想知道每個(gè)動(dòng)物的種類(lèi);或者當我們有很多水果的特征數據,我們想根據這些特征將水果分類(lèi)。
我們可以用一些數學(xué)公式來(lái)描述多類(lèi)別支持向量機。假設我們有n個(gè)數據點(diǎn),每個(gè)數據點(diǎn)有兩個(gè)特征,分別用x和y表示。我們還有k個(gè)類(lèi)別,用1到k的數字表示。
多類(lèi)別支持向量機的目標是找到一條線(xiàn)(或曲線(xiàn)),可以將不同類(lèi)別的點(diǎn)分開(kāi)。我們可以使用以下公式表示多類(lèi)別支持向量機的決策規則:
對于每個(gè)類(lèi)別i(從到):
如果 ,則數據點(diǎn)屬于類(lèi)別;否則,數據點(diǎn)不屬于類(lèi)別。
其中和是用來(lái)控制決策邊界的參數。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt
# 加載數據集(這里使用鳶尾花數據集作為示例)
iris = datasets.load_iris()
X = iris.data[:, :2] # 只選取前兩個(gè)特征
y = iris.target
# 將數據集拆分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng )建多類(lèi)別支持向量機模型,選擇線(xiàn)性核函數
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)
# 預測測試集中的類(lèi)別
y_pred = svm.predict(X_test)
# 繪制決策邊界和樣本點(diǎn)
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')
# 繪制特殊點(diǎn)
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()
圖中的點(diǎn)代表不同類(lèi)型的花,顏色不同表示不同的類(lèi)別。

核函數支持向量機使用場(chǎng)景很多,比如在圖像識別、文本分類(lèi)和生物信息學(xué)等領(lǐng)域都有應用。
核函數支持向量機的公式表達如下:
給定一個(gè)訓練集 ,其中 是輸入特征向量, 是對應的類(lèi)別標簽。核函數支持向量機的目標是找到一個(gè)超平面,將不同類(lèi)別的樣本分隔開(kāi)來(lái)。
公式表示為:
其中, 是核函數,它的作用是將輸入特征映射到高維空間。 和 是模型參數,通過(guò)訓練得到。
咱們再來(lái)舉一個(gè)例子:
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np
# 生成樣本數據
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
# 創(chuàng )建核函數支持向量機模型
model = svm.SVC(kernel='rbf')
# 擬合數據
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)格來(lái)評估模型
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()
上述代碼首先使用樣本數據訓練一個(gè)核函數支持向量機模型,然后通過(guò)繪制決策邊界和支持向量的方式可視化分類(lèi)結果。決策邊界是用實(shí)線(xiàn)表示的,支持向量是用空心圓點(diǎn)表示的。

當我們使用稀疏支持向量機來(lái)解決一個(gè)分類(lèi)問(wèn)題時(shí),我們希望找到一個(gè)超平面,能夠將不同類(lèi)別的數據點(diǎn)有效地分開(kāi)。
稀疏支持向量機通常用于處理大規模數據集或高維特征的分類(lèi)問(wèn)題。例如,在醫學(xué)圖像識別中,當需要處理數百萬(wàn)個(gè)像素的圖像數據時(shí),稀疏支持向量機可以高效地分類(lèi);在自然語(yǔ)言處理中,當需要處理大量文本特征時(shí),該算法也能發(fā)揮作用。
給定訓練數據集 ,其中 是輸入特征向量, 是對應的類(lèi)別標簽。
稀疏支持向量機的目標是找到一個(gè)超平面,使得盡可能多的訓練數據點(diǎn)離該超平面的距離最大化。
公式表示為:
其中, 是關(guān)于訓練數據點(diǎn)的權重系數, 是對應數據點(diǎn)的類(lèi)別(1代表正類(lèi),-1代表負類(lèi)), 是核函數,用于計算數據點(diǎn)和之間的相似度。
舉一個(gè)關(guān)于稀疏支持向量機的例子,大家只要安裝了相應的包即可直接運行起來(lái):
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np
# 生成樣本數據
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')
# 擬合數據
model.fit(X, y)
# 繪制數據點(diǎn)
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()
上述代碼使用給定的樣本數據訓練一個(gè)稀疏支持向量機模型,并繪制數據點(diǎn)、超平面以及支持向量。
超平面由w和b參數定義,支持向量表示離超平面最近的數據點(diǎn)。

核貝葉斯支持向量機通過(guò)學(xué)習一些已知的例子,并找到一個(gè)特殊的邊界,用于將不同的事物區分開(kāi)來(lái)。
核貝葉斯支持向量機可以應用于很多現實(shí)生活中的問(wèn)題。例如:
1、郵件分類(lèi):將電子郵件自動(dòng)分為垃圾郵件和非垃圾郵件。
2、圖像識別:判斷圖像中是貓還是狗。
3、情感分析:自動(dòng)判斷文本評論是正面還是負面情感。
核貝葉斯支持向量機的公式可以簡(jiǎn)化為以下形式:
在這個(gè)公式中,代表我們要進(jìn)行分類(lèi)的事物。 是與樣本數據相關(guān)的權重, 是每個(gè)樣本數據對應的類(lèi)別標簽(例如,1代表一類(lèi)事物,-1代表另一類(lèi)事物)。
舉個(gè) Python 的例子
import numpy as np
import plotly.graph_objects as go
from sklearn.svm import SVC
# 生成示例數據
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')
# 擬合數據
model.fit(X, y)
# 繪制數據點(diǎn)
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()
上述代碼使用示例數據訓練了一個(gè)核貝葉斯支持向量機模型,并利用 Plotly 生成了直觀(guān)的一個(gè)三維圖像。

不平衡類(lèi)別支持向量機是一種分類(lèi)算法,它使用支持向量機的思想來(lái)處理不平衡類(lèi)別數據集。
它的目標是通過(guò)調整決策邊界,使得分類(lèi)模型能夠更好地識別少數類(lèi)別,并提高整體分類(lèi)準確率。
不平衡類(lèi)別支持向量機常用于以下場(chǎng)景:
不平衡類(lèi)別支持向量機的目標是最小化以下公式:
其中,是決策邊界的權重向量,是偏置項,是懲罰參數,是松弛變量。
下面是一個(gè)簡(jiǎn)單的使用不平衡類(lèi)別支持向量機進(jìn)行分類(lèi)的示例代碼:
import numpy as np
from sklearn.svm import SVC
import plotly.graph_objects as go
# 創(chuàng )建訓練數據
X = np.array([[3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([0, 0, 1, 1])
# 創(chuàng )建不平衡類(lèi)別支持向量機模型
model = SVC(class_weight='balanced')
# 擬合模型
model.fit(X, y)
# 生成網(wǎng)格點(diǎn)用于繪制決策邊界
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 類(lèi)來(lái)創(chuàng )建不平衡類(lèi)別支持向量機模型,并使用plotly庫繪制三維圖來(lái)展示決策邊界。在訓練數據中,我們有兩個(gè)特征和兩個(gè)類(lèi)別。通過(guò)擬合模型并預測網(wǎng)格點(diǎn)上的分類(lèi)結果,我們可以得到?jīng)Q策邊界,并將其可視化。

聯(lián)系客服