SVM算法html
這裏簡單介紹下SVR:https://scikit-learn.org/stable/modules/svm.html#svm-regression算法
Ref: 支持向量機 svc svr svm網絡
感受不是很好的樣子,沒有 Bayesian Linear Regression的效果好;但其實也是取決於「核」的選取。dom
print(__doc__) import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt # ############################################################################# # Generate sample data X = np.sort(5 * np.random.rand(40, 1), axis=0) y = np.sin(X).ravel() # ############################################################################# # Add noise to targets y[::5] += 3 * (0.5 - np.random.rand(8)) # ############################################################################# # Fit regression model svr_rbf = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=.1) svr_lin = SVR(kernel='linear', C=100, gamma='auto') svr_poly = SVR(kernel='poly', C=100, gamma='auto', degree=3, epsilon=.1, coef0=1) # ############################################################################# # Look at the results lw = 2 svrs = [svr_rbf, svr_lin, svr_poly] kernel_label = ['RBF', 'Linear', 'Polynomial'] model_color = ['m', 'c', 'g'] fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 10), sharey=True) for ix, svr in enumerate(svrs): axes[ix].plot(X, svr.fit(X, y).predict(X), color=model_color[ix], lw=lw, label='{} model'.format(kernel_label[ix])) axes[ix].scatter(X[svr.support_], y[svr.support_], facecolor="none", edgecolor=model_color[ix], s=50, label='{} support vectors'.format(kernel_label[ix])) axes[ix].scatter(X[np.setdiff1d(np.arange(len(X)), svr.support_)], y[np.setdiff1d(np.arange(len(X)), svr.support_)], facecolor="none", edgecolor="k", s=50, label='other training data') axes[ix].legend(loc='upper center', bbox_to_anchor=(0.5, 1.1), ncol=1, fancybox=True, shadow=True) fig.text(0.5, 0.04, 'data', ha='center', va='center') fig.text(0.06, 0.5, 'target', ha='center', va='center', rotation='vertical') fig.suptitle("Support Vector Regression", fontsize=14) plt.show()
可見,RBF有了徑向基中「貝葉斯機率」的特性,跟容易找到數據趨勢的主體。機器學習
Ref: SVM: 實際中使用SVM的一些問題函數
若是features的範圍差異不大。post
若是features的範圍差異很大,在執行kernel以前要使用feature scaling。學習
咱們最經常使用的是 高斯kernel 和 linear kernel (即不使用kernel),可是須要注意的是否是任何類似度函數都是有效的核函數,它們(包括咱們常使用的高斯kernel)須要知足一個定理(默塞爾定理),這是由於SVM有不少數值優化技巧,爲了有效地求解參數Θ,須要類似度函數知足默塞爾定理,這樣才能確保SVM包可以使用優化的方法來求解參數Θ。優化
咱們將logistic regression的cost function進行了修改得出了SVM,那麼咱們在什麼狀況下應該使用什麼算法呢?url
【量少】若是咱們的features要比樣本數要大的話(如n=10000 (維度),m=10-1000 (樣本量)),咱們使用logistic regression或者linear kernel,由於在樣本較少的狀況下,咱們使用線性分類效果已經很好了,咱們沒有足夠多的樣原本支持咱們進行復雜的分類。
【適量】若是n(維度)較小,m(樣本量)大小適中的話,使用SVM with Gaussion kernel.如咱們以前講的有一個二維(n=2)的數據集,咱們可使用高斯核函數很好的將正負區分出來.
【量多】若是n(維度)較小,m(樣本量)很是龐大的話,會建立一些features,而後再使用logistic regeression 或者linear kernel。由於當m很是大的話,使用高斯核函數會較慢。
logistic regeression 與linear kernel是很是類似的算法,若是其中一個適合運行的話,那麼另外一個也頗有可能適合運行。
咱們使用高斯kernel的範圍很大,當m多達50000,n在1-1000(很常見的範圍),均可以使用SVM with 高斯kernel,能夠解決不少logistic regression不能解決的問題。
神經網絡在任何狀況下都適用,可是有一個缺點是它訓練起來比較慢,相對於SVM來講
SVM求的不是局部最優解,而是全局最優解
相對於使用哪一種算法來講,咱們更重要的是
這些都比是使用SVM仍是logistic regression重要。
可是SVM是一種被普遍使用的算法,而且在某個範圍內,它的效率很是高,是一種有效地學習複雜的非線性問題的學習算法。
logistic regression,神經網絡,SVM這三個學習算法使得咱們能夠解決不少前沿的機器學習問題。
End.