我是SVM的新手,我正在尝试使用Python接口来libsvm来对包含mean和stddev的样本进行分类.但是,我得到了荒谬的结果.
这个任务不适合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 …Run Code Online (Sandbox Code Playgroud) 使用机器学习库PyML时,我遇到了一个恼人的问题.PyML使用libsvm来训练SVM分类器.问题是libsvm将一些文本输出到标准输出.但因为那是在Python之外我不能拦截它.我尝试使用问题中描述的方法在Python中静默函数的标准输出,而不会破坏sys.stdout并恢复每个函数调用,但这些都没有帮助.
有什么方法可以做到这一点.修改PyML不是一种选择.
我正在尝试使用libsvm,并按照示例在软件附带的heart_scale数据上训练svm.我想使用我自己预先计算的chi2内核.培训数据的分类率降至24%.我确信我正确地计算了内核,但我想我一定是做错了.代码如下.你能看到任何错误吗?非常感谢帮助.
%read in the data:
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
%read somewhere that the kernel should not be sparse
ttrain = full(train_data)';
ttest = full(test_data)';
precKernel = chi2_custom(ttrain', ttrain');
model_precomputed = svmtrain2(train_label, [(1:150)', precKernel], '-t 4');
Run Code Online (Sandbox Code Playgroud)
这是内核预先计算的方式:
function res=chi2_custom(x,y)
a=size(x);
b=size(y);
res = zeros(a(1,1), b(1,1));
for i=1:a(1,1)
for j=1:b(1,1)
resHelper = chi2_ireneHelper(x(i,:), y(j,:));
res(i,j) = resHelper;
end
end
function resHelper = chi2_ireneHelper(x,y)
a=(x-y).^2;
b=(x+y);
resHelper = sum(a./(b + eps));
Run Code Online (Sandbox Code Playgroud)
使用不同的svm实现(vlfeat),我获得了训练数据的分类率(是的,我在训练数据上测试,只是为了看看发生了什么)大约90%.所以我很确定libsvm结果是错误的.
寻找libSVM的C++接口的教程和/或示例代码.具体来说,我想对使用SIFT或SURF特征描述符提取的特征进行分类.
我试过在网站上查找并没有找到任何此类文档/示例代码.
我从R包e1071调用一个R函数,它与libsvm(一个C程序)接口.此函数将C(printf)警告消息传递给R控制台.我知道这是因为警告消息的形式是(警告:......)而R警告消息是大写的(即警告:......).
我已经尝试了一切来摆脱R中的这些消息(下沉,抑制警告,看不见),但似乎没有任何效果.
有任何想法吗?
谢谢!
我有multiProcessing.Process目标函数采用输入和输出队列的对象.
在输出队列中,他们放置了一些数据,即带有内部指针的包装ctypes结构.当然,pickle应该序列化数据的模块会破坏:
ValueError:包含指针的ctypes对象无法进行pickle
我可以以某种方式从我的子进程中获取带有指针的ctypes结构而不将它们转储到文件中吗?
代码如下
# -*- coding: utf-8 -*-
import multiprocessing as mp
from liblinear import *
from liblinearutil import *
def processTarget(inQueue, outQueue):
while(not inQueue.empty()):
inVal = inQueue.get()
#training model
y, x = [1,-1], [{1:inVal, 3:3*inVal}, {1:-1,3:-1}]
prob = problem(y, x)
param = parameter('-c 4 -B 1')
m = train(prob, param)
outQueue.put((inVal * 2, m))
print "done", inVal
inQueue.task_done()
def Main():
processes = []
inQueue = mp.JoinableQueue()
for i in xrange(10):
inQueue.put(i)
outQueue = …Run Code Online (Sandbox Code Playgroud) 我有一个数据集来分类.通过使用KNN算法,我得到90%的准确度,但通过使用SVM我只能超过70%.SVM并不比KNN好.我知道这可能是愚蠢的问题,但是,SVM的参数是什么,它将给出几乎近似的结果作为KNN算法.我在matlab R2008上使用libsvm包
我想知道coef0在多项式和sigmoid内核下SVC 的参数有多重要.据我了解,它是截距项,只是线性回归中的常数,用于将函数从零偏移.但据我所知,SVM(scikit使用libsvm)应该找到这个值.
什么是一个很好的通用范围来测试(有吗?).例如,通常情况下C,安全选择是10 ^ -5 ... 10 ^ 5,以指数步长上升.
但是,对于coef0,该值似乎高度依赖于数据,我不确定如何自动为每个数据集上的每个网格搜索选择好的范围.有什么指针吗?
我有一个数据集,它是一些嵌套映射的形式,其Scala类型是:
Map[String, (LabelType,Map[Int, Double])]
Run Code Online (Sandbox Code Playgroud)
第一个String键是每个样本的唯一标识符,值是包含标签(-1或1)的元组,以及嵌套映射,它是与之关联的非零元素的稀疏表示.样品.
我想将这些数据加载到Spark(使用MUtil)并训练和测试一些机器学习算法.
使用LibSVM的稀疏编码将此数据写入文件很容易,然后将其加载到Spark中:
writeMapToLibSVMFile(data_map,"libsvm_data.txt") // Implemeneted some where else
val conf = new SparkConf().setAppName("DecisionTree").setMaster("local[4]")
val sc = new SparkContext(conf)
// Load and parse the data file.
val data = MLUtils.loadLibSVMFile(sc, "libsvm_data.txt")
// Split the data into training and test sets
val splits = data.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(0), splits(1))
// Train a DecisionTree model.
Run Code Online (Sandbox Code Playgroud)
我知道直接加载data变量应该很容易data_map,但我不知道如何.
任何帮助表示赞赏!