在分类数据的分析中,我们经常使用逻辑回归来估计二项式结果与一个或多个协变量之间的关系.
我知道这是一种广义线性模型(GLM).在R中,这是glm使用参数的函数实现的family=binomial.另一方面,在分类数据分析中是多项式模型.这些不是GLM吗?并且不能用R glm函数估计它们吗?
(在这篇关于多项Logistic回归的文章中.作者使用外部包mlogit,看起来也过时了)
为什么GLM类限于二分类结果?是因为多类分类可以被视为多个二元分类模型吗?
我试图用来speedglm实现更快的GLM估计 glm,但为什么它更慢?
set.seed(0)
n=1e3
p=1e3
x=matrix(runif(n*p),nrow=n)
y=sample(0:1,n,replace = T)
ptm <- proc.time()
fit=glm(y~x,family=binomial())
print(proc.time() - ptm)
# user system elapsed
# 10.71 0.07 10.78
library(speedglm)
ptm <- proc.time()
fit=speedglm(y~x,family=binomial())
print(proc.time() - ptm)
# user system elapsed
# 15.11 0.12 15.25
Run Code Online (Sandbox Code Playgroud) 假设我有一个要解决的优化问题R,optimx.有什么办法可以随着时间的推移提取参数和目标函数值吗?
f<-function(x){
return(sum(abs(x)))
}
gr<-function(x){
return(sign(x))
}
opt=optimx::optimx(runif(2),f,gr,method="BFGS")
Run Code Online (Sandbox Code Playgroud)
目标是试图制作这样的情节:
我认为我们可以使用以下代码手动执行Gradient Decent,但我该如何操作呢optimx?
x=c(0.5,1.5)
alpha=0.1
max_iter=20
x_trace=matrix(rep(0,max_iter*2),ncol=2)
for (i in 1:max_iter){
x=x-alpha*gr(x)
x_trace[i,]=x
}
f_trace=apply(x_trace,1,f)
Run Code Online (Sandbox Code Playgroud) 为什么我有完全相同的模型,但运行不同网格大小的预测(0.001对比0.01)获得不同的预测?
set.seed(0)
n_data=2000
x=runif(n_data)-0.5
y=0.1*sin(x*30)/x+runif(n_data)
plot(x,y)
poly_df=5
x_exp=as.data.frame(cbind(y,poly(x, poly_df)))
fit=lm(y~.,data=x_exp)
x_plt1=seq(-1,1,0.001)
x_plt_exp1=as.data.frame(poly(x_plt1,poly_df))
lines(x_plt1,predict(fit,x_plt_exp1),lwd=3,col=2)
x_plt2=seq(-1,1,0.01)
x_plt_exp2=as.data.frame(poly(x_plt2,poly_df))
lines(x_plt2,predict(fit,x_plt_exp2),lwd=3,col=3)
Run Code Online (Sandbox Code Playgroud)
假设我用RPART构建了一个玩具树模型,我怎样才能获得树的深度?
library(rpart)
library(partykit)
fit=rpart(factor(am)~.,mtcars,control=rpart.control(cp=0,minsplit = 1))
plot(as.party(fit))
Run Code Online (Sandbox Code Playgroud)
我知道如何计算叶子,对于二叉树,我们可以通过叶子的数量近似深度,但它不直接是树的深度.
sum(fit$frame$var=="<leaf>")
Run Code Online (Sandbox Code Playgroud) 我有一个简单的玩具代码用于深度优先搜索,但为什么我在打印后获得%?
# Definition for a binary tree node
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def dfs(t):
if t==None:
print("",end="")
else:
print(t.val,end="")
dfs(t.left)
dfs(t.right)
t=TreeNode(1)
t.left=TreeNode(2)
t.right=TreeNode(3)
t.left.left=TreeNode(4)
t.left.right=TreeNode(5)
t.right.left=TreeNode(6)
t.right.right=TreeNode(7)
dfs(t)
Run Code Online (Sandbox Code Playgroud)
产量:1245367%
我觉得R中的矩阵运算非常令人困惑:我们正在混合行向量和列向量。
在这里,我们定义x1为向量(我假设R默认向量是列向量吗?但它没有显示它是以这种方式排列的。)
然后我们定义x2的转置x1,这对我来说也很奇怪。
最后,如果我们定义x3为矩阵,则显示效果会更好。
现在,我的问题是,x1和x2是完全不同的东西(一个是另一个转),但我们这里有同样的结果。
有什么解释吗?可能我不应该将向量和矩阵运算混合在一起吗?
x1 = c(1:3)
x2 = t(x1)
x3 = matrix(c(1:3), ncol = 1)
x1
[1] 1 2 3
x2
[,1] [,2] [,3]
[1,] 1 2 3
x3
[,1]
[1,] 1
[2,] 2
[3,] 3
x3 %*% x1
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 4 6
[3,] 3 6 9
x3 %*% x2
[,1] [,2] [,3]
[1,] 1 2 3
[2,] …Run Code Online (Sandbox Code Playgroud) r ×6
glm ×2
regression ×2
algorithm ×1
lm ×1
matrix ×1
performance ×1
polynomials ×1
python ×1
recursion ×1
rpart ×1
speedglm ×1
tree ×1
vector ×1