如何让ksvm模型知道数据集中的前100个数字是来自一个传感器的所有时间序列数据,而接下来的100个数字是来自另一个传感器等的所有时间序列数据,用于六个独立的时间序列传感器输入?或者(也许更一般地),如何向SVM呈现二维输入数据?
我需要二进制是/否预测模型的过程具有六个非周期时间序列输入,所有输入具有相同的采样频率.事件触发数据收集的开始,并且在预定时间之后我需要是/否预测(优选地包括正确性概率输出).应该产生"是"与"否"的时间序列输入的特征是未知的,但是已知的是在每个输入时间序列数据和最终结果之间应该存在某种相关性.所有输入都存在明显的噪音.有意义的信息和噪声都作为短持续时间突发出现在输入上(有意义的突发总是在给定输入源的相同的一般时间内),但是识别哪些突发是有意义的以及哪些是噪声是困难的; 即,对于一个输入在"正确"时间发生突发的事实不一定表示"是"输出; 它可能只是噪音.要知道预测是否应为"是",模型需要以某种方式合并来自所有六个时间序列输入的信息.我收集了大约900'不'结果和100'是'结果的先前数据.
我对R和SVM 都很陌生,但我想我想使用SVM模型(kernlab的ksvm).我无法弄清楚如何向其提供输入数据.我也不知道如何告诉ksvm数据是时间序列数据,或者是否相关.我尝试使用Rattle GUI前端来从R中提取我的数据来自csv文件,但我无法弄清楚如何将所有六个输入的时间序列数据呈现到ksvm模型中.作为csv文件输入,似乎导入所有1000个样本的数据的唯一方法是组织输入数据,使得所有样本数据(对于所有六个时间序列输入)都在csv文件的单行上,在csv文件的每一行上显示单独的已知结果文件的数据.但是这样做,第一个,第二个,第三个等数字是来自第一个传感器的时间序列数据的每个部分的事实在翻译中丢失,以及第101,102,123等事实数字是来自第二传感器的时间序列数据的每一部分,依此类推; 对于ksvm模型,每个数据样本只被认为是与其邻居无关的孤立数字.如何将这些数据作为六个独立但相互关联的时间序列数组提供给ksvm?或者我如何向ksvm提供二维数据数组?
更新:
好吧,有两个基本的策略我尝试过惨淡的结果(好吧,结果模型比盲猜更好,但不多).
首先,不熟悉R,我使用了Rattle GUI前端到R.我有一种感觉,通过这样做,我可能会限制我的选择.但无论如何,这就是我所做的......
示例已知结果文件(仅显示4个传感器而不是6个传感器,仅显示7个时间样本而不是100个):
training168_yes.csv
Seconds Since 1/1/2000,sensor1,sensor2,sensor3,sensor4
454768042.4, 0, 0, 0, 0
454768042.6, 51, 60, 0, 172
454768043.3, 0, 0, 0, 0
454768043.7, 300, 0, 0, 37
454768044.0, 0, 0, 1518, 0
454768044.3, 0, 0, 0, 0
454768044.7, 335, 0, 0, 4273
Run Code Online (Sandbox Code Playgroud)
training169_no.csv
Seconds Since 1/1/2000,sensor1,sensor2,sensor3,sensor4
454767904.5, 0, 0, 0, 0
454767904.8, 51, 0, 498, 0
454767905.0, 633, 0, 204, 55
454767905.3, 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud) 我正在使用k中的kernlab包中的ksvm训练SVM.我想使用概率模型,但在sigmoid拟合期间,我得到以下错误消息:
line search fails -1.833726 0.5772808 5.844462e-05 5.839508e-05 -1.795008e-08
-1.794263e-08 -2.096847e-12
Run Code Online (Sandbox Code Playgroud)
当发生这种情况时,得到的值prob.model(m)
是所有概率的向量,而不是拟合在这些概率上的S形函数的预期参数.导致此错误的原因是什么?如何防止它?搜索错误消息没有产生任何结果.
可重复的例子:
load(url('http://roelandvanbeek.nl/files/df.rdata'))
ksvm(label~value,df[1:1000],C=10,prob.model=TRUE)->m
prob.model(m) # works as it should, prints a list containing one named list
# the below, non-working problem, unfortunately takes an hour due to the large
# sample size
ksvm(label~value,df,C=10,prob.model=TRUE)->m # line search fails
prob.model(m) # just a vector of values
Run Code Online (Sandbox Code Playgroud) 我对R包中的kkmeans
功能有疑问kernlab
.我是这个包的新手,请原谅我,如果我在这里遗漏了一些明显的东西.
我想将一个新数据点分配给一组集群中的集群,这些集群是使用内核k-means和函数'kkmeans'创建的.通过常规聚类,可以通过计算新数据点和聚类质心之间的欧几里德距离来实现此目的,并选择具有最接近质心的聚类.在内核k-means中,必须在特征空间中执行此操作.
以kkmeans描述中使用的示例为例:
data(iris)
sc <- kkmeans(as.matrix(iris[,-5]), centers=3)
Run Code Online (Sandbox Code Playgroud)
假设我在这里有一个新的数据点,我想将其分配给上面创建的最近的集群sc
.
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.0 3.6 1.2 0.4
Run Code Online (Sandbox Code Playgroud)
关于如何做到这一点的任何提示?非常感谢您的帮助.
我使用ksvm
R中的kernlab包来预测概率,使用中的type="probabilities"
选项predict.ksvm
.但是,我发现有时使用predict(model,observation,type="r")
产量而不是具有最高概率的类predict(model,observation,type="p")
.
例:
> predict(model,observation,type="r")
[1] A
Levels: A B
> predict(model,observation,type="p")
A B
[1,] 0.21 0.79
Run Code Online (Sandbox Code Playgroud)
这是正确的行为还是错误?如果它是正确的行为,我如何根据概率估计最可能的类?
尝试重现性的例子:
library(kernlab)
set.seed(1000)
# Generate fake data
n <- 1000
x <- rnorm(n)
p <- 1 / (1 + exp(-10*x))
y <- factor(rbinom(n, 1, p))
dat <- data.frame(x, y)
tmp <- split(dat, dat$y)
# Create unequal sizes in the groups (helps illustrate the problem)
newdat <- rbind(tmp[[1]][1:100,], tmp[[2]][1:10,])
# Fit the model using …
Run Code Online (Sandbox Code Playgroud) 我可能在这里犯了一个非常简单(和愚蠢)的错误,但我无法弄明白.我正在玩Kaggle(数字识别器)的一些数据,并尝试使用带有Caret包的SVM进行分类.如果我只是将标签值作为数字类型train
插入函数中,Caret中的函数似乎默认为回归并且性能很差.所以我接下来尝试将其转换为函数的因子factor()
并尝试运行SVM分类.下面是一些代码,我生成一些虚拟数据,然后将其插入Caret:
library(caret)
library(doMC)
registerDoMC(cores = 4)
ytrain <- factor(sample(0:9, 1000, replace=TRUE))
xtrain <- matrix(runif(252 * 1000,0 , 255), 1000, 252)
preProcValues <- preProcess(xtrain, method = c("center", "scale"))
transformerdxtrain <- predict(preProcValues, xtrain)
fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 10)
svmFit <- train(transformerdxtrain[1:10,], ytrain[1:10], method = "svmradial")
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error in kernelMult(kernelf(object), newdata, xmatrix(object)[[p]], coef(object)[[p]]) :
dims [product 20] do not match the length of object [0]
In addition: Warning messages:
1: In …
Run Code Online (Sandbox Code Playgroud) 我正在训练两个SVM模型,在我的数据上使用两个不同的包,并得到截然不同的结果.这是预期的吗?
library('e1071')
model1 <- svm(myFormula, data=trainset,type='C',kernel='linear',probability = TRUE)
outTrain <- predict(model1, trainset, probability = TRUE)
outTest <- predict(model1, testset, probability = TRUE)
train_pred <- attr(outTrain, "probabilities")[,2]
test_pred <- attr(outTest, "probabilities")[,2]
calculateAUC(train_pred,trainTarget)
calculateAUC(test_pred,testTarget)
Run Code Online (Sandbox Code Playgroud)
model2 <- train(myFormula,data=trainset,method='svmLinear')
train_pred <- predict(model2, trainset)
test_pred <- predict(model2, testset)
calculateAUC(train_pred,trainTarget)
calculateAUC(test_pred,testTarget)
Run Code Online (Sandbox Code Playgroud)
calculateAUC()
是给定目标的预测值和实际值,我定义的函数来计算AUC值.我认为价值观为:
1
0.8567979
0.9910193
0.758201
这是可能的吗?或者我做错了吗?
我可以提供样本数据,如果这将有所帮助
我有纬度和经度,所以我需要将RBF内核重新定义为exp(-1/2 || sophere distrance || ^ 2),这意味着我需要自己重写一个内核函数.我按如下方式编写内核:
round.kernel <- function(x,y){
sigma <- 1
#R <- 6371
R <- 1
a <- (sin( (x[1]-y[1])/2 ))^2+cos(x[1])*cos(y[1])*(sin((x[2]-y[2])/2))^2
c <- 2*atan2(sqrt(a),sqrt(1-a))
d <- R*c
res <- exp(-d^2/(2*sigma))
return (res)
}
class(round.kernel) <- "kernel"
Run Code Online (Sandbox Code Playgroud)
我测试了这个函数,内核应该是正确的.但是通过以下训练命令,我收到错误:
fit <- ksvm(y=train[,2],x=train[,3:4],kernel=round.kernel,type='eps-svr')
Error in .local(x, ...) :
List interface supports only the stringdot kernel.
Run Code Online (Sandbox Code Playgroud)
更棘手的是,我在ksvm文档中尝试了示例代码:
k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))}
class(k) <- "kernel"
Run Code Online (Sandbox Code Playgroud)
但我得到了同样的错误.
任何人都知道如何正确定义内核函数?
我正在尝试使用kernlab
R包来做支持向量机(SVM).对于我非常简单的例子,我有两条训练数据.A和B.
(A和B属于类型matrix
- 它们是图形的邻接矩阵.)
所以我写了一个函数,它接受A + B并生成一个核矩阵.
> km
[,1] [,2]
[1,] 14.33333 18.47368
[2,] 18.47368 38.96053
Run Code Online (Sandbox Code Playgroud)
现在我使用kernlab
的ksvm
函数来生成我的预测模型.现在,我只想努力工作 - 我不担心训练错误等.
所以,问题1:我是否正确生成了我的模型?合理?
# y are my classes. In this case, A is in class "1" and B is in class "-1"
> y
[1] 1 -1
> model2 = ksvm(km, y, type="C-svc", kernel = "matrix");
> model2
Support Vector Machine object of class "ksvm"
SV type: C-svc (classification)
parameter : cost C …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用用户定义的内核。我知道 kernlab 在 R 中提供用户定义的内核(自定义内核函数)。我使用了数据垃圾邮件,包括包 kernlab。(变量数=57 示例数=4061)
我定义了内核的形式,
kp=function(d,e){
as=v*d
bs=v*e
cs=as-bs
cs=as.matrix(cs)
exp(-(norm(cs,"F")^2)/2)
}
class(kp)="kernel"
Run Code Online (Sandbox Code Playgroud)
它是高斯核的变换核,其中v
是关于每个变量的标准偏差向量的倒数的连续变化值,例如:
v=(0.1666667,........0.1666667)
Run Code Online (Sandbox Code Playgroud)
训练集定义了 60% 的垃圾邮件数据(保留不同类别的比例)。
如果数据的类型是垃圾邮件,则训练 svm 的数据类型 = 1
m=ksvm(xtrain,ytrain,type="C-svc",kernel=kp,C=10)
Run Code Online (Sandbox Code Playgroud)
但是这一步不起作用。它总是在等待回应。
所以,我问你这个问题,为什么?是不是因为例子的数量太多了?是否有任何其他 R 包可以为用户定义的内核训练 SVM?
我正在测试kernlab
回归问题中的包。'Error in .local(object, ...) : test vector does not match model !
将ksvm
对象传递给predict
函数时,这似乎是一个常见的问题。但是,我刚刚找到了不适用于我的问题的分类问题或自定义内核的答案(我使用内置的进行回归)。我在这里没有想法了,我的示例代码是:
data <- matrix(rnorm(200*10),200,10)
tr <- data[1:150,]
ts <- data[151:200,]
mod <- ksvm(x = tr[,-1],
y = tr[,1],
kernel = "rbfdot", type = 'nu-svr',
kpar = "automatic", C = 60, cross = 3)
pred <- predict(mod,
ts
)
Run Code Online (Sandbox Code Playgroud) 我想在 R 中使用 SVM 实现来做一些回归。我已经尝试使用svm
frome1071
但我受到那里的内核函数的限制。所以我继续ksvm
从kernlab
. 但我有一个重大的缺点,即调节功能尚未在提供kernlab
(如tune.svm
在e1071
)。有人可以解释我如何调整不同内核的参数吗?
附注。我特别想用rbfdot
内核。因此,如果至少有人可以帮助我了解如何调整 sigma,我将不胜感激。
聚苯乙烯。我完全知道"automatic"
kpar的值可以用来“计算一个好的西格玛”。但我需要一些更切实的东西,更符合tune.svm
.
我在 kernlab 包中发现了一些令人费解的行为:估计数学上相同的 SVM 在软件中会产生不同的结果。
为简单起见,此代码片段仅采用虹膜数据并使其成为二元分类问题。如您所见,我在两个 SVM 中都使用了线性内核。
library(kernlab)
library(e1071)
data(iris)
x <- as.matrix(iris[, 1:4])
y <- as.factor(ifelse(iris[, 5] == 'versicolor', 1, -1))
C <- 5.278031643091578
svm1 <- ksvm(x = x, y = y, scaled = FALSE, kernel = 'vanilladot', C = C)
K <- kernelMatrix(vanilladot(), x)
svm2 <- ksvm(x = K, y = y, C = C, kernel = 'matrix')
svm3 <- svm(x = x, y = y, scale = FALSE, kernel = 'linear', cost = C)
Run Code Online (Sandbox Code Playgroud)
但是,svm1 和 …
我一直在尝试构建SVM分类器,但遇到了麻烦predict
.
> modelrbf<-ksvm(set,y,kernel="rbfdot",type="C-svc")
Using automatic sigma estimation (sigest) for RBF or laplace kernel
> predict(modelrbf,set[24,])
Error in .local(object, ...) : test vector does not match model !
Run Code Online (Sandbox Code Playgroud)
我无能为力导致错误的原因是:'测试向量与模型不匹配!'.