- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在浏览 Andrej Karpathy 的 Hacker's guide to Neural Networks .在第 2 章:机器学习、二元分类中,他给出了一个(非常基础的)SVM 示例。这是 Karpathy 的代码:
var a = 1, b = -2, c = -1; // initial parameters
for(var iter = 0; iter < 400; iter++) {
// pick a random data point
var i = Math.floor(Math.random() * data.length);
var x = data[i][0];
var y = data[i][1];
var label = labels[i];
// compute pull
var score = a*x + b*y + c;
var pull = 0.0;
if(label === 1 && score < 1) pull = 1;
if(label === -1 && score > -1) pull = -1;
// compute gradient and update parameters
var step_size = 0.01;
a += step_size * (x * pull - a); // -a is from the regularization
b += step_size * (y * pull - b); // -b is from the regularization
c += step_size * (1 * pull);
}
以下是我的 Python 版本:
import numpy
import random
X = numpy.array([[1.2, 0.7],
[-0.3, 0.5],
[-3, -1],
[0.1, 1.0],
[3.0, 1.1],
[2.1, -3]])
labels = [1, -1, 1, -1, -1, 1]
a = 1
b = -2
c = -1
l = len(X)-1
steps = 400
for n in range(0, steps):
i = random.randint(0, l)
x = X[i][0]
y = X[i][1]
label = labels[i]
if n == 0:
for j in range(0, l+1):
x = X[j][0]
y = X[j][1]
label = labels[j]
score = a*x + b*y + c
print x,",",y,"-->", label, "vs.", score
score = a*x + b*y + c
pull = 0.0
if label == 1 and score < 1:
pull = 1
if label == -1 and score > -1:
pull = -1
step_size = 0.01
a += step_size * (x * pull - a)
b += step_size * (y * pull - b)
c += step_size * (1 * pull)
if n == steps-1:
print ""
for j in range(0, l+1):
x = X[j][0]
y = X[j][1]
label = labels[j]
score = a*x + b*y + c
print x,",",y,"-->", label, "vs.", score
问题是,即使在超过建议的 400 次迭代之后,对于某些向量,参数也不会产生正确的标签。
这是 400 次迭代后的输出:
1.2 , 0.7 --> 1 vs. -0.939483353298
-0.3 , 0.5 --> -1 vs. -0.589208602761
-3.0 , -1.0 --> 1 vs. 0.651953448705
0.1 , 1.0 --> -1 vs. -0.921882586141
3.0 , 1.1 --> -1 vs. -1.44552077331
2.1 , -3.0 --> 1 vs. 0.896623596303
“-->”后的第一个值是正确的标签,第二个值是分数,即学习的标签。
除第一个标签外,所有矢量/学习标签都是正确的(在被赋予具有正确符号的值的意义上)。
我不确定这是什么原因:我的代码有误吗?我检查了几次,但没有找到任何东西。或者我在这里忘记了一些特定于 Python 的东西。或者,最后,在这种情况下是否有一些与 ML 相关的原因导致没有学习到正确的标签。尽管对此表示怀疑,否则 Karpathy 得到正确的结果是没有意义的。
非常感谢任何意见或帮助解决这个问题。
最佳答案
我相信我找到了问题:
(A) 您的数据集没有线性切割。
(B) Karpathy 的“蒙特卡洛”梯度下降法在这样的数据集上颠簸。
(C) 你和 Karpathy 使用了不同的数据。
DATA SETS
label Karpathy's yours
1 [1.2, 0.7] [1.2, 0.7]
-1 [-0.3, -0.5] [-0.3, 0.5]
1 [3.0, 0.1] [-3, -1]
-1 [-0.1, -1.0] [0.1, 1.0]
-1 [-1.0, 1.1] [3.0, 1.1]
1 [2.1, -3] [2.1, -3]
你给的数据集差不多有一条切割线(超平面)大概在y = 1/3x + 1/2,但是接近直线的三个点不断地争论除法。事实证明,最好的分隔符明显不同,将 [1.2, 0.7] 严重地留在了错误的一边,但对此非常不高兴。
原始数据在大约 y = -3x + 1 处有一条整齐的切割线,该算法大致近似为(四舍五入)0.6x - 0.1y - 0.5
同样,该算法正在寻找最小成本拟合,而不是最宽分离 channel 的“纯”SVM。即使有一条整齐的切割线,该算法也不会收敛;相反,它会设法接近可接受的解决方案。
它选择一个随机点。如果该点被可靠地分类——分数是正确的标志,大小 > 1——什么都不会发生。但是,如果该点位于线的错误一侧,或者距离太近而不舒适,则它会拉取参数以获得更有利的处理。
除非 channel 宽度为 2 个单位,否则争议领土内的点将继续轮流来回插入它。没有收敛标准……而且,事实上,在某一点之后没有收敛保证。
仔细查看 Karpathy 的代码:主要算法对分数 < 1 或 > -1 的数据点进行更改(取决于训练类别)。然而,如果结果的符号是正确的,评估算法就宣告胜利。这是合理的,但与训练函数并不完全一致。在我的试验中,第一个点的分数总是小于 0.07,但实际值在 0 的两边华夫饼。其他点很清楚 0,但只有两个点超过 1。有四个点争论这条线应该在哪里。
这是否为您解决了问题?
关于python - 我的玩具 SVM 的 Python 版本有什么错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426736/
如果我在 lrge 训练集上训练 SVM,并且类变量是 True 或 False,那么与训练集中的 False 值数量相比,True 值很少会影响训练模型/结果吗?他们应该平等吗?如果我的训练集的 T
假设我的特征向量是 (x1, x2, ...xn) 谁能给我一个代码来使用 libSVM 训练一类 SVM? 我应该如何使用交叉验证来学习参数。 最佳答案 这可能会帮助你 label=ones(Num
我提前为这个问题的新颖性道歉,但我被卡住了。我正在尝试解决这个问题, 我可以做第 i)-1v) 部分,但我卡在了 v 上。我知道计算余量 y,你可以 y=2/||W|| 而且我知道W是超平面的法线,只
我有以下 R 配置: 操作系统:LinuxR 版本 3.0.1 (2013-05-16)rmr2 版本 2.2.1rhdfs 版本 1.0.6hadoop 版本 1.2.0 如何使用带 rmr2 包的
我想尝试不同的嵌入,例如 Word2Vec、ELMo 和 BERT,但我有点困惑是使用词嵌入还是句子嵌入,以及为什么。我将嵌入用作 SVM 分类器的特征输入。 谢谢。 最佳答案 虽然这两种方法都可以证
几乎所有的例子都是基于数字的。在文本文档中,我有文字而不是数字。 那么你能告诉我如何使用这些算法进行文本文档分类的简单示例吗? 我不需要代码示例,只需要逻辑 伪代码将有很大帮助 最佳答案 常用的方法是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我目前正处于语音识别的讨论阶段项目,我使用MFCC特征提取,但是从函数返回的MFCC特征是一个矩阵,例如每个语音文件(wav)的(20,38)特征矩阵。但是我如何将此功能传递给 SVM 分类器。对于
请我喜欢用 SIFT DESCRIPTOR 和 SVM 将一组图像分类为 4 类。现在,使用 SIFT 提取器,我得到了不同大小的关键点,例如 img1 有 100 个关键点,img2 有 55 个关
我有一组图像。我想学习一类支持向量机(OC-SVM)来模拟特定类(正)的分布,因为我没有足够的例子来代表其他类(负)。我对 OC-SVM 的理解是,它试图将数据与源分离,换句话说,它试图学习一个超球体
我正在使用 scikit-learn 使用 SVM 构建一些预测模型。我有一个包含大约 5000 个示例和大约 700 个特征的数据集。我在我的训练集上使用 18x17 网格搜索进行 5 折交叉验证,
这是我考试时提出的问题。我给出了以下答案,我的得分是0分。教授甚至不同意给予任何部分的认可,也没有告诉我我的答案有什么问题。谁能帮我找出我的答案有什么问题吗? 这是我在考试中给出的答案。缺点是:1)
tune.svm() 和 best.svm() 有什么区别。 当我们调整 svm 内核的参数时,我们不希望总是为我们的模型选择最佳值。 请原谅,因为我是 R 和机器学习的新手。 我注意到在调整 svm
我尝试使用 OpenCV2.3 实现基于 SVM 和 HOG 的人员检测系统。但是我卡住了。 我走到这一步:我可以从图像数据库计算 HOG 值,然后我用 LIBSVM 计算 SVM 向量,所以我得到例
Mahout(机器)中围绕 SVM(支持向量机)的任何新发展Learning With Hadoop) 使用 Hadoop?最近 SVM 实现被添加到 Mahout 中。我打算使用 SVM。有人尝试过
我使用 sklearn.svm.SVC 构建支持向量分类器,如下所示。 import numpy as np from sklearn.svm import SVC svc=SVC(proba
我想看看模型是否收敛于我的交叉验证。我如何增加或减少 sklearn.svm.SVC 中的时代? 目前: SVM_Model = SVC(gamma='auto') SVM_Model.fit(X_t
与在 SVM 的相同成本函数中使用 2-范数权重相比,我们如何通过在成本函数中使用 1-范数权重来提高稀疏性。 对于 1-范数:成本函数 - 最小化 ||w||_1 对于 2-范数:成本函数 - 最小
事实上,我不是一个经验丰富的 C++ 程序员,我是一个 C# 程序员,正如你所知道的,它有很大的不同,根据我的机器学习经验,我只使用了 matlab,所以如果我有一些,请原谅概念错误。 我正在尝试在
我正在尝试使用 OpenCV 中的 SVM 加载函数加载 .xml 文件,然后使用预测函数对交通标志进行分类。当到达预测函数的执行时抛出错误: Unhandled exception at 0x000
我是一名优秀的程序员,十分优秀!