gpt4 book ai didi

python - 使用 LibSVM 计算与 Mean/Stddev 对的最近匹配

转载 作者:太空狗 更新时间:2023-10-29 22:28:12 25 4
gpt4 key购买 nike

我是 SVM 的新手,我正在尝试使用 Python 接口(interface)来 libsvm对包含均值和标准差的样本进行分类。但是,我得到了荒谬的结果。

此任务是否不适合 SVM,或者我使用 libsvm 时是否有错误?下面是我用来测试的简单 Python 脚本:

#!/usr/bin/env python
# Simple classifier test.
# Adapted from the svm_test.py file included in the standard libsvm distribution.
from collections import defaultdict
from svm import *
# Define our sparse data formatted training and testing sets.
labels = [1,2,3,4]
train = [ # key: 0=mean, 1=stddev
{0:2.5,1:3.5},
{0:5,1:1.2},
{0:7,1:3.3},
{0:10.3,1:0.3},
]
problem = svm_problem(labels, train)
test = [
({0:3, 1:3.11},1),
({0:7.3,1:3.1},3),
({0:7,1:3.3},3),
({0:9.8,1:0.5},4),
]

# Test classifiers.
kernels = [LINEAR, POLY, RBF]
kname = ['linear','polynomial','rbf']
correct = defaultdict(int)
for kn,kt in zip(kname,kernels):
print kt
param = svm_parameter(kernel_type = kt, C=10, probability = 1)
model = svm_model(problem, param)
for test_sample,correct_label in test:
pred_label, pred_probability = model.predict_probability(test_sample)
correct[kn] += pred_label == correct_label

# Show results.
print '-'*80
print 'Accuracy:'
for kn,correct_count in correct.iteritems():
print '\t',kn, '%.6f (%i of %i)' % (correct_count/float(len(test)), correct_count, len(test))

域看起来相当简单。我希望如果它被训练知道 2.5 的平均值意味着标签 1,那么当它看到 2.4 的平均值时,它应该返回标签 1 作为最可能的分类。但是,每个内核的准确率为 0%。这是为什么?

一些旁注,有没有办法在终端中隐藏 libsvm 转储的所有冗长训练输出?我搜索了 libsvm 的文档和代码,但找不到任何方法来关闭它。

另外,我曾想在我的稀疏数据集中使用简单的字符串作为键(例如 {'mean':2.5,'stddev':3.5})。不幸的是,libsvm 只支持整数。我尝试使用字符串的长整数表示形式(例如 'mean' == 1109110110971110),但 libsvm 似乎将它们截断为正常的 32 位整数。我看到的唯一解决方法是维护一个单独的“ key ”文件,将每个字符串映射到一个整数('mean'=0,'stddev'=1)。但显然这会很痛苦,因为我必须维护和保留第二个文件以及序列化分类器。有没有人看到更简单的方法?

最佳答案

问题似乎出在将多类预测与概率估计相结合。

如果您将代码配置为不进行概率估计,它实际上会起作用,例如:

<snip>
# Test classifiers.
kernels = [LINEAR, POLY, RBF]
kname = ['linear','polynomial','rbf']
correct = defaultdict(int)
for kn,kt in zip(kname,kernels):
print kt
param = svm_parameter(kernel_type = kt, C=10) # Here -> rm probability = 1
model = svm_model(problem, param)
for test_sample,correct_label in test:
# Here -> change predict_probability to just predict
pred_label = model.predict(test_sample)
correct[kn] += pred_label == correct_label
</snip>

有了这个改变,我得到:

--------------------------------------------------------------------------------
Accuracy:
polynomial 1.000000 (4 of 4)
rbf 1.000000 (4 of 4)
linear 1.000000 (4 of 4)

如果您将训练集中的数据加倍(即每个数据点包含两次),则使用概率估计进行预测确实有效。但是,无论如何,我找不到对模型进行参数化,以便具有概率的多类预测仅适用于原始的四个训练点。

关于python - 使用 LibSVM 计算与 Mean/Stddev 对的最近匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com