构建 SVM 会引发错误,因为我的训练数组有一个额外的维度 [关闭]

Posted

技术标签:

【中文标题】构建 SVM 会引发错误,因为我的训练数组有一个额外的维度 [关闭]【英文标题】:Building SVM throws error because my training array has an extra dimension [closed] 【发布时间】:2021-12-13 17:26:06 【问题描述】:

我正在创建一个支持向量机。下面的模型读取以“log”开头的数组作为 SVM 图中的向量。数组 log15-log21 将被归类为“c”,而行 log22-log36 将被归类为“d”。目标是以“log”行的格式为 svm 提供另一个向量,并让 svm 将其标记为“c”或“d”。

from sklearn import svm

log15 = [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
log16 = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
log17 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
log18 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0]
log19 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]
log20 = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
log21 = [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

log22 = [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log23 = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log24 = [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log25 = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log26 = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log27 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log28 = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log29 = [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log30 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log31 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
log32 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log33 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log34 = [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log35 = [0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
log36 = [0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

cLines = [log15, log16, log17, log18, log19, log20, log21]
dLines = [log22, log23, log24, log25, log26, log27, log28, log29, log30, log31, log32, log33, log34, log35, log36]
lines = [log15, log16, log17, log18, log19, log20, log21, log22, log23, log24, log25, log26, log27, log28, log29, log30, log31, log32, log33, log34, log35, log36]

X = [lines]
y = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]  #0 for c, 1 for d
clf = svm.SVC()
clf.fit(X, y)

print(clf.predict([[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]]))

当我运行上面的代码时,我得到了这个错误:

Traceback (most recent call last):
  File "C:/Users/craig/Code/Python Programs/TensorFlowLabs/svm.py", line 34, in <module>
    clf.fit(X, y)
  File "c:\Users\craig\Programming Languages\Lib\site-packages\sklearn\svm\_base.py", line 196, in fit
    accept_large_sparse=False,
  File "c:\Users\craig\Programming Languages\Lib\site-packages\sklearn\base.py", line 576, in _validate_data
    X, y = check_X_y(X, y, **check_params)
  File "c:\Users\craig\Programming Languages\Lib\site-packages\sklearn\utils\validation.py", line 968, in check_X_y
    estimator=estimator,
  File "c:\Users\craig\Programming Languages\Lib\site-packages\sklearn\utils\validation.py", line 788, in check_array
    % (array.ndim, estimator_name)
builtins.ValueError: Found array with dim 3. Estimator expected <= 2.

我看到的在线指南没有用逗号分隔的向量,但向量数组中的各个字符具有重要意义,所以我不希望 1 和 0 被“混淆”,如果这有意义的话.

【问题讨论】:

请不要在您的帖子中添加与问题本身无关的内容(您是谁、您的背景、您未来想要实现的目标、提前致谢等)- 简明扼要要点(已编辑)。 @desertnaut 该信息是相关的。我尽量将背景信息保持在最低限度,但重要的是要知道我要完成什么,这不像我写了 3 个完整的段落来详细解释这个项目。我什至说过“向量的内容背后是有含义的,但我不会用琐碎的东西来混淆你”。 恐怕我看不到你编程了多少年,如果这是你的第一个项目还是你的第 10 个项目,在做其他事情之前宣布你正在尝试做的事情,并提前感谢是与此处的编程问题有任何相关性;如果您不相信我,请看答案!请注意SO is not a (personalized) help desk,这里的问答的想法是让它们在未来可重复使用并对其他人有所帮助(可能具有完全不同的背景和最终目标)。 请注意,对于可能的受访者来说,简明扼要实际上是一个非常真实的礼貌,他们不必通过一堆实际上无用的材料来了解看看发生了什么,他们是否可以提供帮助;在同样的意义上,“提前感谢”等实际上是not considered polite here。 重读 How to ask 也很有用:“假装你正在和一个忙碌的同事交谈,必须总结你的全部一句话问题:你能包括哪些细节来帮助别人识别和解决你的问题?”。可以说,这不是关于您的编程、ML 或项目旅程的迷你背景,因为答案清楚地表明...... 【参考方案1】:

您将 X 定义为一个数组(您正在使用括号)。这就是您收到错误的原因。改变你定义 X 的方式,它应该可以工作:

X = lines

【讨论】:

以上是关于构建 SVM 会引发错误,因为我的训练数组有一个额外的维度 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv SVM训练火灾检测[关闭]

在 OpencV 中训练 SVM 分类器?

R中的svm,训练数据集[关闭]

R - SVM 训练后的奇怪错误/警告 (e1071)

训练 SVM 时出现 OpenCV 错误(错误参数)

尝试用二维数组构建地图[重复]