国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中使用支持向量機(SVM)算法

2020-02-16 11:19:07
字體:
來源:轉載
供稿:網友

在機器學習領域,支持向量機SVM(Support Vector Machine)是一個有監督的學習模型,通常用來進行模式識別、分類(異常值檢測)以及回歸分析。

其具有以下特征:

   (1)SVM可以表示為凸優化問題,因此可以利用已知的有效算法發現目標函數的全局最小值。而其他分類方法都采用一種基于貪心學習的策略來搜索假設空間,這種方法一般只能獲得局部最優解。
  (2) SVM通過最大化決策邊界的邊緣來實現控制模型的能力。盡管如此,用戶必須提供其他參數,如使用核函數類型和引入松弛變量等。
  (3)SVM一般只能用在二類問題,對于多類問題效果不好。

1. 下面是代碼及詳細解釋(基于sklearn包):

from sklearn import svmimport numpy as npimport matplotlib.pyplot as plt#準備訓練樣本x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]y=[1,1,-1,-1,1,-1,-1,1]##開始訓練clf=svm.SVC() ##默認參數:kernel='rbf'clf.fit(x,y)#print("預測...")#res=clf.predict([[2,2]]) ##兩個方括號表面傳入的參數是矩陣而不是list##根據訓練出的模型繪制樣本點for i in x:  res=clf.predict(np.array(i).reshape(1, -1))  if res > 0:    plt.scatter(i[0],i[1],c='r',marker='*')  else :    plt.scatter(i[0],i[1],c='g',marker='*')##生成隨機實驗數據(15行2列)rdm_arr=np.random.randint(1, 15, size=(15,2))##回執實驗數據點for i in rdm_arr:  res=clf.predict(np.array(i).reshape(1, -1))  if res > 0:    plt.scatter(i[0],i[1],c='r',marker='.')  else :    plt.scatter(i[0],i[1],c='g',marker='.')##顯示繪圖結果plt.show()

結果如下圖:

從圖上可以看出,數據明顯被藍色分割線分成了兩類。但是紅色箭頭標示的點例外,所以這也起到了檢測異常值的作用。

2.在上面的代碼中提到了kernel='rbf',這個參數是SVM的核心:核函數

重新整理后的代碼如下:      

from sklearn import svmimport numpy as npimport matplotlib.pyplot as plt##設置子圖數量fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(7,7))ax0, ax1, ax2, ax3 = axes.flatten()#準備訓練樣本x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]y=[1,1,-1,-1,1,-1,-1,1]'''  說明1:    核函數(這里簡單介紹了sklearn中svm的四個核函數,還有precomputed及自定義的)      LinearSVC:主要用于線性可分的情形。參數少,速度快,對于一般數據,分類效果已經很理想  RBF:主要用于線性不可分的情形。參數多,分類結果非常依賴于參數  polynomial:多項式函數,degree 表示多項式的程度-----支持非線性分類  Sigmoid:在生物學中常見的S型的函數,也稱為S型生長曲線  說明2:根據設置的參數不同,得出的分類結果及顯示結果也會不同  '''##設置子圖的標題titles = ['LinearSVC (linear kernel)',      'SVC with polynomial (degree 3) kernel',      'SVC with RBF kernel',   ##這個是默認的     'SVC with Sigmoid kernel']##生成隨機試驗數據(15行2列)rdm_arr=np.random.randint(1, 15, size=(15,2))def drawPoint(ax,clf,tn):  ##繪制樣本點  for i in x:    ax.set_title(titles[tn])    res=clf.predict(np.array(i).reshape(1, -1))    if res > 0:      ax.scatter(i[0],i[1],c='r',marker='*')    else :      ax.scatter(i[0],i[1],c='g',marker='*')   ##繪制實驗點  for i in rdm_arr:    res=clf.predict(np.array(i).reshape(1, -1))    if res > 0:      ax.scatter(i[0],i[1],c='r',marker='.')    else :      ax.scatter(i[0],i[1],c='g',marker='.')if __name__=="__main__":  ##選擇核函數  for n in range(0,4):    if n==0:      clf = svm.SVC(kernel='linear').fit(x, y)      drawPoint(ax0,clf,0)    elif n==1:      clf = svm.SVC(kernel='poly', degree=3).fit(x, y)      drawPoint(ax1,clf,1)    elif n==2:      clf= svm.SVC(kernel='rbf').fit(x, y)      drawPoint(ax2,clf,2)    else :      clf= svm.SVC(kernel='sigmoid').fit(x, y)      drawPoint(ax3,clf,3)  plt.show()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桃江县| 建宁县| 肥东县| 克拉玛依市| 和龙市| 宁明县| 北宁市| 册亨县| 商都县| 临清市| 长乐市| 辽中县| 济源市| 八宿县| 师宗县| 类乌齐县| 建水县| 莱阳市| 宝清县| 陇南市| 土默特左旗| 夏邑县| 嘉祥县| 五华县| 简阳市| 维西| 无棣县| 衡阳市| 平武县| 宝坻区| 湖口县| 鹤庆县| 新乡市| 明水县| 洛川县| 铁岭市| 佛山市| 疏勒县| 青田县| 盖州市| 永和县|