1 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
SVM:最大邊距分類器
每次得到相同的 SVM 模型的原因是因?yàn)?SVM 是最大邊距分類器,或者換句話說,它們最大化分離 +ve 和 -ve 類的邊距。因此,無論您運(yùn)行它的任何隨機(jī)狀態(tài)如何,它最終都會(huì)找到與 +ve 類和 -ve 類的邊距最大的超平面。
其他非最大邊際分類器(例如簡(jiǎn)單的感知器)試圖最小化損失,您可以將簡(jiǎn)單損失視為錯(cuò)誤分類的數(shù)據(jù)點(diǎn)數(shù)量。我們通常使用其他類型的(可微分的)損失函數(shù),它們對(duì)應(yīng)于模型預(yù)測(cè)的可信度。
例子
感知器
X = np.r_[np.random.randn(10, 2) - [2, 2], np.random.randn(10, 2) + [2, 2]]
y = [0] * 10 + [1] * 10
def plot_it(clf, X):
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.RdBu, alpha=.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xticks([])
plt.yticks([])
plt.close('all')
plt.figure()
seeds = [0,10,20,30,40,50]
for i in range(1,7):
plt.subplot(2,3,i)
clf = Perceptron(random_state=seeds[i-1])
clf.fit(X,y)
plot_it(clf, X)
plt.tight_layout()
plt.show()
上圖顯示了具有不同種子(初始化)的感知器識(shí)別的決策邊界。正如您所看到的,所有模型都正確地對(duì)數(shù)據(jù)點(diǎn)進(jìn)行了分類,但哪個(gè)模型最好?當(dāng)然,這對(duì)看不見的數(shù)據(jù)進(jìn)行了概括,這將是在決策邊界周圍具有足夠余量以覆蓋看不見的數(shù)據(jù)的數(shù)據(jù)。這就是 SVM 過度救援的地方。
支持向量機(jī)
plt.close('all')
plt.figure()
seeds = [0,10,20,30,40,50]
for i in range(1,7):
plt.subplot(2,3,i)
clf = LinearSVC(random_state=seeds[i-1])
clf.fit(X,y)
plot_it(clf, X)
plt.tight_layout()
plt.show()
正如您所看到的,無論隨機(jī)種子如何,SVM 始終返回相同的決策邊界,即最大化邊際的決策邊界。
使用 RNN,您每次都會(huì)得到不同的模型,因?yàn)?RNN 不是最大邊距分類器。此外,RNN 收斂標(biāo)準(zhǔn)是手動(dòng)的,即我們決定何時(shí)停止訓(xùn)練過程,如果我們決定在固定數(shù)量的時(shí)期運(yùn)行它,那么根據(jù)權(quán)重初始化,模型的最終權(quán)重會(huì)有所不同。
LSTM
import torch
from torch import nn
from torch import optim
def plot_rnn(lstm, X):
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
p = np.c_[xx.ravel(), yy.ravel()]
xt = torch.FloatTensor(p.reshape(-1,1,2).transpose(1, 0, 2))
s = nn.Sigmoid()
Z,_ = lstm(xt)
Z = s(Z.view(len(p)))
Z = Z.detach().numpy().reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.RdBu, alpha=.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xticks([])
plt.yticks([])
def train(X, y):
batch_size = 20
input_size = 2
time_steps = 1
output_size = 1
xt = torch.FloatTensor(X.reshape(batch_size,time_steps,input_size).transpose(1, 0, 2))
yt = torch.FloatTensor(y)
lstm = nn.LSTM(input_size, output_size, 1)
s = nn.Sigmoid()
loss_function = nn.BCELoss()
optimizer = optim.SGD(lstm.parameters(), lr=0.05)
for i in range(1000):
lstm.zero_grad()
y_hat,_ = lstm(xt)
y_hat = y_hat.view(20)
y_hat = s(y_hat)
loss = loss_function(y_hat, yt)
loss.backward()
optimizer.step()
#print (loss.data)
return lstm
plt.close('all')
plt.figure()
for i in range(1,7):
plt.subplot(2,3,i)
clf = train(X,y)
plot_rnn(clf, X)
plt.tight_layout()
plt.show()
添加回答
舉報(bào)