Python 西瓜书 使用数据集3.0α线性核和高斯核训练SVM+散点图可视化

西瓜数据集3.0α

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
import pandas as pd
from sklearn.metrics import accuracy_score#返回正确的比例
from sklearn.preprocessing import LabelEncoder

plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.close('all')

def main():
#1.获取x,y
    data = pd.read_table('watermelon30a.txt',delimiter=',')    
    x = pd.DataFrame({'密度':data['密度'],'含糖率':data['含糖率']})
    x = x.values.tolist()    
    encoder = LabelEncoder()#将好瓜坏瓜映射为1/0
    y = encoder.fit_transform(data['好瓜']).tolist()
    x,y = np.array(x),np.array(y)    
#2.1.线性核    
    linear_svm = svm.SVC(C=0.5, #惩罚参数
            kernel='linear')
    linear_svm.fit(x,y)
    y_pred = linear_svm.predict(x)
    print('**linear_svm的准确率**: %s' %(accuracy_score(y_pred=y_pred, y_true=y)))    
##2.2.高斯核
    gauss_svm = svm.SVC(C=0.5,
                        kernel='rbf')
    gauss_svm.fit(x,y)
    y_pred2 = gauss_svm.predict(x)
    print('**gauss_svm的准确率**: %s' %(accuracy_score(y_pred=y_pred2, y_true=y)))   
    class_method = {'线性核':linear_svm,'高斯核':gauss_svm}
    visual(data,class_method)

##数据特征可视化
def visual(data,class_method):
    colormap = dict(zip(data['好瓜'].value_counts().index.tolist(),['blue','green']))#坏瓜好瓜颜色
    die = data.groupby('好瓜')    
    plt.figure()
    for species,klass in die:
        plt.scatter(klass['密度'],klass['含糖率'],
                    color = colormap[species],
                    label = species
                    )
    for name,model in class_method.items():
        sv = model.support_vectors_
        plt.plot(sv[:,0],sv[:,1],label=str(name)+'_supported_vector')    
    plt.legend(frameon=True, title='好瓜',loc="upper left")    
    plt.title('SVC')
    plt.show()
    
if __name__=="__main__":
    main()
    

结果表明,使用线性核和高斯训练核的支持向量实际是一样的(两条线重合):

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要下载西瓜数据集3.0α并安装LIBSVDL库。 然后,我们可以使用以下代码来加载数据集并将其分成训练集和测试集: ```python import numpy as np import svdL data = np.loadtxt('watermelon_3.0α.txt', delimiter='\t') X = data[:, 1:3] # features y = data[:, 3] # labels # normalize features X = (X - np.mean(X, axis=0)) / np.std(X, axis=0) # split data into train and test sets train_X, train_y = X[:10], y[:10] test_X, test_y = X[10:], y[10:] ``` 接下来,我们可以使用LIBSVDL库来训练一个线性SVM模型: ```python # train linear kernel SVM svm = svdL.SVM(kernel='linear', C=1) svm.train(train_X, train_y) # predict test set labels pred_y = svm.predict(test_X) # print support vectors print('Support vectors for linear kernel SVM:') print(svm.get_support_vectors()) ``` 同样,我们可以使用以下代码来训练一个高斯SVM模型: ```python # train Gaussian kernel SVM svm = svdL.SVM(kernel='rbf', C=1, gamma=0.1) svm.train(train_X, train_y) # predict test set labels pred_y = svm.predict(test_X) # print support vectors print('Support vectors for Gaussian kernel SVM:') print(svm.get_support_vectors()) ``` 在训练完两个模型后,我们可以比较它们的支持向量。支持向量是SVM模型中起关键作用的数据点,它们决定了模型的边界。通常情况下,高斯SVM模型的支持向量数会比线性SVM模型的支持向量数要多,因为高斯SVM模型可以更好地处理非线性问题。 通过打印支持向量,我们可以看到两个模型的支持向量数量和位置的差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值