Skip to content

Latest commit

 

History

History
233 lines (192 loc) · 4.74 KB

07-01 支援向量機-線性分割.md

File metadata and controls

233 lines (192 loc) · 4.74 KB

07-01 支援向量機-線性分割

執行結果:

GitHub Logo

(1)main.py

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm

#----------------------------------
# 載入資料
#----------------------------------
def loadDataSet(fileName):
    dataMat=[]
    labelMat=[]
 
    fr=open(fileName)
 
    for line in fr.readlines():
        lineArr=line.strip().split('\t')
        data1=float(lineArr[0])
        data2=float(lineArr[1])
        label=int(lineArr[2])
		
        dataMat.append([data1, data2])
        labelMat.append(label)
 
    return dataMat, labelMat


#----------------------------------
#訓練資料個數(總資料100個)
#----------------------------------
numOfTraining=100	
	
	
#----------------------------------	
# 載入資料	
#----------------------------------
dataArr, labelArr=loadDataSet('testSet-linearSeparable.txt')
	
# 將list轉成ndarray, 方便切分為訓練及測試兩區段
dataND=np.array(dataArr)
dataND=dataND.astype(float)
labelND=np.array(labelArr)
labelND=labelND.astype(int)

# 訓練資料
X=dataND[0:numOfTraining,]

# 訓練資料的標籤
Y=labelND[0:numOfTraining]


#----------------------------------	
# 建立分類模型
#----------------------------------
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)

# 計算分隔 hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-2, 10)
yy = a * xx - (clf.intercept_[0]) / w[1]

# 計算穿過 support vectors 的邊界
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])

b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])


#==========================================
# 繪圖
#==========================================
import matplotlib.pyplot as plt


#---------------------------
# 繪圖
#---------------------------
fig = plt.figure()

# 設定字型及大小
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['font.size'] = 14

# 設定圖標題
plt.title('Title')

# 設定x軸及y軸標題
plt.xlabel('x')
plt.ylabel('y')

# 資料表內的grid
plt.grid(True)

# 設定x軸及y軸的尺規範圍
plt.axis([-2, 12, -10, 10])

# 繪製資料
plt.plot(dataND[labelND==1,0], dataND[labelND==1,1], 'ys')      #標籤為1
plt.plot(dataND[labelND==-1,0], dataND[labelND==-1,1], 'c^')    #標籤為-1

# 繪製 hyperplane 及穿過 support vectors 的邊界
plt.plot(xx, yy, 'k-')
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')

# 繪製 support vectors
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='r')

#---------------------------
# 儲存圖檔
#---------------------------
fig.savefig('graph.png')                     

(2)testSet-linearSeparable.txt

3.542485	1.977398	-1
3.018896	2.556416	-1
7.551510	-1.580030	1
2.114999	-0.004466	-1
8.127113	1.274372	1
7.108772	-0.986906	1
8.610639	2.046708	1
2.326297	0.265213	-1
3.634009	1.730537	-1
0.341367	-0.894998	-1
3.125951	0.293251	-1
2.123252	-0.783563	-1
0.887835	-2.797792	-1
7.139979	-2.329896	1
1.696414	-1.212496	-1
8.117032	0.623493	1
8.497162	-0.266649	1
4.658191	3.507396	-1
8.197181	1.545132	1
1.208047	0.213100	-1
1.928486	-0.321870	-1
2.175808	-0.014527	-1
7.886608	0.461755	1
3.223038	-0.552392	-1
3.628502	2.190585	-1
7.407860	-0.121961	1
7.286357	0.251077	1
2.301095	-0.533988	-1
-0.232542	-0.547690	-1
3.457096	-0.082216	-1
3.023938	-0.057392	-1
8.015003	0.885325	1
8.991748	0.923154	1
7.916831	-1.781735	1
7.616862	-0.217958	1
2.450939	0.744967	-1
7.270337	-2.507834	1
1.749721	-0.961902	-1
1.803111	-0.176349	-1
8.804461	3.044301	1
1.231257	-0.568573	-1
2.074915	1.410550	-1
-0.743036	-1.736103	-1
3.536555	3.964960	-1
8.410143	0.025606	1
7.382988	-0.478764	1
6.960661	-0.245353	1
8.234460	0.701868	1
8.168618	-0.903835	1
1.534187	-0.622492	-1
9.229518	2.066088	1
7.886242	0.191813	1
2.893743	-1.643468	-1
1.870457	-1.040420	-1
5.286862	-2.358286	1
6.080573	0.418886	1
2.544314	1.714165	-1
6.016004	-3.753712	1
0.926310	-0.564359	-1
0.870296	-0.109952	-1
2.369345	1.375695	-1
1.363782	-0.254082	-1
7.279460	-0.189572	1
1.896005	0.515080	-1
8.102154	-0.603875	1
2.529893	0.662657	-1
1.963874	-0.365233	-1
8.132048	0.785914	1
8.245938	0.372366	1
6.543888	0.433164	1
-0.236713	-5.766721	-1
8.112593	0.295839	1
9.803425	1.495167	1
1.497407	-0.552916	-1
1.336267	-1.632889	-1
9.205805	-0.586480	1
1.966279	-1.840439	-1
8.398012	1.584918	1
7.239953	-1.764292	1
7.556201	0.241185	1
9.015509	0.345019	1
8.266085	-0.230977	1
8.545620	2.788799	1
9.295969	1.346332	1
2.404234	0.570278	-1
2.037772	0.021919	-1
1.727631	-0.453143	-1
1.979395	-0.050773	-1
8.092288	-1.372433	1
1.667645	0.239204	-1
9.854303	1.365116	1
7.921057	-1.327587	1
8.500757	1.492372	1
1.339746	-0.291183	-1
3.107511	0.758367	-1
2.609525	0.902979	-1
3.263585	1.367898	-1
2.912122	-0.202359	-1
1.731786	0.589096	-1
2.387003	1.573131	-1