重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

nls函数python r中nls函数

oracle中的NLS_INITCAP、NLS_LOWER、NLS_UPPER函数

SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序

成都创新互联专注于商都网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供商都营销型网站建设,商都网站制作、商都网页设计、商都网站官网定制、小程序设计服务,打造商都网络公司原创品牌,更为您提供商都网站排名全网营销落地服务。

SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序

SCHINESE_PINYIN_M 按照拼音排序

排序用

比如select nls_initcap('百度知道', 'nls_sort= SCHINESE_STROKE_M')

from dual;

python怎么设置环境变量

os.environ

例如,设置 oracle 编码

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

python调用oracle的sql中wm_concat问题:

利用python调用sqlplus来输出结果的例子:

import os

import sys

from subprocess import Popen, PIPE

sql = """

set linesize 400

col owner for a10

col object_name for a30

select owner, object_name

from dba_objects

where rownum=10;

"""

proc = Popen(["sqlplus", "-S", "/", "as", "sysdba"], stdout=PIPE, stdin=PIPE, stderr=PIPE)

proc.stdin.write(sql)

(out, err) = proc.communicate()

if proc.returncode != 0:

print err

sys.exit(proc.returncode)

else:

print out

用Python查询Oracle,当然最好用cx_Oracle库,但有时候受到种种限制,不能安装Python第三方库,就得利用现有资源,硬着头皮上了。

用Python调用SqlPlus查询Oracle,首先要知道SqlPlus返回结果是什么样的:

(这是空行)

Number Name Address

------------ ----------- ------------------

1001 张三 南京路

1002 李四 上海路

第1行是空行,第2行是字段名称,第3行都是横杠,有空格隔开,第4行开始是查询到的结果。

在查询结果规整的情况下,根据第3行可以很清晰的看到结构,用Python解析起来也比较方便。但是,如果一张表字段特别多,记录数也相当多,那么默认情况下调用SqlPlus查询出的结果会比较乱,这就需要在调用查询之前做一些设定,比如:

set linesize 32767

set pagesize 9999

set term off verify off feedback off tab off

set numwidth 40

这样的调用查询结果就比较规整了。接下来就是用强大的Python来解析查询结果。

这里封装了一个函数,可以根据传入的SQL语句查询并解析结果,将每行结果存到列表中,列表中的每个元素是一个字段名称与值的映射。

#!/usr/bin/python

#coding=UTF-8

'''

@author: 双子座@开源中国

@summary: 通过SqlPlus查询Oracles数据库

'''

import os;

os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'

gStrConnection = 'username/password@10.123.5.123:1521/ora11g'

#解析SqlPlus的查询结果,返回列表

def parseQueryResult(listQueryResult):

listResult = []

#如果少于4行,说明查询结果为空

if len(listQueryResult) 4:

return listResult

#第0行是空行,第1行可以获取字段名称,第2行可获取SQLPlus原始结果中每列宽度,第3行开始是真正输出

# 1 解析第2行,取得每列宽度,放在列表中

listStrTmp = listQueryResult[2].split(' ')

listIntWidth = []

for oneStr in listStrTmp:

listIntWidth.append(len(oneStr))

# 2 解析第1行,取得字段名称放在列表中

listStrFieldName = []

iLastIndex = 0

lineFieldNames = listQueryResult[1]

for iWidth in listIntWidth:

#截取[iLastIndex, iLastIndex+iWidth)之间的字符串

strFieldName = lineFieldNames[iLastIndex:iLastIndex + iWidth]

strFieldName = strFieldName.strip() #去除两端空白符

listStrFieldName.append(strFieldName)

iLastIndex = iLastIndex + iWidth + 1

# 3 第3行开始,解析结果,并建立映射,存储到列表中

for i in range(3, len(listQueryResult)):

oneLiseResult = unicode(listQueryResult[i], 'UTF-8')

fieldMap = {}

iLastIndex = 0

for j in range(len(listIntWidth)):

strFieldValue = oneLiseResult[iLastIndex:iLastIndex + listIntWidth[j]]

strFieldValue = strFieldValue.strip()

fieldMap[listStrFieldName[j]] = strFieldValue

iLastIndex = iLastIndex + listIntWidth[j] + 1

listResult.append(fieldMap)

return listResult

def QueryBySqlPlus(sqlCommand):

global gStrConnection

#构造查询命令

strCommand = 'sqlplus -S %s !\n' % gStrConnection

strCommand = strCommand + 'set linesize 32767\n'

strCommand = strCommand + 'set pagesize 9999\n'

strCommand = strCommand + 'set term off verify off feedback off tab off \n'

strCommand = strCommand + 'set numwidth 40\n'

strCommand = strCommand + sqlCommand + '\n'

#调用系统命令收集结果

result = os.popen(strCommand)

list = []

for line in result:

list.append(line)

return parseQueryResult(list)

其中os.environ['NLS_LANG']的值来自

select userenv['language'] from dual;

在调用的时候,只要类似:

listResult = QueryBySqlPlus('select * from studentinfo')

然后就可以用循环打印出结果了。

r语言lm函数可以做非线性回归吗

模型拟合

对于人口模型可以采用Logistic增长函数形式,它考虑了初期的指数增长以及总资源的限制。其函数形式如下。

首先载入car包以便读取数据,然后使用nls函数进行建模,其中theta1、theta2、theta3表示三个待估计参数,start设置了参数初始值,设定trace为真以显示迭代过程。nls函数默认采用Gauss-Newton方法寻找极值,迭代过程中第一列为RSS值,后面三列是各参数估计值。然后用summary返回回归结果。

library(car)

pop.mod1 - nls(population ~ theta1/(1+exp(-(theta2+theta3*year))),start=list(theta1 = 400, theta2 = -49, theta3 = 0.025), data=USPop, trace=T)

summary(pop.mod)

在上面的回归过程中我们直接指定参数初始值,另一种方法是采用搜索策略,首先确定参数取值范围,然后利用nls2包的暴力方法来得到最优参数。但这种方法相当费时。

还有一种更为简便的方法就是采用内置自启动模型(self-starting Models),此时我们只需要指定函数形式,而不需要指定参数初始值。本例的logistic函数所对应的selfstarting函数名为SSlogis

pop.mod2 - nls(population ~ SSlogis(year,phi1,phi2,phi3),data=USPop)

二、判断拟合效果

非线性回归模型建立后需要判断拟合效果,因为有时候参数最优化过程会捕捉到局部极值点而非全局极值点。最直观的方法是在原始数据点上绘制拟合曲线。

library(ggplot2)

p - ggplot(USPop,aes(year, population))

R语言使用nls拟合,为什么总说循环次数大于50

nls的数据源必须有误差。不能精确等于公式返回值(零残差)。循环次数大于50通常是使用 函数精确返回值 作为数据源去拟合函数。必须给y值加上随机误差。

z=function(x,a,b){a*sin(x)+b*cos(x)}

x=seq(1,10,9/500)

y=z(x,1,1) # a=1 b=1 是期望拟合出的结果。

cor=data.frame(x=x,y=y)

cor$res=runif(length(cor$x),min=-0.005,max=0.005)

cor$yres=cor$y+cor$res

#yres =y加上随机误差,y是精确返回值

nls(cor$yres~z(cor$x,a,b),data=cor,start=list(a=0.8,b=1.3))

Nonlinear regression model

model: cor$yres ~ z(cor$x, a, b)

data: cor

a      b 

0.9999 1.0002 

residual sum-of-squares: 0.004213

Number of iterations to convergence: 1 

Achieved convergence tolerance: 2.554e-07

#使用精确返回值拟合就会出错。

nls(cor$y~z(cor$x,a,b),data=cor,start=list(a=1,b=1))

Error in nls(cor$y ~ z(cor$x, a, b), data = cor, start = list(a = 1, b = 1)) : 

循环次数超过了50这个最大值

如何用R语言对一组样本数据进行拟合求出密度函数?

曲线拟合:(线性回归方法:lm)

1、x排序

2、求线性回归方程并赋予一个新变量

z=lm(y~x+I(x^2)+...)

3、plot(x,y) #做y对x的散点图

4、lines(x,fitted(z)) #添加拟合值对x的散点图并连线

曲线拟合:(nls)

lm是将曲线直线化再做回归,nls是直接拟合曲线。

需要三个条件:曲线方程、数据位置、系数的估计值。

如果曲线方程比较复杂,可以先命名一个自定义函数。

例:

f=function(x1, x2, a, b) {a+x1+x2^b};

result=nls(x$y~f(x$x1, x$x2, a, b), data=x, start=list(a=1, b=2));

#x可以是数据框或列表,但不能是矩阵

#对系数的估计要尽量接近真实值,如果相差太远会报错:“奇异梯度”

summary(result); #结果包含对系数的估计和p值

根据估计的系数直接在散点图上使用lines加曲线即可。

曲线拟合:(局部回归)

lowess(x, y=NULL, f = 2/3, iter = 3)

#可以只包含x,也可使用x、y两个变量

#f为窗宽参数,越大越平滑

#iter为迭代次数,越大计算越慢

loess(y~x, data, span=0.75, degree=2)

#data为包含x、y的数据集;span为窗宽参数

#degree默认为二次回归

#该方法计算1000个数据点约占10M内存

举例:

x=seq(0, 10, 0.1); y=sin(x)+rnorm(101) #x的值必须排序

plot(x,y); #做散点图

lines(lowess(x,y)); #利用lowess做回归曲线

lines(x,predict(loess(y~x))); #利用loess做回归曲线,predict是取回归预测值

z=loess(y~x); lines(x, z$fit); #利用loess做回归曲线的另一种做法


网站标题:nls函数python r中nls函数
地址分享:http://cqcxhl.cn/article/hpsijp.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP