机器学习(3)-支持向量机(SVM)含python代码

《统计学习方法,李航》:7、支持向量机support vector machine(2) 0)基础知识——线性可分支持向量机定义;函数间隔和集合间隔定义 1)线性硬间隔支持向量机 2)凸二次规划最优解求法——对偶方法 3)线性硬间隔支持向量机学习算法及简单实例 4)线性软间隔支持向量机 5)核函数 6)非线性支持向量机 7)序列最小最优化算法(SMO算法) 8)支持向量 5)核函数    对于原始空间(输入空间)线性不可分的情况,常用的办 阅读详情

                                          支持向量机(SVM)

定义:

支持向量机:英文名support vector machine,一般简称SVM。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的超平面(线性分类器),其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

超平面方程式: ,其中X为多维向量,W也为多维向量,b为实数。当f(x)=0时,该点位于超平面上,根据f(x)与0的比较,确定其所属标签。

求解过程:

1,找出支持向量(已知的含有标签数据集中,每个标签下的边界向量)

2,根据支持向量,求出最优超平面(最优的标准就是支持向量距离超平面间隔最大)

本文以实际应用为基础,对一维、二维、多维的线性数据集和非线性数据集进行求解 线性数据集:能用一个超平面进行数据划分的数据集,在一维中该超平面为一个点,二维中为一条直线,三维中为一平面 非线性数据集:无法用一个超平面进行数据划分的数据集,与线性数据集对应。

一维数据

有一维数据T( 1,5,6,10,8 ,20,30,50,60,75),其中A(1,5,6,9,8)的标签为1,B( 20,30,50,60,75 )的标签为-1,如下图: 

      

支持向量:A中边界点为:1,10。且分类器必然处于A与B之间,所以10为A的支持向量。同理可得20为B的支持变量 将10,20带入计算公式 :                         

可得:w为1维向量,设为[X]

[X] .T*[10] + b =-1

[X] .T*[20] + b=1

求得:X=0.2(既w=[0.2]),b=-3 同样根据f(x)=0时为分类器上的点,可知点[15]为分类器上的点 。

二维数据

有二维数据集T,其中A集合的标签为-1,B集合标签为1,如下图:

                            

支持向量:A的备选边界点有a1,a2,a3,B中备选边界点有b1,b2(边界点求法多维时介绍),对分别做成直线a1a2,a2a3,b1b2,分别求相反标签中距离该直线最近点到该直线的距离(几何间隔,既垂线距离),既b1到直线a2a3的距离dis1,b2到a1a2的距离dis2,a2到b1b2的距离dis3,比较可得dis3>dis2>dis1.既可以的得到A的支持向量为a2,B的支持向量为b1,b2。

将a2,b1,b2带入计算公式: ,w的转置为2维向量,设为[[X],[Y]]

[[X],[Y]].T*[[9],[4]] + b = 1

[[X],[Y]] .T*[[8],[1]] + b = 1

[[X],[Y]] .T*[[6],[5]] + b = -1

计算结果:X=0.6,Y=-0.2,b=-3.6, w=[0.6,-0.2]

同样根据f(x)=0时为分类器上的点,可知0.6X-0.2Y-3.6=0为分类直线

多维数据

有多维数据集T,其中A集合的标签为-1,B集合标签为1,由于无法表达多维数据,暂用二维数据图:

                           

多维数据求解步骤如下:

1,几何间隔:样本x到超平面的距离,公式为:

2,最大间隔分离器:既为我们所求的做好的分离器,其定义为离支持变量最远的超平面,当我们取支持变量值为1时,可以得到我们所求的问题转化为:  
也可以转换公式为: 

3,对偶算法:(1)引进拉格朗日乘子,定义拉格朗日函数

2)根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题,先求对w,b的极小值.将L(w,b,a)分别对w,b求偏导数并令其等于0,带入公式。将求极大转换为求极小,最后转换公式为:

3)由KKT条件成立得到以下公式,其中j为使aj*>0的下标之一.所以问题就变为求对偶问题的解a*,再求得原始问题的解w*,b*,从而得分离超平面及分类决策函数可以看出w*和b*都只依赖训练数据中ai*>0的样本点(xi,yi),这些实例点xi被称为支持向量. 

                                                                                    

                                                        非线性数据

核函数:

支持向量机通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K( x, x′) =<φ( x) ⋅φ( x′) > 。那么支持向量机就不用计算复杂的非线性变换,而由这个函数 K(x, x′) 直接得到非线性变换的内积,使大大简化了计算。这样的函数 K(x, x′) 称为核函数。

核技巧:基本思想是通过一个非线性变换将输入空间对应于一个特征空间,使得在输入空间中的超曲面模型对应于特征空间中的超平面模型(支持向量机).在学习和预测中只定义核函数K(x,z),而不显式地定义映射函数.对于给定的核K(x,z),特征空间和映射函数的取法并不唯一.注意到在线性支持向量机的对偶问题中,目标函数和决策函数都只涉及输入实例与实例之间的内积,xi`xj可以用核函数K(xi,xj)=Ф(xi)`Ф(xj)来代替.当映射函数是非线性函数时,学习到的含有核函数的支持向量机是非线性分类模型.在实际应用中,往往依赖领域知识直接选择核函数.

常见核函数

多项式核函数:

对应的支持向量机是一个p次多项式分类器,分类决策函数为:

高斯核函数:

对应的支持向量机是高斯径向基函数(RBF)分类器 分类决策函数为:

线性核函数:

此函数对应的为线性可分数据,这实际上就是原始空间中的内积,这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)

松弛变量

通过核函数把原始数据映射到高维空间之后,能够线性分隔的概率大大增加,但是对于某些情况还是很难处理,比如数据有噪音,对于这种偏离正常位置很远的数据点,我们称之为 outlier,如下图: 

                                                           

这些outlier意味着不能满足函数间隔大于等于1的约束条件,可以对每个样本点引进一个松弛变量,使函数间隔加上松弛变量大于等于1,约束条件变为:      

 同时对每个松弛变量,支付一个代价,目标函数变为;      ,其中C>0称为惩罚 

 参数,C值越大对误分类的惩罚也越大.新目标函数包含了两层含义:使间隔尽量大,同时使误分类点的个数尽量小.

根据前面的对偶性算法,最终所得公式为:

KKT条件成立可以得到,j是满足0<aj*<C的下标之一.问题就变为选择惩罚参数C>0,求得对偶问题(凸二次规划问题)的最优解a*,代入计算w*和b*,求得分离超平面和分类决策函数.因为b的解并不唯一,所以实际计算b*时可以取所有样本点上的平均值。

支持向量:在线性不可分的情况下,将对应与ai*>0的样本点(xi,yi)的实例点xi称为支持向量。

SMO算法

SMO(sequence minimum optimal 序列最小最优化):快速求解凸二次规划问题的算法.基本思路是:如果所有变量都满足此优化问题的KKT条件,那么解就得到了.否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题.不断地将原问题分解为子问题并对子问题求解,就可以求解原问题.注意子问题两个变量中只有一个是自由变量,另一个由等式约束确定. 

两个变量二次规划的求解方法:       

假设选择的两个变量是a1,a2,其他变量是固定的,于是得到子问题:

ε是常数,目标函数式省略了不含a1,a2的常数项.考虑不等式约束和等式约束,要求的是目标函数在一条平行于对角线的线段上        的最优值

                                 

问题变为单变量的最优化问题.假设初始可行解为aold,最优解为anew,考虑沿着约束方向未经剪辑的最优解anew,unc(即未考虑不等式约束).对该问题求偏导数,并令导数为0,代入

 原式,,

 经剪辑后a2的解是  L与H是a2new所在的对角线段端点的界.并解得:
变量的选择方法:在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的.第一个变量的选取标准是违反KKT条件最严重的样本点,第二个变量的选取标准是希望能使该变量有足够大的变化,一般可以选取使对应的|E1-E2|最大的点.在每次选取完点后,更新阈值b和差值Ei.

算法步骤:

1,循环所以训练样本,判断是否满足KKT条件,如不满足,则记录该点ai: KKT条件:

                                                                                                                                   

(2)不等式约束使得(αi,αj)在盒子[0, C]x[0, C]内,等式约束使得(αi, αj)在平行于盒子[0, C]x[0, C]的对角线的直线上。因此要求的是目标函数在一条平行于对角线的线段上的最优值。这使得两个变量的最优化问题成为实质的单变量的最优化问题。由图可以得到,αj的上下界可以通过下面的方法得到: 

                                                                   

我们优化的时候,αj必须要满足上面这个约束。也就是说上面是αj的可行域。然后我们开始寻找αj,使得目标函数最大化。通过推导得到αj的更新公式如下 :

                                       

对应参数值:

                              

这里Ek可以看做对第k个样本,SVM的输出与期待输出,也就是样本标签的误差。 而η实际上是度量两个样本i和j的相似性的。在计算η的时候,我们需要使用核函数,那么就可以用核函数来取代上面的内积。

(3)进行不等式剪裁:

                                     

(4)计算αi:

                                        

4,计算阈值b

优化αi和αj后,我们就可以更新阈值b,使得对两个样本i和j都满足KKT条件。如果优化后αi不在边界上(也就是满足0<αi<C,这时候根据KKT条件,可以得到yigi(xi)=1,这样我们才可以计算b),那下面的阈值b1是有效的,因为当输入xi时它迫使SVM输出yi。

          

同样      

如果0<αi<C和0<αj<C都满足,那么b1和b2都有效,而且他们是相等的。如果他们两个都处于边界上(也就是αi=0或者αi=C,同时αj=0或者αj=C),那么在b1和b2之间的阈值都满足KKT条件,一般我们取他们的平均值b=(b1+b2)/2。所以,总的来说对b的更新如下:

                   

5,凸优化问题终止条件:

SMO算法的基本思路是:如果说有变量的解都满足此最优化问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件(证明请参考文献)。所以我们可以监视原问题的KKT条件,所以所有的样本都满足KKT条件,那么就表示迭代结束了。但是由于KKT条件本身是比较苛刻的,所以也需要设定一个容忍值,即所有样本在容忍值范围内满足KKT条件则认为训练可以结束;当然了,对于对偶问题的凸优化还有其他终止条件,可以参考文献。

代码:

from numpy import *
import matplotlib.pyplot as plt

MOSHI = 'mul'
GAOSI_C = 3
def loadDataSet(filename): #读取数据
    dataMat=[]
    labelMat=[]
    fr=open(filename)
    for line in fr.readlines():
        lineArr=line.strip().split('###')
        dataMat.append([float(lineArr[0]),float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat,labelMat #返回数据特征和数据类别

def selectJrand(i,m): #在0-m中随机选择一个不是i的整数
    j=i
    while (j==i):
        j=int(random.uniform(0,m))
    return j

def clipAlpha(aj,H,L):  #保证a在L和H范围内(L <= a <= H)
    if aj>H:
        aj=H
    if L>aj:
        aj=L
    return aj

def kernelTrans(X, A, kTup): #核函数,输入参数,X:支持向量的特征树;A:某一行特征数据;kTup:('lin',k1)核函数的类型和参数
    m,n = shape(X)
    K = mat(zeros((m,1)))
    if kTup[0]=='lin': #线性函数
        K = X * A.T
    elif kTup[0]=='rbf': # 径向基函数(radial bias function)gaosi
        for j in range(m):
            deltaRow = X[j,:] - A
            K[j] = deltaRow*deltaRow.T
        K = exp(K/(-1*kTup[1]**2)) #返回生成的结果
    elif kTup[0]=='mul': # duo xiang shi
        for j in range(m):
            deltaRow = X[j,:]*A.T
            K[j] = (deltaRow + 1)**kTup[1]
    else:
        raise NameError('Houston We Have a Problem -- That Kernel is not recognized')
    return K


#定义类,方便存储数据
class optStruct:
    def __init__(self,dataMatIn, classLabels, C, toler, kTup):  # 存储各类参数
        self.X = dataMatIn  #数据特征
        self.labelMat = classLabels #数据类别
        self.C = C #软间隔参数C,参数越大,非线性拟合能力越强
        self.tol = toler #停止阀值
        self.m = shape(dataMatIn)[0] #数据行数
        self.alphas = mat(zeros((self.m,1)))
        self.b = 0 #初始设为0
        self.eCache = mat(zeros((self.m,2))) #缓存
        self.K = mat(zeros((self.m,self.m))) #核函数的计算结果
        for i in range(self.m):
            self.K[:,i] = kernelTrans(self.X, self.X[i,:], kTup)


def calcEk(oS, k): #计算Ek(参考《统计学习方法》p127公式7.105)
    fXk = float(multiply(oS.alphas,oS.labelMat).T*oS.K[:,k] + oS.b)
    Ek = fXk - float(oS.labelMat[k])
    return Ek

#随机选取aj,并返回其E值
def selectJ(i, oS, Ei):
    maxK = -1
    maxDeltaE = 0
    Ej = 0
    oS.eCache[i] = [1,Ei]
    validEcacheList = nonzero(oS.eCache[:,0].A)[0]  #返回矩阵中的非零位置的行数
    if (len(validEcacheList)) > 1:
        for k in validEcacheList:
            if k == i:
                continue
            Ek = calcEk(oS, k)
            deltaE = abs(Ei - Ek)
            if (deltaE > maxDeltaE): #返回步长最大的aj
                maxK = k
                maxDeltaE = deltaE
                Ej = Ek
        return maxK, Ej
    else:
        j = selectJrand(i, oS.m)
        Ej = calcEk(oS, j)
    return j, Ej


def updateEk(oS, k): #更新os数据
    Ek = calcEk(oS, k)
    oS.eCache[k] = [1,Ek]

#首先检验ai是否满足KKT条件,如果不满足,随机选择aj进行优化,更新ai,aj,b值
def innerL(i, oS): #输入参数i和所有参数数据
    Ei = calcEk(oS, i) #计算E值
    if ((oS.labelMat[i]*Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or ((oS.labelMat[i]*Ei > oS.tol) and (oS.alphas[i] > 0)): #检验这行数据是否符合KKT条件 参考《统计学习方法》p128公式7.111-113
        j,Ej = selectJ(i, oS, Ei) #随机选取aj,并返回其E值
        alphaIold = oS.alphas[i].copy()
        alphaJold = oS.alphas[j].copy()
        if (oS.labelMat[i] != oS.labelMat[j]): #以下代码的公式参考《统计学习方法》p126
            L = max(0, oS.alphas[j] - oS.alphas[i])
            H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])
        else:
            L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C)
            H = min(oS.C, oS.alphas[j] + oS.alphas[i])
        if L==H:
            print("L==H")
            return 0

        eta = 2.0 * oS.K[i,j] - oS.K[i,i] - oS.K[j,j] #参考《统计学习方法》p127公式7.107 (x-y)**2
        if eta >= 0:
            print("eta>=0")
            return 0
        oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/eta #参考《统计学习方法》p127公式7.106
        oS.alphas[j] = clipAlpha(oS.alphas[j],H,L) #参考《统计学习方法》p127公式7.108
        updateEk(oS, j)
        if (abs(oS.alphas[j] - alphaJold) < oS.tol): #alpha变化大小阀值(自己设定)
            print("j not moving enough")
            return 0
        oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])#参考《统计学习方法》p127公式7.109
        updateEk(oS, i) #更新数据
        #以下求解b的过程,参考《统计学习方法》p129公式7.114-7.116
        b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,i] - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[i,j]
        b2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,j]- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[j,j]
        if (0 < oS.alphas[i]<oS.C):
            oS.b = b1
        elif (0 < oS.alphas[j]<oS.C):
            oS.b = b2
        else:
            oS.b = (b1 + b2)/2.0
        return 1
    else:
        return 0


#SMO函数,用于快速求解出alpha
def smoP(dataMatIn, classLabels, C, toler, maxIter,kTup=('lin', 0)): #输入参数:数据特征,数据类别,参数C,阀值toler,最大迭代次数,核函数(默认线性核)
    oS = optStruct(mat(dataMatIn),mat(classLabels).transpose(),C,toler, kTup)
    iter = 0
    entireSet = True
    alphaPairsChanged = 0
    while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)):
        alphaPairsChanged = 0
        if entireSet:
            for i in range(oS.m): #遍历所有数据
                alphaPairsChanged += innerL(i,oS)
                print("fullSet, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)) #显示第多少次迭代,那行特征数据使alpha发生了改变,这次改变了多少次alpha
        else:
            nonBoundIs = nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0]
            for i in nonBoundIs: #遍历非边界的数据
                alphaPairsChanged += innerL(i,oS)
                print("non-bound, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))
        iter += 1
        if entireSet:
            entireSet = False
        elif (alphaPairsChanged == 0):
            entireSet = True
        print("iteration number: %d" % iter)
    return oS.b,oS.alphas

def showdata(dataArr,labelArr, ax):
    datMat = array(dataArr)
    labelMat = array(labelArr)
    labelMat_i = argwhere(labelMat == 1)
    labelMat_j = argwhere(labelMat == -1)
    datMat_i = datMat[labelMat_i].T
    datMat_j = datMat[labelMat_j].T

    plt.sca(ax)
    plt.scatter([datMat_i[1]], [datMat_i[0]], c='r', marker='x')
    plt.scatter([datMat_j[1]], [datMat_j[0]], c='g', marker='o')

def showdata_i(dataArr,nums, ax):
    datMat = array(dataArr)
    datMat_i = datMat[nums].T
    plt.sca(ax)
    plt.scatter([datMat_i[1]], [datMat_i[0]], c='b', marker='v')

def showdata_sv(dataArr,nums, ax):
    datMat = array(dataArr)
    datMat_i = datMat[nums].T
    plt.sca(ax)
    plt.scatter([datMat_i[1]], [datMat_i[0]], c='b', marker='P')


def testRbf(data_train,data_test):
    plt.figure(1, figsize=(16, 8))
    dataArr,labelArr = loadDataSet(data_train) #读取训练数据
    ax1 = plt.subplot(1, 2, 1)
    showdata(dataArr,labelArr, ax1)
    b,alphas = smoP(dataArr, labelArr, 200, 0.00001, 10000, (MOSHI, GAOSI_C)) #通过SMO算法得到b和alpha
    datMat=mat(dataArr)
    labelMat = mat(labelArr).transpose()
    svInd=nonzero(alphas)[0]  #选取不为0数据的行数(也就是支持向量)
    showdata_sv(dataArr, svInd, ax1)
    sVs=datMat[svInd] #支持向量的特征数据
    labelSV = labelMat[svInd] #支持向量的类别(1或-1)00001
    print("there are %d Support Vectors" % shape(sVs)[0]) #打印出共有多少的支持向量
    m,n = shape(datMat) #训练数据的行列数
    errorCount = 0
    wT = multiply(labelSV, alphas[svInd]).T
    nums = []
    for i in range(m):
        kernelEval = kernelTrans(sVs,datMat[i,:],(MOSHI, GAOSI_C)) #将支持向量转化为核函数
        predict=wT * kernelEval + b  #这一行的预测结果(代码来源于《统计学习方法》p133里面最后用于预测的公式)注意最后确定的分离平面只有那些支持向量决定。
        if sign(predict)!=sign(labelArr[i]): #sign函数 -1 if x < 0, 0 if x==0, 1 if x > 0
            errorCount += 1
            nums.append(i)
    showdata_i(dataArr, nums, ax1)
    print("the training error rate is: %f" % (float(errorCount)/m)) #打印出错误率
    dataArr_test,labelArr_test = loadDataSet(data_test) #读取测试数据
    ax2 = plt.subplot(1, 2, 2)
    showdata(dataArr_test, labelArr_test, ax2)
    errorCount_test = 0
    datMat_test=mat(dataArr_test)
    labelMat = mat(labelArr_test).transpose()
    m,n = shape(datMat_test)
    nums_test = []
    for i in range(m): #在测试数据上检验错误率
        kernelEval = kernelTrans(sVs,datMat_test[i,:],(MOSHI, GAOSI_C))
        predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b
        if sign(predict)!=sign(labelArr_test[i]):
            errorCount_test += 1
            nums_test.append(i)
    print("the test error rate is: %f" % (float(errorCount_test)/m))
    showdata_i(dataArr_test, nums_test, ax2)
    plt.show()

#主程序
def main():
    filename_traindata='train_data2.TXT'
    filename_testdata='test_data1.TXT'
    testRbf(filename_traindata,filename_testdata)

if __name__=='__main__':
    main()

 

 

 

 

机器学习基础入门笔记(一) 简单理解呢,机器学习就是一系列方法,这些方法能够帮助我们自动的找出数据中的规律,然后对未来的数据进行预测,从而支持我们现实生活中的决策。形象介绍为什么要学机器学习,描述大数据与机器学习、深度学习的关系,机器学习的分类。 阅读详情

相关推荐

机器学习:Python中如何使用支持向量机(SVM)算法

(简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资)在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析。其具有以下特征:(1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。(2) SVM通过最大化决策边界的边缘来实现控制模型的能力。

AI333888的博客 4014

机器学习实战——支持向量机代码详解

如果想要详细了解支持向量机的原理,本人推荐一篇文章,读者可详细的阅读,大有裨益:https://blog.youkuaiyun.com/v_july_v/article/details/7624837 import numpy def loadDataSet(fileName):#加载数据 dataMat=[];labelMat=[] fr=open(fileName)#打开文件 f...

youhuakongzhi的博客 2349

支持向量机SVM算法应用【Python实现】

支持向量机SVM算法应用【Python实现】 一. 代码实践:调用Python库sklearn实现 1.安装Python和机器学习库,和一些依赖包; 本人是直接安装了包含了众多包的Anaconda3 ,下载后再window7 64bit上双击安装即可; Anaconda3较大,如果网速不好,可以从百度云下载地址:http://pan.baidu.com/s/1dFIfo

江说江湖专栏:欠世界一个伟大的产品! 3548

头歌实践平台:机器学习——支持向量回归

头歌实践平台:机器学习——支持向量回归 第1关:线性可分支持向量机 第2关:线性支持向量机 第3关:非线性支持向量机 第4关:序列最小优化算法 第5关:支持向量回归 关卡头歌实践平台:机器学习——支持向量回归第1关第2关第3关第4关第5关 提示:以下答案可供参考 第1关 1. B、黑线 2. B、0.4 3. C、3x+2y=0 4. B、样本y到超平面的距离为3 5. D、-x+y+1=0 6. AC 第2关 线性支持向量机: #encoding=utf8 from sklearn.svm

qq_48414236的博客 1万+

白话机器学习算法理论+实战之支持向量机(SVM)

1. 写在前面 如果想从事数据挖掘和数据分析的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 为了详细的理解这些,曾经看过西瓜书,统计学习方法,机器学习...

Miracle8070 5947

嵌入式开发 DSP芯片运行方式(挖坑-填坑中-坑已平 :))

TMS320F28335 DSP 芯片 如何将运行代码放在不同的位置

FOOLCODE的专栏 1306

【ML】支持向量机SVM及Python实现(详细)

支持向量机如果想划分效果很好,就需要找到支持向量的分布,再就是找到最大间隔的分离超平面,解决好上诉两个问题就基本可以实现支持向量机。

weixin_66845445的博客 2万+

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

【机器学习】python使用支持向量机SVM

【机器学习】python使用支持向量机SVM准备:        数据集    导入SVM模块步骤:    1.读取数据集    2.划分训练样本与测试样本    3.训练SVM分类器    4.计算分类准确率    5.绘制图像        关于SVM的原理知识,在【机器学习】支持向量机中讲过,欲知详情,可戳:    https://blog.youkuaiyun.com/u012679707/artic...

gogo小Sa的专栏 8万+

candence layout快捷键

摁住鼠标左键再框选:选中 摁住鼠标右键再框选:放大 选中之后,滚动鼠标滚轮进行放大缩小。 F:回到全局 shift+V:缩小 键盘的箭头:移动视图 F1:显示帮助文档Candence help F2:保存 点击r,画出矩形时不双击鼠标,点击F3,可以设置尺寸。 Creat-Shape-Path Creat-Wiring-Bus:画多根线。F3设置线宽、间距等。 选中金属后,Shift+G画保护环guard ring。F3可以设置距离金属的间距、保护环的形状。 Path和Rectang

weixin_45861827的博客 2655

利用HipSTR从二代测序数据中精准解析短串联重复序列(STR)的遗传多态性

本文详细介绍了如何利用HipSTR工具从二代测序(NGS)数据中精准解析短串联重复序列(STR)的遗传多态性。通过三步走策略,HipSTR能够高效识别STR区域、估算重复次数并判定基因型,适用于法医鉴定、疾病研究和细胞系鉴定等多个领域。文章还提供了实战操作指南和常见问题解决方案,帮助研究者充分利用NGS数据开展STR分析。

weixin_28702105的博客 483

支持向量机(SVM)的分析及python实现

本文所有代码都是基于python3.6的,数据及源码下载:传送门引言今天我们算是要来分享一个“高级”的机器学习算法了——SVM。大家自学机器学习一般都会看斯坦福的CS229讲义,初学者们大都从回归开始步入机器学习的大门。诚然回归学习起来与使用起来都很简单,但是这能达到我们的目的么?肯定不够的,要知道,我们可以做的不仅仅是回归。如果我们把机器学习算法看作是一种带斧子,剑,刀,弓,匕首等的武器,你有各种

分享人工智能学习心得与实践经验,探讨应用场景,见证变革与进步 15万+

中兴通讯招聘测评答题技巧,真题解析(附真题)

中兴招聘测评、中兴入职测评、中兴线上考试

guang221315221的博客 5803

机器学习——支持向量机(SVM)

支持向量机(SVM)是一种常见的机器学习方法,常用于分类(线性和非线性分类问题),回归问题。本文将详细介绍一下支持向量机算法。本文在SVM算法原理介绍中:从开始的SVM介绍,到Kernel的介绍,再到算法和核函数的选择,之后就是算法的步骤,以及分类和回归的选择;在代码实现中:亦是分别对SVM中的回归(SVR)和分类(SVC)用代码实现,并可视化结果。 关关雎鸠,在河之洲 --2023-9-4 筑基篇

2301_78630677的博客 2万+

YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

数据集样本太少怎么办?数据集优质图像不够怎么办?如何做到更好的数据预处理?一文带你学会数据增强,还可实现带标签的扩充。

路人贾的博客 4万+

【扣子AI开发】如何开发一个图像生成智能体?

【扣子AI开发】如何开发一个图像生成智能体,从创建到发布

tl437002770的博客 2427

支持向量机SVM通俗理解(python代码实现)

这是第三次来“复习”SVM了,第一次是使用SVM包,调用包并尝试调节参数。听闻了“流弊”SVM的算法。第二次学习理论,看了李航的《统计学习方法》以及网上的博客。看完后感觉,满满的公式。。。记不住啊。第三次,也就是这次通过python代码手动来实现SVM,才让我突然对SVM不有畏惧感。希望这里我能通过简单粗暴的文字,能让读者理解到底什么是SVM,这货的算法思想是怎么样的。看之前千万不要畏惧,说到底就...

程松 9万+

【推荐100个unity插件】对话系统插件——YarnSpinner-Unity插件

Yarn Spinner是一款专为游戏对话设计的脚本语言,适用于Unity等引擎。本文介绍了在Unity中安装和使用Yarn Spinner的完整流程:首先通过Package Manager添加仓库并安装插件;然后创建Yarn Script和Project文件,配置对话系统;接着编写Yarn脚本定义对话内容,并展示运行效果;最后讲解了按键控制和多语言本地化设置。该工具采用类似剧本的简洁格式,支持分支对话、条件逻辑等功能,能有效提升游戏叙事的开发效率。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2214

python机器学习库sklearn——支持向量机svm

全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 支持向量机svm的相关的知识内容可以参考 https://blog.youkuaiyun.com/luanpeng825485697/article/details/78823919 支持向量机的优势在于: 在高维空间中非常高效.即使在数据维度比样本数量大的情况下仍然有效. 在决策函数(称为支持向量)中使用训练集的...

3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

支持向量机(SVM)Python代码及调参方法——用支持向量机模型实现机器学习

支持向量机(SVM)Python代码及调参方法——用支持向量机模型实现机器学习。支持向量机(SVM)是一种强大的分类技术,广泛应用于模式识别和机器学习问题中。它既可以用于分类也可以用于回归。下面我将详细介绍支持向量机的适用范围、原理、优点和缺点,并提供一个简单的Python实现示例。

qq_41698317的博客 6172

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【机器学习】机器学习之SVM支持向量机

本次实验聚焦支持向量机(SVM)算法在鸢尾花数据集上的分类任务,特别关注加入和未加入松弛因子的分类效果。通过深入了解SVM的原理和参数设置,我首先训练了一个未加入松弛因子的模型,然后引入了松弛因子,以探索其对分类结果的影响。松弛因子允许样本存在于超平面错误的一侧,增加了模型的容错能力,使其对噪声或异常值更具鲁棒性。

朝花夕拾 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【机器学习】SVM 支持向量机

具体而言,SVM首先将数据映射到高维空间,并在该空间中找到一个最优的超平面,使得该超平面能够将不同类别的数据点有效地分开。其中,对于最优超平面的定义是使得间隔最大化,即离超平面最近的数据点到超平面的距离最大化。用于计算核函数值的函数,其实现了线性核和径向基函数(RBF)核。高斯核函数是一种常用的非线性核函数,它通过计算数据点之间的相似度来建模非线性关系。线性核函数是 SVM 默认的核函数,它对应于线性分类器。SVM最终分类的过程是将新的数据点映射到高维空间,并根据其位置与最优超平面的关系来进行分类。

慢热型网友的博客 1690

机器学习之支持向量机(svm)

数据预处理:包括特征提取、特征标准化以及数据集的分割。使用支持向量机进行分类:支持向量机是一种强大的分类算法,可以用于解决各种类型的分类问题。用户输入功能:通过与用户交互,实现了从用户处获取数据并进行预测的功能。数据预处理:确保数据的质量和一致性,以及选择合适的特征标准化方法。模型训练:调整支持向量机的参数以获得最佳性能。用户输入:需要处理用户可能输入的各种类型和范围的数据,并进行适当的预处理。适用于高维空间:支持向量机在高维空间中表现出色,适用于处理特征维度较高的数据集。

weixin_73582856的博客 1758

机器学习模型3——支持向量机SVM

机器学习模型3——SVM

littleyy666的博客 4648
上一篇: 机器学习(2)-K-Means(含代码)
下一篇: 把Parcel序列化到Parcelable用例
breakpoints_
博客等级 码龄9年 52粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值