1.线性可分支持向量机

python 支持向量机回归的核函数 支持向量机做回归代码_机器学习

题目

python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_02


python 支持向量机回归的核函数 支持向量机做回归代码_python 支持向量机回归的核函数_03

python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_04


python 支持向量机回归的核函数 支持向量机做回归代码_python_05


python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_06

2.线性支持向量机

python 支持向量机回归的核函数 支持向量机做回归代码_python 支持向量机回归的核函数_07

import pandas as pd
#获取训练数据
train_data = pd.read_csv('./step1/train_data.csv')
#获取训练标签
train_label = pd.read_csv('./step1/train_label.csv')
train_label = train_label['target']
#获取测试数据
test_data = pd.read_csv('./step1/test_data.csv')

数据集中部分数据与标签如下图所示:

python 支持向量机回归的核函数 支持向量机做回归代码_python 支持向量机回归的核函数_08


python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_09


python 支持向量机回归的核函数 支持向量机做回归代码_python_10

代码

#encoding=utf8
from sklearn.svm import LinearSVC

def linearsvc_predict(train_data,train_label,test_data):
    '''
    input:train_data(ndarray):训练数据
          train_label(ndarray):训练标签
    output:predict(ndarray):测试集预测标签
    '''
    #********* Begin *********# 
    clf = LinearSVC(dual=False)
    clf.fit(train_data,train_label)
    predict = clf.predict(test_data)
    #********* End *********# 
    return predict

3.非线性支持向量机

python 支持向量机回归的核函数 支持向量机做回归代码_数据_11


python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_12

python 支持向量机回归的核函数 支持向量机做回归代码_回归_13


数据获取代码:

#获取并处理鸢尾花数据
def create_data():
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['label'] = iris.target
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    data = np.array(df.iloc[:100, [0, 1, -1]])
    #将标签为0的数据标签改为-1
    for i in range(len(data)):
        if data[i,-1] == 0:
            data[i,-1] = -1
    return data[:,:2], data[:,-1]

python 支持向量机回归的核函数 支持向量机做回归代码_python_14

代码

#encoding=utf8
from sklearn.svm import SVC

def svc_predict(train_data,train_label,test_data,kernel):
    '''
    input:train_data(ndarray):训练数据
          train_label(ndarray):训练标签
          kernel(str):使用核函数类型:
              'linear':线性核函数
              'poly':多项式核函数
              'rbf':径像核函数/高斯核
    output:predict(ndarray):测试集预测标签
    '''
    #********* Begin *********# 
    clf = SVC(kernel=kernel)
    clf.fit(train_data,train_label)
    predict=clf.predict(test_data)
    #********* End *********# 
    return predict

4.序列最小优化算法

python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_15


python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_16


获取数据代码如下:

#获取数据
import pandas as pd
dataset = pd.read_csv('./step3/Social_Network_Ads.csv')
x = dataset.iloc[:, [2, 3]].values
x = x.astype(float)
y = dataset.iloc[:, 4].values
#将0替换为-1
for i in range(len(y)):
    if y[i]==0:
        y[i]=-1
from sklearn.model_selection import  train_test_split
train_data, test_data, train_label, test_label = train_test_split(x, y, test_size = 0.25, random_state = 61)
#特征标准化
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
train_data = sc.fit_transform(train_data)
test_data = sc.transform(test_data)

python 支持向量机回归的核函数 支持向量机做回归代码_python_17

代码

#encoding=utf8
import numpy as np
class smo:
    def __init__(self, max_iter=100, kernel='linear'):
        '''
        input:max_iter(int):最大训练轮数
              kernel(str):核函数,等于'linear'表示线性,等于'poly'表示多项式
        '''
        self.max_iter = max_iter
        self._kernel = kernel
    #初始化模型
    def init_args(self, features, labels):
        self.m, self.n = features.shape
        self.X = features
        self.Y = labels
        self.b = 0.0
        # 将Ei保存在一个列表里
        self.alpha = np.ones(self.m)
        self.E = [self._E(i) for i in range(self.m)]
        # 错误惩罚参数
        self.C = 1.0
    #********* Begin *********#    
    #kkt条件    
    def _KKT(self, i):
        y_g = self._g(i)*self.Y[i]
        if self.alpha[i] == 0:
            return y_g >= 1
        elif 0 < self.alpha[i] < self.C:
            return y_g == 1
        else:
            return y_g <= 1
    
    # g(x)预测值,输入xi(X[i])
    def _g(self, i):
        r = self.b
        for j in range(self.m):
            r += self.alpha[j]*self.Y[j]*self.kernel(self.X[i], self.X[j])
        return r
 
    # 核函数,多项式添加二次项即可
    def kernel(self, x1, x2):
        if self._kernel == 'linear':
            return sum([x1[k]*x2[k] for k in range(self.n)])
        elif self._kernel == 'poly':
            return (sum([x1[k]*x2[k] for k in range(self.n)]) + 1)**2    
        return 0

    # E(x)为g(x)对输入x的预测值和y的差
    def _E(self, i):
        return self._g(i) - self.Y[i]

    #初始alpha
    def _init_alpha(self):
        # 外层循环首先遍历所有满足0<a<C的样本点,检验是否满足KKT
        index_list = [i for i in range(self.m) if 0 < self.alpha[i] < self.C]
        # 否则遍历整个训练集
        non_satisfy_list = [i for i in range(self.m) if i not in index_list]
        index_list.extend(non_satisfy_list)
        for i in index_list:
            if self._KKT(i):
                continue
            E1 = self.E[i]
            # 如果E2是+,选择最小的;如果E2是负的,选择最大的
            if E1 >= 0:
                j = min(range(self.m), key=lambda x: self.E[x])
            else:
                j = max(range(self.m), key=lambda x: self.E[x])
            return i, j
    #选择alpha参数   
    def _compare(self, _alpha, L, H):
        if _alpha > H:
            return H
        elif _alpha < L:
            return L
        else:
            return _alpha

    #训练
    def fit(self, features, labels):
        '''
        input:features(ndarray):特征
              label(ndarray):标签
        '''
        self.init_args(features,labels)
        for t in range(self.max_iter):
            i1,i2 = self._init_alpha()
            #边界
            if self.Y[i1] == self.Y[i2]:
                L = max(0, self.alpha[i1]+self.alpha[i2]-self.C)
                H = min(self.C, self.alpha[i1]+self.alpha[i2])
            else:
                L = max(0, self.alpha[i2]-self.alpha[i1])
                H = min(self.C, self.C+self.alpha[i2]-self.alpha[i1])
            E1 = self.E[i1]
            E2 = self.E[i2]
            # eta=K11+K22-2K12
            eta = self.kernel(self.X[i1], self.X[i1]) + self.kernel(self.X[i2], self.X[i2]) - 2*self.kernel(self.X[i1], self.X[i2])
            if eta <= 0:
                continue
            alpha2_new_unc = self.alpha[i2] + self.Y[i2] * (E2 - E1) / eta
            alpha2_new = self._compare(alpha2_new_unc, L, H)
            alpha1_new = self.alpha[i1] + self.Y[i1] * self.Y[i2] * (self.alpha[i2] - alpha2_new)
            b1_new = -E1 - self.Y[i1] * self.kernel(self.X[i1], self.X[i1]) * (alpha1_new-self.alpha[i1]) - self.Y[i2] * self.kernel(self.X[i2], self.X[i1]) * (alpha2_new-self.alpha[i2])+ self.b 
            b2_new = -E2 - self.Y[i1] * self.kernel(self.X[i1], self.X[i2]) * (alpha1_new-self.alpha[i1]) - self.Y[i2] * self.kernel(self.X[i2], self.X[i2]) * (alpha2_new-self.alpha[i2])+ self.b 
            if 0 < alpha1_new < self.C:
                b_new = b1_new
            elif 0 < alpha2_new < self.C:
                b_new = b2_new
            else:
                # 选择中点
                b_new = (b1_new + b2_new) / 2
            # 更新参数
            self.alpha[i1] = alpha1_new
            self.alpha[i2] = alpha2_new
            self.b = b_new
            self.E[i1] = self._E(i1)
            self.E[i2] = self._E(i2) 
      
    def predict(self, data):
        '''
        input:data(ndarray):单个样本
        output:预测为正样本返回+1,负样本返回-1
        '''
        r = self.b
        for i in range(self.m):
            r += self.alpha[i] * self.Y[i] * self.kernel(data,self.X[i])
        return 1 if r>0 else -1
    #********* End *********#

5.支持向量回归

python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_18

import pandas as pd
#获取训练数据
train_data = pd.read_csv('./step1/train_data.csv')
#获取训练标签
train_label = pd.read_csv('./step1/train_label.csv')
train_label = train_label['target']
#获取测试数据
test_data = pd.read_csv('./step1/test_data.csv')

数据集中部分数据与标签如下图所示:

python 支持向量机回归的核函数 支持向量机做回归代码_机器学习_19


python 支持向量机回归的核函数 支持向量机做回归代码_回归_20

python 支持向量机回归的核函数 支持向量机做回归代码_数据_21

代码

#encoding=utf8
from sklearn.svm import SVR

def svr_predict(train_data,train_label,test_data):
    '''
    input:train_data(ndarray):训练数据
          train_label(ndarray):训练标签
    output:predict(ndarray):测试集预测标签
    '''
    #********* Begin *********#
    svr = SVR(kernel='rbf',C=100,gamma= 0.001,epsilon=0.1)
    svr.fit(train_data,train_label)
    predict = svr.predict(test_data)
    #********* End *********#
    return predict