会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132358个问题
人工智能/第六阶段:机器学习-线性分类/逻辑回归 1楼
人工智能/第六阶段:机器学习-线性分类/逻辑回归 2楼

1. SVM回归模型的目标

SVM回归模型(Support Vector Regression, SVR)的目标是找到一个函数 f(x),使得它能够很好地拟合数据,同时尽量保持模型的简单性(避免过拟合)。它的核心思想是:

  • 允许一定的误差:SVR不要求所有数据点都严格落在回归线上,而是允许数据点在一个“容忍范围”内偏离。

  • 最大化容忍范围:SVR会尽量让更多的数据点落在这个容忍范围内,同时让这个范围尽可能宽。


2. 损失函数的角色

损失函数的作用是衡量模型的预测值与真实值之间的差距。在SVR中,损失函数的设计决定了模型如何对待误差:

  • 容忍范围内的误差:如果数据点的预测值与真实值的差距在容忍范围内,则认为误差为0,模型不会受到惩罚。

  • 容忍范围外的误差:如果数据点的预测值与真实值的差距超出容忍范围,则模型会受到惩罚,惩罚的大小与超出范围的程度成正比。


3. SVR的损失函数:ε-不敏感损失

SVR使用一种叫做 ε-不敏感损失(ε-insensitive loss) 的函数来度量误差。它的工作原理如下:

  • 设定一个容忍范围(ε):这个范围是一个固定的值,比如 ε = 0.1。如果预测值与真实值的差距在 ±ε 范围内,则认为误差为0。

  • 超出范围的误差:如果预测值与真实值的差距超过 ε,则计算超出部分的绝对值作为误差。

举个例子:

  • 假设真实值是 5,ε = 1。

    • 如果预测值是 5.5,误差为 0(因为 5.5 - 5 = 0.5 < 1)。

    • 如果预测值是 6.5,误差为 0.5(因为 6.5 - 5 = 1.5,超出 ε 的部分是 0.5)。


4. SVR的优化目标

SVR的优化目标是:

  • 最小化误差:尽量让所有数据点的误差(超出 ε 的部分)总和最小。

  • 保持模型简单:同时,尽量让回归函数 f(x) 的复杂度低(通过正则化项控制)。


5. 通俗总结

  • 容忍范围:SVR允许数据点在一定的范围内偏离回归线,这个范围由 ε 决定。

  • 误差计算:只有在数据点超出这个范围时,才会计算误差。

  • 目标:SVR的目标是找到一个回归线,使得大多数数据点都落在容忍范围内,同时让回归线尽量简单。


人工智能/第六阶段:机器学习-线性分类/SMO优化算法 3楼

1. One-vs-Rest (OVR)

基本概念

  • OVR,也称为 One-vs-All (OVA),是一种将多类分类问题转化为多个二分类问题的方法。

  • 对于有 K 个类别的分类问题,OVR 会训练 K 个二分类器。每个分类器负责区分一个类别和其余所有类别。

实现步骤

  1. 训练阶段

    • 对于每个类别 ii=1,2,,K),训练一个二分类器 fi

    • 分类器 fi 的目标是将类别 i 的样本标记为正类,其余类别的样本标记为负类。

  2. 预测阶段

    • 对于一个新的样本,使用所有 K 个分类器进行预测。

    • 每个分类器 fi 会输出一个置信度分数(如概率或决策函数值)。

    • 最终,选择置信度分数最高的类别作为预测结果。

优点

  • 简单直观,易于实现。

  • 只需要训练 K 个分类器,计算量相对较小。

缺点

  • 如果类别数量 K 很大,可能会导致类别不平衡问题,因为每个分类器的负类样本数量远多于正类样本。

  • 分类器之间的决策边界可能不够精确。

2. One-vs-One (OVO)

基本概念

  • OVO 是另一种将多类分类问题转化为多个二分类问题的方法。

  • 对于有 K 个类别的分类问题,OVO 会训练 K(K1)2 个二分类器。每个分类器负责区分一对类别。

实现步骤

  1. 训练阶段

    • 对于每一对类别 (i,j)i<j),训练一个二分类器 fij

    • 分类器 fij 的目标是将类别 i 的样本标记为正类,类别 j 的样本标记为负类。

  2. 预测阶段

    • 对于一个新的样本,使用所有 K(K1)2 个分类器进行预测。

    • 每个分类器 fij 会投票给其中一个类别。

    • 最终,选择得票最多的类别作为预测结果。

优点

  • 每个分类器只关注两个类别,避免了类别不平衡问题。

  • 决策边界通常更加精确。

缺点

  • 需要训练的分类器数量较多,计算量较大,尤其是当类别数量 K 很大时。

  • 预测阶段的计算复杂度较高,因为需要运行大量的分类器。

3. OVR 和 OVO 的比较

特性OVR (One-vs-Rest)OVO (One-vs-One)
分类器数量KK(K1)2
训练复杂度较低较高
预测复杂度较低较高
类别不平衡问题可能存在较少存在
决策边界精确度一般较高

4. 选择 OVR 还是 OVO?

  • 选择 OVR:当类别数量 K 较大时,OVR 的计算量较小,适合处理大规模数据集。

  • 选择 OVO:当类别数量 K 较小时,OVO 可以提供更精确的决策边界,适合处理小规模数据集。


人工智能/第六阶段:机器学习-线性分类/SMO优化算法 4楼

SVM和SMO算法之间的关联

1. 支持向量机(SVM)简介

SVM是一种用于分类和回归的监督学习模型。在分类问题中,SVM的目标是找到一个超平面,能够将不同类别的数据点分开,并且使得两个类别之间的间隔(margin)最大化。这个超平面可以表示为:

wx+b=0
其中,w 是权重向量,b 是偏置项。

2. SVM的优化问题

SVM的训练过程可以转化为一个凸二次规划(Quadratic Programming, QP)问题。对于线性可分的情况,优化问题可以表示为:

minw,b12w2

subject to yi(wxi+b)1,i
其中,yi 是数据点的标签,xi 是数据点的特征向量。

3. 序列最小优化(SMO)算法

SMO算法是一种用于高效求解SVM优化问题的算法。它由John Platt在1998年提出,专门用于解决大规模数据集的SVM训练问题。

SMO算法的核心思想

SMO算法通过将大的QP问题分解为一系列小的QP问题来求解。具体来说,它每次只选择两个拉格朗日乘子(Lagrange multipliers)进行优化,而固定其他乘子。这种方法大大减少了计算复杂度,使得SMO算法在处理大规模数据集时非常高效。

SMO算法的步骤

  1. 选择两个拉格朗日乘子:每次选择两个乘子 αi 和 αj 进行优化。

  2. 优化这两个乘子:通过解析方法更新这两个乘子,使得目标函数最大化。

  3. 更新模型参数:根据更新后的乘子,重新计算权重向量 w 和偏置项 b

  4. 检查收敛条件:如果满足收敛条件,则停止;否则,重复上述步骤。

4. SVM和SMO的关联

  • SMO是SVM的求解器:SMO算法是专门为求解SVM的优化问题而设计的。它通过分解大的QP问题为一系列小的QP问题,使得SVM的训练过程更加高效。

  • 高效性:SMO算法在处理大规模数据集时表现出色,因为它每次只优化两个乘子,减少了计算复杂度。

  • 广泛应用:由于SMO算法的高效性,它被广泛应用于各种SVM实现中,如LIBSVM等。

5. 总结

SVM是一种强大的分类和回归模型,而SMO算法是专门为高效求解SVM优化问题而设计的算法。通过将大的QP问题分解为一系列小的QP问题,SMO算法大大提高了SVM的训练效率,使得SVM在处理大规模数据集时更加实用。希望这个解释能帮助你更好地理解SVM和SMO算法之间的关联。


人工智能/第六阶段:机器学习-线性分类/SMO优化算法 5楼
人工智能/第六阶段:机器学习-线性分类/SVM支持向量机算法 6楼
人工智能/第六阶段:机器学习-线性分类/逻辑回归 7楼
人工智能/第六阶段:机器学习-线性分类/逻辑回归 8楼
人工智能/第六阶段:机器学习-线性分类/逻辑回归 9楼
人工智能/第六阶段:机器学习-线性分类/逻辑回归 10楼
人工智能/第六阶段:机器学习-线性分类/逻辑回归 11楼
人工智能/第六阶段:机器学习-线性分类/SVM支持向量机算法 12楼

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
import matplotlib.pyplot as plt

iris=datasets.load_iris()
# print(list(iris.keys()))
# print(iris['DESCR'])
# print(iris['feature_names'])
X=iris['data'][:,3:]
# print(X)
# print(iris['target'])
y=iris['target']
print(X)
print(y)

param_grid={'C':[1e3,5e3,1e4,5e4,1e5],
            'gamma':[0.0001,0.0005,0.001,0.005,0.01,0.1]}
model1=GridSearchCV(SVC(kernel='rbf',class_weight='balanced'),param_grid,cv=5)
model1=model1.fit(X,y)
model2=GridSearchCV(SVC(kernel='sigmoid',class_weight='balanced'),param_grid,cv=5)
model2=model2.fit(X,y)

test_labels=np.zeros(150)
test_labels[75:150]=1
result1=model1.predict(X)

test_labels=np.zeros(150)
test_labels[75:150]=1
result2=model2.predict(X)

print(confusion_matrix(test_labels,result1))
print(confusion_matrix(test_labels,result2))
model3=GridSearchCV(SVC(kernel='poly',class_weight='balanced'),param_grid,cv=5)
model3=model3.fit(X,y)

test_labels=np.zeros(150)
test_labels[75:150]=1
result3=model3.predict(X)
print(confusion_matrix(test_labels,result3))

model4=GridSearchCV(SVC(kernel='linear',class_weight='balanced'),param_grid,cv=5)
test_labels=np.zeros(150)
test_labels[75:150]=1
model4=model4.fit(X,y)
result4=model4.predict(X)
print(confusion_matrix(test_labels,result4))

改变四个核函数之后训练出来的模型为什么后面三个结果是一样的,这是巧合还是就是会出现这种情况

人工智能/第六阶段:机器学习-线性分类/SVM支持向量机算法 13楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637