#encoding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
import argparse
import random
import numpy as np
from sklearn.svm import SVC #从sklearn中导入SVM
from sklearn.datasets import *
from sklearn.model_selection import train_test_split
from loguru import logger
from sklearn import svm
‘’’
--------获取数据--------
‘’’
X,y = make_blobs(n_samples=1000,centers=2,random_state=8) #make_blobs生成聚类模型数据,随机生成2类数据,一共含1000个样本
“”"
--------训练SVM模型--------
kernel=‘linear’ 核函数选择Linear核,主要用于线性可分的情形。参数少,速度快。
C=1000 惩罚参数,C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
“”"
clf = svm.SVC(kernel=‘linear’,C=1000) #SVC时SVM的一种Type,是用来做分类的
clf.fit(X,y) #输入模型数据,进行训练
print(“模型参数W:”,clf.coef_) #模型参数W
print(“模型参数b:”,clf.intercept_) #模型参数b
print(“支持向量为:”,clf.support_vectors_) #输出支持向量
xpredict = [1,1]
xpredict = np.array(xpredict).reshape(1,-1) #使用numpy将矩阵变为一行一列的列向量
print(xpredict,“预测为:”,clf.predict(xpredict),“类别”)#输出标签
xpredict = [10,10]
xpredict = np.array(xpredict).reshape(1,-1) #使用numpy将矩阵变为一行一列的列向量
print(xpredict,“预测为:”,clf.predict(xpredict),“类别”)#输出标签
“”"
--------可视化部分--------
“”"
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Paired) #X[:,0]就是取所有行的第0个数据, X[:,1] 就是取所有行的第1个数据。
#绘制SVM决策函数
a_x = plt.gca()
xlim = a_x.get_xlim() #获取X轴的范围
ylim = a_x.get_ylim() #获取Y轴的范围
#创建坐标方格以评估模型
xx = np.linspace(xlim[0],xlim[1],500) # 返回500个均匀分布的样本,在[xlim[0],xlim[1]]范围内
yy = np.linspace(ylim[0],ylim[1],500)
YY,XX = np.meshgrid(yy,xx)
xy = np.vstack([XX.ravel(),YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
#绘出支持向量的分割界和分割面(二维分割面为直线)
a_x.contour(XX,YY,Z,colors=‘k’,levels=[-1,0,1],alpha=0.6,linestyles=[’–’,’-’,’–’])
#绘出支持向量,用红色表示
a_x.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],linewidth=1,facecolors=‘red’)
plt.show() #将结果可视化输出`