R代码:
a <- c(23,45,546,42,68,15,47)b <- c(1,2,4,6,34,8)c <- c(22,33,44,55,66,77,88)d <- c(1,1,1)e <- c(1,1.1)f <- c(1,1.01)g <- c(1,1.001)df <- data.frame(a,b,c,d,e,f,g)var_List = c('b','c','d','e','f','g')target <- temp_dsin.df$areg_data <- cbind(target,df[,var_List])if (nrow(reg_data) < length(var_List)){ message(paste0(' WARNING: Data set is rank deficIEnt. Result may be doubtful'))}reg_model <- lm(target ~ .,data = reg_data)print(reg_model$coefficIEnts)#store the independent variables with 0 coefficIEntszero_coef_IndepVars.v <- names(which(is.na(reg_model$coefficIEnts)))print(zero_coef_IndepVars.v)
Python代码:
import pandas as pdfrom sklearn import linear_modela = [23,47]b = [1,8]c = [22,88]d = [1,1]e = [1,1.1]q = [1,1.01]f = [1,1.001]df = pd.DataFrame({'a': a,'b': b,'c': c,'d': d,'e': e,'f': q,'g': f})var_List = ['b','g']# build linear regression model and test for linear combinationtarget = df['a']reg_data = pd.DataFrame()reg_data['a'] = targettrain_cols = df.loc[:,df.columns.str.lower().isin(var_List)]if reg_data.shape[0] < len(var_List): print(' WARNING: Data set is rank deficIEnt. Result may be doubtful')# Create linear regression objectreg_model = linear_model.linearRegression()# Train the model using the training setsreg_model.fit(train_cols,reg_data['a'])print(reg_model.coef_)
R的输出:
(Intercept) b c d e f g 537.555988 -0.669253 -1.054719 NA -356.715149 NA NA > print(zero_coef_IndepVars.v)[1] "d" "f" "g"
Python的输出:
b c d e f g[-0.66925301 -1.05471932 0. -353.1483504 -35.31483504 -3.5314835]
正如你所看到的,列’b’,’c’和’e’的值是接近的,但对于’d’,’f’和’g’来说却是非常不同的.对于这个例子回归,我想要返回[‘d’,’f’,’g’],因为它们的输出是从R的NA.问题是,sklearn线性回归为col’d’返回0,而它返回-35.31为col’f’,-3.531为col’g’.
有没有人知道R如何决定是否返回NA或值/如何将此行为实现到Python版本?知道差异在哪里可能有助于我在Python中实现R行为.我需要python脚本的结果来匹配R输出.
解决方法 实现方式有所不同. R中的lm使用基于QR分解的底层C代码.模型矩阵被分解为正交矩阵Q和三角矩阵R.这导致其他人称为“共线性检查”. R不检查,QR分解的性质确保最小共线变量在拟合算法中获得“优先级”.关于QR分解的更多信息在线性回归的上下文中:
https://www.stat.wisc.edu/~larget/math496/qr.html
来自sklearn的代码基本上是一个关于numpy.linalg.lstsq的包装器,它最小化了欧几里德二次规范.如果您的模型是Y = AX,它最小化|| Y – AX || ^ 2.这是一个不同的(和计算上不太稳定的)算法,它没有QR分解的很好的副作用.
个人笔记:如果您想在经过验证和经过验证的计算框架中对模型进行稳健的拟合,并坚持使用Python,请寻找基于QR或SVD的线性回归实现.软件包scikit-learn或statsmodels(至今仍然在2017年4月22日进行测试)应该让你在那里.
总结以上是内存溢出为你收集整理的Python和R之间线性回归系数的差异全部内容,希望文章能够帮你解决Python和R之间线性回归系数的差异所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)