机器学习入门-支持向量机

机器学习实战SMO算法源码解析 from numpy import * from time import sleepdef loadDataSet(fileName): dataMat = []; labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr = line.strip().split('\t') 阅读详情

基本定义


给定一个训练样本集,分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同的类别的样本分开。这个划分超平面越鲁棒,对未见示例的泛化能力就越强。划分超平面可通过如下线性方程来描述。

WTX+b=0WTX+b=0
其中w=(w1;w2;...;wd)w=(w1;w2;...;wd)是法向量,决定了超平面的方向。b是位移项,决定了超平面与远点的距离。显然划分超平面可以被法向量w和位移b确定,将其记为(w,b)(w,b).样本空间中任一点x到超平面(w,b)(w,b)的距离可以写为
r=|WTX+b|||w||r=|WTX+b|||w||
假设其能正确的分类,则对于(xi,yi)∈D(xi,yi)∈D,若yi=+1yi=+1,则有wTxi+b>0wTxi+b>0,若yi=-1yi=-1,则有wTxi+b<0wTxi+b<0,令
{wTxi+b≥+1 if yi=+1wTxi+b≤−1 if yi=−1{wTxi+b≥+1 if yi=+1wTxi+b≤−1 if yi=−1
距离超平面最近的点使得等号成立,它们被称为“支持向量”,两个异类支持向量到超平面的距离之和为
γ=2||w||γ=2||w||
它被称为间隔(margin),优化目标则是找到具有最大间隔的划分超平面,因此SVM也被称为最大间隔分类。因此优化目标可以具体化为
minw,b12||w||2minw,b12||w||2
s.t.yi(wTxi+b)≥1,i=1,2,...m.s.t.yi(wTxi+b)≥1,i=1,2,...m.
这就是支持向量机的基本型。

对偶问题


对于SVM的基本型,可以使用拉格朗日乘子法的到其对偶类型。
下面将对在多个约束的情况下的对偶问题进行一定的推倒。考虑具有m个等式和n个不等式的约束。

minxf(x)minxf(x)
s.t.hi(x)=0(i=1,...m)s.t.hi(x)=0(i=1,...m)
s.t.gj(x)≤0(j=1,...m)s.t.gj(x)≤0(j=1,...m)
引入拉格朗日乘子λ=(λ1,λ2,...,λm)Tλ=(λ1,λ2,...,λm)T和μ=(μ1,μ2,...,μn)Tμ=(μ1,μ2,...,μn)T,相应的拉格朗日函数为
L(x,λ,μ)=f(x)+∑i=1mλihi(x)+∑j=1nμjgj(x)L(x,λ,μ)=f(x)+∑i=1mλihi(x)+∑j=1nμjgj(x)
由不等式引入的KKT条件为
⎧⎩⎨⎪⎪gj(x)≤0 ; μj≥0 ; μjgj(x)=0 ; {gj(x)≤0 ; μj≥0 ; μjgj(x)=0 ; 
对于该主问题,设其对偶问题为τ(λ,μ)=inf(f(x)+∑mi=1λihi(x)+∑nj=1μjgj(x))τ(λ,μ)=inf(f(x)+∑i=1mλihi(x)+∑j=1nμjgj(x))
由上述条件显然∑mi=1λihi(x)+∑nj=1μjgj(x)≤0∑i=1mλihi(x)+∑j=1nμjgj(x)≤0
因此有
τ(λ,μ)≤f(x~)τ(λ,μ)≤f(x~)
因此对偶函数给出了主问题最优值的下界。很自然的一个问题是基于对偶函数能获得的最好下界是什么?这就引出了优化问题
maxλ,μτ(λ,μ)s.t.μ⪰0maxλ,μτ(λ,μ)s.t.μ⪰0
这就是主问题的对偶问题了。

下面考虑原问题。该问题的拉格朗日函数可以写为

L(w,b,α)=12||w||2+∑i=1mαi(1−yi(wTxi+b))L(w,b,α)=12||w||2+∑i=1mαi(1−yi(wTxi+b))
对w和b偏导为0可以得到
w=∑i=1mαiyixiw=∑i=1mαiyixi
∑i=1mαiyi=0∑i=1mαiyi=0
从而得到对偶问题:
maxα∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjxTixjmaxα∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjxiTxj
s.t.∑i=1mαiyi=0,αi≥0(i=1,2,...m)s.t.∑i=1mαiyi=0,αi≥0(i=1,2,...m)
解出αα后,求出w和b即可得到模型
f(x)=∑i=1mαiyixTix+bf(x)=∑i=1mαiyixiTx+b

那么应该如何计算αα呢?

SMO算法


SMO的基本思路是先固定αiαi之外的所有参数,然后求αiαi上的极值。由于存在约束∑mi=1αiyi=0∑i=1mαiyi=0若固定αiαi之外的其他变量,则αiαi可由其它变量打出。于是每次选择两个变量αiαi和αjαj并固定其它参数。不断执行如下步骤直至收敛。

  • 选取一对更新的变量αiαi、αjαj
  • 固定αiαi和αjαj以外的参数,求解更新后的αiαi和αjαj。

SMO首先选取违背KKT条件程度最大的变量。选取的第二个变量则应该使对应样本间的间隔最大。
对于b则使用所有支持向量求解的平均值。

核函数


对于某些原始样本空间内不存在一个能正确划分两类样本的超平面的问题,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。令ϕ(x)ϕ(x)表示将xx映射后的特征向量,于是在特征空间内划分超平面所对应的模型可表示为

f(x)=wTϕ(x)+b
剩余推导都和上文类似,除了在计算维度上有一定难度上的提高。
对于映射有一些基本的经验,例如对于文本数据通常采用线性核,情况不明可以先采取高斯核。

  • 线性核:  κ(xi,xj)=xTixjκ(xi,xj)=xiTxj
  • 高斯核:  κ(xi,xj)=e−||xi−xj||22σ2κ(xi,xj)=e−||xi−xj||22σ2

实战


from numpy import *
from time import sleep

def loadDataSet(filename):
    dataMat=[]
    labelMat=[]
    with open(filename,'r') as fr:
        for line in fr.readlines():
            lineArr=line.strip().split('\t')
            dataMat.append([float(lineArr[0]),float(lineArr[1])])
            labelMat.append(float(lineArr[2]))
    return dataMat,labelMat

def selectJrand(i,m):
    j=i
    while(j==i):
        j=int(random.uniform(0,m))
    return j

def clipAlpha(aj,H,L):
    if aj>H:
        aj=H
    if L>aj:
        aj=L
    return aj

def smoSimple(dataMatIn,classLabels,C,toler,maxIter):
    dataMatrix=mat(dataMatIn)
    labelMat=mat(classLabels).transpose()
    b=0;m,n=shape(dataMatrix)
    alphas=mat(zeros((m,1)))
    iter=0
    while(iter<maxIter):
        alphaPairsChanged=0
        for i in range(m):
            fXi=float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T))+b
            Ei=fXi-float(labelMat[i])
            if(((labelMat[i]*Ei<-toler)and(alphas[i]<C))or((labelMat[i]*Ei>toler)and(alphas[i]>0))):
                j=selectJrand(i,m)
                fXj=float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T))+b
                Ej=fXj-float(labelMat[j])
                alphaIold=alphas[i].copy()
                alphaJold=alphas[j].copy()
                if(labelMat[i]!=labelMat[j]):
                    L=max(0,alphas[j]-alphas[i])
                    H=min(C,C+alphas[j]-alphas[i])
                else:
                    L=max(0,alphas[j]+alphas[i]-C)
                    H=min(C,alphas[j]+alphas[i]) 
                if(L==H):
                    print('L==H')
                    continue
                eta=2.0*dataMatrix[i,:]*dataMatrix[j,:].T-dataMatrix[i,:]*dataMatrix[i,:].T-dataMatrix[j,:]*dataMatrix[j,:].T
                if(eta>=0):
                    print('eta>=0')
                    continue
                alphas[j]-=labelMat[j]*(Ei-Ej)/eta
                alphas[j]=clipAlpha(alphas[j],H,L)
                if(abs(alphas[j]-alphaJold)<0.00001):
                    print('j not moving enough')
                    continue
                alphas[i]+=labelMat[j]*labelMat[i]*(alphaJold-alphas[j])
                b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
                b2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T
                if (0 < alphas[i]) and (C > alphas[i]): b = b1
                elif (0 < alphas[j]) and (C > alphas[j]): b = b2
                else: b = (b1 + b2)/2.0
                alphaPairsChanged += 1
                print ("iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))
        if (alphaPairsChanged == 0): iter += 1
        else: iter = 0
        print ("iteration number: %d" % iter)
    return b,alphas

def kernelTrans(X, A, kTup): #calc the kernel or transform data to a higher dimensional space
    m,n = shape(X)
    K = mat(zeros((m,1)))
    if kTup[0]=='lin': K = X * A.T   #linear kernel
    elif kTup[0]=='rbf':
        for j in range(m):
            deltaRow = X[j,:] - A
            K[j] = deltaRow*deltaRow.T
        K = exp(K/(-1*kTup[1]**2)) #divide in NumPy is element-wise not matrix like Matlab
    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):  # Initialize the structure with the parameters 
        self.X = dataMatIn
        self.labelMat = classLabels
        self.C = C
        self.tol = toler
        self.m = shape(dataMatIn)[0]
        self.alphas = mat(zeros((self.m,1)))
        self.b = 0
        self.eCache = mat(zeros((self.m,2))) #first column is valid flag
        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):
    fXk=float(multiply(oS.alphas,oS.labelMat).T*(oS.X*oS.X[k,:].T))+oS.b
    Ek=fXk-float(oS.labelMat[k])
    return Ek

def selectJ(i, oS, Ei):         #this is the second choice -heurstic, and calcs Ej
    maxK = -1; maxDeltaE = 0; Ej = 0
    oS.eCache[i] = [1,Ei]  #set valid #choose the alpha that gives the maximum delta E
    validEcacheList = nonzero(oS.eCache[:,0].A)[0]
    if (len(validEcacheList)) > 1:
        for k in validEcacheList:   #loop through valid Ecache values and find the one that maximizes delta E
            if k == i: continue #don't calc for i, waste of time
            Ek = calcEk(oS, k)
            deltaE = abs(Ei - Ek)
            if (deltaE > maxDeltaE):
                maxK = k; maxDeltaE = deltaE; Ej = Ek
        return maxK, Ej
    else:   #in this case (first time around) we don't have any valid eCache values
        j = selectJrand(i, oS.m)
        Ej = calcEk(oS, j)
    return j, Ej

def updateEk(oS, k):#after any alpha has changed update the new value in the cache
    Ek = calcEk(oS, k)
    oS.eCache[k] = [1,Ek]

def innerL(i, oS):
    Ei = calcEk(oS, i)
    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)):
        j,Ej = selectJ(i, oS, Ei) #this has been changed from selectJrand
        alphaIold = oS.alphas[i].copy(); alphaJold = oS.alphas[j].copy();
        if (oS.labelMat[i] != oS.labelMat[j]):
            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] #changed for kernel
        if eta >= 0: print ("eta>=0"); return 0
        oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/eta
        oS.alphas[j] = clipAlpha(oS.alphas[j],H,L)
        updateEk(oS, j) #added this for the Ecache
        if (abs(oS.alphas[j] - alphaJold) < 0.00001): print ("j not moving enough"); return 0
        oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])#update i by the same amount as j
        updateEk(oS, i) #added this for the Ecache                    #the update is in the oppostie direction
        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]) and (oS.C > oS.alphas[i]): oS.b = b1
        elif (0 < oS.alphas[j]) and (oS.C > oS.alphas[j]): oS.b = b2
        else: oS.b = (b1 + b2)/2.0
        return 1
    else: return 0

def smoP(dataMatIn, classLabels, C, toler, maxIter,kTup=('lin', 0)):    #full Platt SMO
    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:   #go over all
            for i in range(oS.m):        
                alphaPairsChanged += innerL(i,oS)
                print ("fullSet, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))
            iter += 1
        else:#go over non-bound (railed) alphas
            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 #toggle entire set loop
        elif (alphaPairsChanged == 0): entireSet = True  
        print ("iteration number: %d" % iter)
    return oS.b,oS.alphas   
def calcWs(alphas,dataArr,classLabels):
    X = mat(dataArr); labelMat = mat(classLabels).transpose()
    m,n = shape(X)
    w = zeros((n,1))
    for i in range(m):
        w += multiply(alphas[i]*labelMat[i],X[i,:].T)
    return w

def testRbf(k1=1.3):
    dataArr,labelArr = loadDataSet('testSetRBF.txt')
    b,alphas = smoP(dataArr, labelArr, 200, 0.0001, 10000, ('rbf', k1)) #C=200 important
    datMat=mat(dataArr); labelMat = mat(labelArr).transpose()
    svInd=nonzero(alphas.A>0)[0]
    sVs=datMat[svInd] #get matrix of only support vectors
    labelSV = labelMat[svInd];
    print ("there are %d Support Vectors" % shape(sVs)[0])
    m,n = shape(datMat)
    errorCount = 0
    for i in range(m):
        kernelEval = kernelTrans(sVs,datMat[i,:],('rbf', k1))
        predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b
        if sign(predict)!=sign(labelArr[i]): errorCount += 1
    print ("the training error rate is: %f" % (float(errorCount)/m))
    dataArr,labelArr = loadDataSet('testSetRBF2.txt')
    errorCount = 0
    datMat=mat(dataArr); labelMat = mat(labelArr).transpose()
    m,n = shape(datMat)
    for i in range(m):
        kernelEval = kernelTrans(sVs,datMat[i,:],('rbf', k1))
        predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b
        if sign(predict)!=sign(labelArr[i]): errorCount += 1    
    print ("the test error rate is: %f" % (float(errorCount)/m))

def img2vector(filename):
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0,32*i+j] = int(lineStr[j])
    return returnVect

def loadImages(dirName):
    from os import listdir
    hwLabels = []
    trainingFileList = listdir(dirName)           #load the training set
    m = len(trainingFileList)
    trainingMat = zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]     #take off .txt
        classNumStr = int(fileStr.split('_')[0])
        if classNumStr == 9: hwLabels.append(-1)
        else: hwLabels.append(1)
        trainingMat[i,:] = img2vector('%s/%s' % (dirName, fileNameStr))
    return trainingMat, hwLabels    

def testDigits(kTup=('rbf', 10)):
    dataArr,labelArr = loadImages('trainingDigits')
    b,alphas = smoP(dataArr, labelArr, 200, 0.0001, 10000, kTup)
    datMat=mat(dataArr); labelMat = mat(labelArr).transpose()
    svInd=nonzero(alphas.A>0)[0]
    sVs=datMat[svInd] 
    labelSV = labelMat[svInd]
    print ("there are %d Support Vectors" % shape(sVs)[0])
    m,n = shape(datMat)
    errorCount = 0
    for i in range(m):
        kernelEval = kernelTrans(sVs,datMat[i,:],kTup)
        predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b
        if sign(predict)!=sign(labelArr[i]): errorCount += 1
    print ("the training error rate is: %f" % (float(errorCount)/m))
    dataArr,labelArr = loadImages('testDigits')
    errorCount = 0
    datMat=mat(dataArr); labelMat = mat(labelArr).transpose()
    m,n = shape(datMat)
    for i in range(m):
        kernelEval = kernelTrans(sVs,datMat[i,:],kTup)
        predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b
        if sign(predict)!=sign(labelArr[i]): errorCount += 1    
    print ("the test error rate is: %f" % (float(errorCount)/m)) 
[机器学习入门] 李宏毅机器学习笔记-23(Support Vector Machine;支持向量机) [机器学习入门] 李宏毅机器学习笔记-23(Support Vector Machine;支持向量机) PDF VIDEOSupport Vector Machine Outline Hinge LossBinary Classification 分为三步。 δ不可微分,所以变化一下。 step 2 :Loss function 红色这条线就是Square Loss的表现,与 阅读详情

相关推荐

【机器学习】基础入门(3)SVM支持向量机及代码实现

机器学习入门(3)SVM1 支持向量机SVM1.1 支持向量机介绍1.2 软间隔1.3 超平面2 Demo实践2.1 库函数导入2.2 构建数据集2.3 建模2.4 模型预测2.5 模型可视化 1 支持向量机SVM 一篇非常好的SVM理论讲解(点这里) 1.1 支持向量机介绍 STEP 1:构建数据集 import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_blobs # 散点图可视化 X, y

qq_36977302的博客 1223

支持向量机(SVM)基础教程

支持向量机(SVM)基础教程

凭栏落花侧的博客 1586

SVM(支持向量机)入门 (深入浅出讲解原理)

深入浅出讲解SVM的原理和应用,有点类似于傻瓜式的教学方法,个人觉得很有帮助。 SVM入门(一)SVM的八股简介 SVM入门(二)线性分类器Part 1 SVM入门(三)线性分类器Part 2 SVM入门(四)线性分类器的求解——问题的描述Part1 SVM入门(五)线性分类器的求解——问题的描述Part2 SVM入门(六)线性分类器的求解——问题的转化,直观角度 SVM入门(七)为何需要核函数 SVM入门(八)松弛变量。 SVM入门(九)松弛变量(续)。 SVM入门(十)将SVM用于多类分类。

支持向量机(SVM)入门

支持向量机(Support Vector Machine,SVM)是一种监督学习算法,用于分类和回归任务。它的目标是在特征空间中找到一个最优的超平面,将不同类别的数据点分开,同时尽可能地使间隔(margin)最大化。在分类任务中,SVM通过学习一个决策边界,将不同类别的样本分开。

qq_40633401的博客 1007

【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。R语言是一门应用场景广泛、简单易学的程序语言,APSIM模型开发了许多R语言辅助包,在APSIM模型的气候、土壤、管理措施等数据准备,自动化模拟,参数优化和结果分析上都发挥着重要的作用。案例一:APSIM模型输入参数和土壤文件的制备。

2303_79243743的博客 1046

Ubuntu20.04下SRS流媒体服务器的安装与开机自启动优化指南

本文详细介绍了在Ubuntu20.04系统下安装SRS流媒体服务器并优化开机自启动的完整指南。从基础环境准备、服务管理方案对比到systemd自启动深度优化,提供了实用的配置技巧和排查方法,帮助用户快速搭建稳定的流媒体服务环境。特别推荐使用systemd方案实现高效的自启动管理。

weixin_29313239的博客 410

支持向量机(SVM)保姆级入门

SVM 拉格朗日乘数法 核函数

qq_52300384的博客 2756

CloudCompare横截面工具实战:从点云切片到轮廓提取的完整流程

本文详细介绍了CloudCompare软件中Cross Section工具的核心功能与实战流程。从交互式裁剪框的精准操控,到包络线提取的参数设置与优化,再到内部轮廓提取及批量处理技巧,完整解析了如何从三维点云中高效提取建筑立面、隧道断面等关键轮廓信息,是点云数据处理与分析的实用指南。

weixin_29290963的博客 284

支持向量机入门

欢迎关注“小白玩转Python”,发现更多 “有趣”支持向量机(SVM)支持向量机是一种监督式学习算法,既可用于分类问题,也可用于回归问题。支持向量机既可用于线性可分离数据,也可用于非...

Warmer_Sweeter 643

CAPL学习之路-关键字

在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .

jasonj333 6107

CLRNet车道线检测模型在Orin Nano Super开发板上的全栈部署与优化实践

本文详细介绍了将CLRNet车道线检测模型部署到NVIDIA Orin Nano Super开发板的全过程。内容包括:1) Orin开发板硬件规格分析;2) JetPack SDK环境配置与Python虚拟环境搭建;3) CLRNet模型架构解析与PyTorch实现;4) 模型转换与TensorRT加速优化方法。通过系统性的环境配置、模型转换和性能优化,为边缘计算场景下的车道线检测应用提供了完整的解决方案,实现了在Orin平台上的高效部署。

huanghm88的专栏 226

【ML】支持向量机(SVM)从入门到放弃再到掌握

朋友,你通过各种不同的途经初次接触支持向量机(SVM)的时候,是不是会觉得这个东西耳熟能详,感觉大家都会,却唯独自己很难理解? 每一次你的老板或者同仁让你讲解SVM的时候,你觉得你看过这么多资料,使用过这么多次,讲解应该没有问题,但偏偏在分享的时候结结巴巴,漏洞百出? 每一次机器学习相关的面试在问到支持向量机(SVM)的时候,尽管你觉得你都准备好了,可是一次又一次败下阵来,以至于觉得问那些问题...

jhoojhooablido 20万+

Qualcomm 常用NV列表

^ NV ITEM ^ 功能^^ |NV10 |mode prefer,找网模式|新平台使用NV80000| ^NV74 NV74=0关闭自动接听电话^ |NV240 |NV240=FALSE|EVDO出现网络的问题,此项必须设定为FALSE| |NV255 |CDMA规避网络列表(SID/NID号)| |NV256 |

sdrgtywretyeruet的专栏 5768

【深度学习入门_机器学习理论】支持向量机(SVM)

支持向量机 – Support Vector Machine | SVM

qq_35312463的博客 1588

STM32cubeMX配置FreeRTOS软件定时器

文章目录前言1.软件定时器概述一.软件定时器特性二、使用cubeMX生成软件定时器总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。 1.软件定时器概述 一.软件定时器特性 软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期 (period)。 指定类型定时器有两种类型: 1.一次性 这类定时器启动后,它的回调函

m0_49476241的博客 6948

Qt/C++ 音视频开发: 共享解码线程/重复利用解码/极低CPU占用/画面同步/进度同步

通过共享解码线程和重复利用解码技术,可以显著降低CPU占用,提高多媒体应用的性能。同时,画面和进度同步技术保证了视频播放过程的平滑体验。

走向CTO的路上... 987

SVM支持向量机入门教程:轻松掌握机器学习的核心算法

SVM支持向量机入门教程:轻松掌握机器学习的核心算法 【下载地址】SVM支持向量机入门教程 这是一份专为初学者设计的SVM(支持向量机)入门教程,内容深入浅出,帮助您快速掌握这一强大的机器学习算法。教程从基础概念出发,逐步讲解线性分类器、核函数、松弛变量等核心知识,并详细介绍了如何将SVM应用于多类分类问题。每个部分都配...

gitblog_06702的博客 771

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

AI开发:支持向量机(SVM)入门教程- Python 机器学习

支持向量机(SVM)是一种常用于分类任务的机器学习算法。简单来说,它的目标是通过一个“最佳”分隔线(在高维空间中可能是超平面)将不同类别的数据分开。SVM的优势在于,它不仅可以进行线性分类,还能通过一种叫做“核技巧”的方法处理非线性问题。支持向量机(SVM)是一种强大的分类算法,能够处理线性和非线性问题。它的主要优势在于高效分类和抗过拟合能力,尤其适合高维数据。通过核技巧,SVM能够处理复杂的非线性问题。尽管SVM有很多调参的地方,但通过Python中的库,我们可以方便地构建和评估SVM模型。

minstbe的博客 884

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

机器学习推导合集02-SVM简明入门1-硬边界SVM的建模过程

1 前序 第一次遇到SVM,是在写爬虫作验证码的识别。做完预处理将数字弄成特征向量后,发现SVM能将其正确分类,从此对ML感兴趣。我第一步就想自己将sklearn实现的东西自己去写一遍,体会其中的精妙。结果过了一年半,即将步入本三,才敢说自己对机器学习,支持向量机有了浅显的认知。 基于SVM的验证码识别 当时在翻阅网上SVM的教程,发现到处充满了优化的痕迹:KKT, Slater强对偶条件...

liubai01的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

机器学习入门之支持向量机SVM

本文为吴恩达机器学习课程的笔记系列第四篇,主要关于支持向量机(Support Vetor Machines)的算法介绍与推导。

小菜羊的博客 354

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

相较于之前学习的线性回归和神经网络,支持向量机(Supprot Vector Machine,简称SVM)在拟合复杂的非线性方程的时候拥有更出色的能力,该算法也是十分经典的算法之一。接下来我们需要学习这种算法首先我们回顾逻辑回归中的经典假设函数,如下图:对于任意一个实例xy,当y=1的时候,我们希望hθ​x≈1,也就是θTx>>0;当y=0的时候,我们希望ht​hetax≈0,也就是θTx

weixin_45434953的博客 554

机器学习笔记2:支持向量机SVM基础入门

机器学习笔记2:支持向量机SVM基础概念

ChenHaoUESTC的博客 781

支持向量机(SVM):从入门到精通的机器学习利器

支持向量机(SVM,Support Vector Machine)是机器学习领域中一种经典且强大的算法,以其出色的分类能力和对高维数据的处理能力而闻名。无论是初学者还是进阶开发者,掌握SVM都能为你的机器学习之旅增添一大利器。它广泛应用于图像识别(如人脸检测)、文本分类等领域,展现了强大的实用价值。本文将带你从SVM的基础知识出发,逐步深入到核心原理、核函数的应用以及优缺点分析,最后通过一个图像分类的实战案例展示SVM的魅力。无论你是机器学习新手,还是希望深入理解SVM的高阶读者,这里都有你需要的内容。

吴师兄大模型的博客 1246

【机器学习入门】一文读懂线性支持向量机SVM

本身就偏离了正常位置,但是在前面的SVM模型中,我们要求所有的样本数据都必须满足约束,如果不要这些噪声数据还好,当加入这些outlier后导致划分超平面被挤歪了,如下图所示,对支持向量机的泛化性能造成很大的影响。为了解决这一问题,我们需要允许某一些数据点不满足约束,即可以在一定程度上偏移超平面,同时使得不满足约束的数据点尽可能少,这便引出了**“软间隔”支持向量机**的概念。综上所述,对于有噪音的线性不可分数据,我们选择放松其约束,相对于基于严格约束的硬间隔最大化来说,这种做法称为。

跟着大数据和AI去旅行 900

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

本文介绍了支持向量机(SVM)的核心原理与sklearn应用。主要内容包括:SVM通过最大化分类间隔寻找最优超平面,关键概念包括支持向量、软间隔和核函数;重点参数C控制分类严格度,gamma影响样本作用范围,kernel处理非线性问题;通过智能寝室分配案例演示了数据预处理、模型训练与评估流程。文章还详解了sklearn的SVC API参数,并提供了调参建议,适合机器学习初学者快速掌握SVM的核心思想与实践方法。

qq_74148481的博客 402

机器学习-支持向量机(SVM)入门

本节文章主要是梳理一下支持向量机相关知识点,整合其他作者的内容,进行简化便于理解; 目录 0.了解SVM(概念,类别,特点) 1.线性可分SVM和拉格朗日函数 距离的计算公式推导 拉格朗日函数求解距离 2.非线性SVM和核函数 3.线性SVM(软间隔支持向量机) 4.优缺点及适用场景 5.小结 … … … 0.了解SVM: **0.1定义 支持向量机(Support Vector Ma...

zerone 939
上一篇: 机器学习入门-线性模型(二)
下一篇: 机器学习入门-决策树(二)
CallMeSP
博客等级 码龄10年 48粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值