contourf参数 python_Python机器学习(六)
生活随笔
收集整理的這篇文章主要介紹了
contourf参数 python_Python机器学习(六)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
3.4 使用支持向量機最大化分類間隔
0 引子
支持向量機(SVM)可以看做感知器的拓展。感知器算法中,我們可以最小化分類誤差。而在SVM中,我們的優化目標是最大化分類間隔。此處間隔是指兩個分離的超平面的距離,而最靠近超平面的訓練樣本被稱作支持向量。1 對分類間隔最大化的直觀認識
其實就是確定了決策邊界的系數之后,移動決策邊界(超平面),使得平行的兩個超平面在保持依然為決策邊界的前提下,距離最大化。注:在實踐中,通過二次規劃的方法很容易得到我們想得到的最值。
2 使用松弛變量解決非線性可分問題
- 原因
- SVM與logistic回歸
logistic回歸會盡量最大化訓練數據集的條件似然,這使得它比支持向量機更易于處理離群點;
logistic回歸模型簡單更容易實現;
logistic回歸模型更新方便,當應用于流數據分析時,這是非常具備吸引力的。
SVM優點:
支持向量機更關注接近決策邊界的點。
3 使用scikit-learn實現SVM
前面章節用到了scikit-learn中的Perception和LogisticRegression類,它們都使用了LIBINEAR庫,LIBLINEAR是高度優化的C/C++庫。類似的,用于訓練SVM模型的SVC類使用了LIBSV M庫。與使用原生python代碼實現線性分類器相比,使用 LIBLINEAR和LIBSVM庫實現由其優點:在用于大型數據時,可以獲得極高的訓練速度,然而有時候數據集很大導致沒辦法加載到內存中,針對這種情況,scikit-learn提供了SGDClassifier類供用戶選擇,這個類還通過partial_fit方法支持在線學習。SGDClassifier類背后的概念類似于第2章中實現的隨機梯度算法。我們可以使用默認參數以如下方式分別初始化基于隨機梯度下降的感知器、logistic回歸以及支持向量機模型。from sklearn.linear import SGDClassifier ppn = SGDClassifier(loss = 'perception') lr = SGDClassifier(loss='log') svm = SGDClassifier(loss='hinge')
3.5 使用核SVM解決非線性問題
0 引子
支持向量機可以很容易的使用“核技巧”來解決非線性可分問題。在討論SVM的基本概念之前,先通過一個例子來認識一下所謂的非線性可分問題到底是什么。1 例子
通過如下代碼,我們使用Numpy中的logical_xor函數創建了一個經過異或操作的數據集,其中100個樣本屬于類別1,另外的100個樣本屬于類別-1import numpy as np import matplotlib.pyplot as pltnp.random.seed(0) X_xor = np.random.randn(200, 2) y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0) y_xor = np.where(y_xor, 1, -1)plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1') plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1') plt.ylim(-3.0) plt.legend() plt.show()執行上述代碼可以得到一個異或數據集,其圖像為:圖1顯然通過之前的SVM和logistic回歸模型是不能把它線性分類的,從圖里面也看不出明顯的線性決策邊界。而核方法處理此類非線性可分數據的基本理念就是:通過映射函數 把樣本的原始特征映射到一個使樣本線性可分的更高維空間中。
就這里例子來說,我們可以將二維數據集通過下列映射轉換到新的三維特征空間中,從而使樣本可分。
這使的我們可以將圖中的兩個類別通過線性超平面進行分割。然后如果我們把此超平面映射會原始特征空間,則可先行分割兩類數據的超平面就變成非線性的了。
2 使用背景
為了使用SVM解決非線性問題,我們通過一個映射函數將訓練數據映射到更高維度的特征空間,并在新的特征空間上訓練一個線性SVM模型。然后將同樣的映射函數應用于新的、未知數據上。進而使用新特征空間上的線性SVM模型對其進行分類。但是這種思路是有問題的。
構建新的特征空間帶來非常大的計算成本,特別是在處理高維數據的時候。這是就用到了我們稱作核技巧的方法。
3 使用
下面使用核技巧來對之前給的異或數據來進行分類。import numpy as np import matplotlib.pyplot as plt from sklearn.svm import SVC from matplotlib.colors import ListedColormapdef plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):# setup marker generator and color mapmarkers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])# plot the decision surfacex1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1# 生成兩個個二維的矩陣xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) # .T是求轉置Z = Z.reshape(xx1.shape)plt.contourf(xx1, xx2, Z, alpha = 0.4, cmap = cmap)plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())# plot all samplesX_test, y_test = X[test_idx, :], y[test_idx]for idx, c1 in enumerate(np.unique(y)):plt.scatter(x=X[y == c1, 0], y =X[y == c1, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=c1)# highlight test samplesif test_idx:X_test, y_test = X[test_idx, :], y[test_idx]plt.scatter(X_test[:, 0], X_test[:, 1], c='', alpha=1.0, linewidth=1, marker='o', s=55, label='test set')np.random.seed(0) X_xor = np.random.randn(200, 2) y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0) y_xor = np.where(y_xor, 1, -1)plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1') plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1') plt.ylim(-3.0) plt.legend() plt.show()svm = SVC(kernel='rbf', random_state=0, gamma=0.10, C=10.0) svm.fit(X_xor, y_xor) plot_decision_regions(X_xor, y_xor, classifier=svm) plt.legend(loc='upper left') plt.show()其中svm中gamma的值會影響圖像的擬合程度。越大擬合的越好。 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的contourf参数 python_Python机器学习(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c51汇编语言如何定义全局变量_汇编语言
- 下一篇: 国家自科委管文科学部认定的国内30种重要