# -*- coding: utf-8 -*-
"""created on fri nov 30 21:05:40 2018
@author: muli
"""import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,cross_validation,svm
def load_data_classfication():
'''載入用於分類問題的資料集
:return: 乙個元組,用於分類問題。元組元素依次為:訓練樣本集、測試樣本集、訓練樣本集對應的標記、測試樣本集對應的標記
'''iris=datasets.load_iris() # 使用 scikit-learn 自帶的 iris 資料集
x_train=iris.data
y_train=iris.target
return cross_validation.train_test_split(x_train, y_train,test_size=0.25,
random_state=0,stratify=y_train) # 分層取樣拆分成訓練集和測試集,測試集大小為原始資料集大小的 1/4
def test_linearsvc(*data):
'''測試 linearsvc 的用法
:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記
:return: none
'''x_train,x_test,y_train,y_test=data
cls=svm.linearsvc()
cls.fit(x_train,y_train)
print('coefficients:%s'%cls.coef_,)
print("------------")
print('intercept %s'%cls.intercept_)
print('score: %.2f' % cls.score(x_test, y_test))
def test_linearsvc_loss(*data):
'''測試 linearsvc 的**效能隨損失函式的影響
:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記
:return: none
'''x_train,x_test,y_train,y_test=data
losses=['hinge','squared_hinge']
for loss in losses:
cls=svm.linearsvc(loss=loss)
cls.fit(x_train,y_train)
print("loss:%s"%loss)
print('coefficients:%s, intercept %s'%(cls.coef_,cls.intercept_))
print('score: %.2f' % cls.score(x_test, y_test))
print("---------------")
def test_linearsvc_l12(*data):
'''測試 linearsvc 的**效能隨正則化形式的影響
:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記
:return: none
'''x_train,x_test,y_train,y_test=data
l12=['l1','l2']
for p in l12:
cls=svm.linearsvc(penalty=p,dual=false)
cls.fit(x_train,y_train)
print("penalty:%s"%p)
print('coefficients:%s, intercept %s'%(cls.coef_,cls.intercept_))
print('score: %.2f' % cls.score(x_test, y_test))
print("*****************")
def test_linearsvc_c(*data):
'''測試 linearsvc 的**效能隨引數 c 的影響
:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記
:return: none
'''x_train,x_test,y_train,y_test=data
cs=np.logspace(-2,1)
train_scores=
test_scores=
for c in cs:
cls=svm.linearsvc(c=c)
cls.fit(x_train,y_train)
## 繪圖
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(cs,train_scores,label="traing score")
ax.plot(cs,test_scores,label="testing score")
ax.set_xlabel(r"c")
ax.set_ylabel(r"score")
ax.set_xscale('log')
ax.set_title("linearsvc")
ax.legend(loc='best')
# 設定 x 軸的網格線,風格為 點畫線
plt.grid(axis='x',linestyle='-.')
plt.show()
if __name__=="__main__":
x_train,x_test,y_train,y_test=load_data_classfication() # 生成用於分類的資料集
# test_linearsvc(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc
# test_linearsvc_loss(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc_loss
# test_linearsvc_l12(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc_l12
test_linearsvc_c(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc_c
機器學習之SVM多分類
以下內容參考 王正海 基於決策樹多分類支援向量機岩性波譜分類 svm本身是應用於二分類的,所以在處理多分類並且想應用svm有必要進行改進svm如果直接在目標函式上進行修改的話,就是將多個分類面的引數合併到乙個最優化問題上,顯然難度太大。但是對於lr的話,可以直接拓展為softmax多分類。常見的方法...
機器學習演算法之SVM的多分類
一 svm可以直接進行多分類嗎 svm本身是對付二分類問題的,所以在處理多分類的時候需要進行必要的改造。同樣是二分類的情況,logistic回歸可以直接拓展為softmax多分類。但是svm如果直接在目標函式上進行修改的話,就是將多個分類面的引數求解合併到乙個最優化問題上,顯然難度太大,目前也沒有任...
機器學習之SVM
支援向量機是一種二類分類模型。在介紹svm之前,需要先了解支援向量這一概念,支援向量是訓練樣本的乙個子集,這一子集是二類分類的決策邊界。在二類分類過程中,可能存在無數個能夠正確分離二類資料的超平面,如圖1所示。但是不是所有的超平面都在未知資料上執行的都很好,例如圖2中的超平面b 1 就比超平面b 2...