SCHINESE_RADICAL_M 按照部首(第一順序)、筆劃(第二順序)排序
成都創(chuàng)新互聯(lián)專注于商都網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供商都營(yíng)銷型網(wǎng)站建設(shè),商都網(wǎng)站制作、商都網(wǎng)頁設(shè)計(jì)、商都網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造商都網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供商都網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
SCHINESE_STROKE_M 按照筆劃(第一順序)、部首(第二順序)排序
SCHINESE_PINYIN_M 按照拼音排序
排序用
比如select nls_initcap('百度知道', 'nls_sort= SCHINESE_STROKE_M')
from dual;
os.environ
例如,設(shè)置 oracle 編碼
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
利用python調(diào)用sqlplus來輸出結(jié)果的例子:
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,當(dāng)然最好用cx_Oracle庫,但有時(shí)候受到種種限制,不能安裝Python第三方庫,就得利用現(xiàn)有資源,硬著頭皮上了。
用Python調(diào)用SqlPlus查詢Oracle,首先要知道SqlPlus返回結(jié)果是什么樣的:
(這是空行)
Number Name Address
------------ ----------- ------------------
1001 張三 南京路
1002 李四 上海路
第1行是空行,第2行是字段名稱,第3行都是橫杠,有空格隔開,第4行開始是查詢到的結(jié)果。
在查詢結(jié)果規(guī)整的情況下,根據(jù)第3行可以很清晰的看到結(jié)構(gòu),用Python解析起來也比較方便。但是,如果一張表字段特別多,記錄數(shù)也相當(dāng)多,那么默認(rèn)情況下調(diào)用SqlPlus查詢出的結(jié)果會(huì)比較亂,這就需要在調(diào)用查詢之前做一些設(shè)定,比如:
set linesize 32767
set pagesize 9999
set term off verify off feedback off tab off
set numwidth 40
這樣的調(diào)用查詢結(jié)果就比較規(guī)整了。接下來就是用強(qiáng)大的Python來解析查詢結(jié)果。
這里封裝了一個(gè)函數(shù),可以根據(jù)傳入的SQL語句查詢并解析結(jié)果,將每行結(jié)果存到列表中,列表中的每個(gè)元素是一個(gè)字段名稱與值的映射。
#!/usr/bin/python
#coding=UTF-8
'''
@author: 雙子座@開源中國(guó)
@summary: 通過SqlPlus查詢Oracles數(shù)據(jù)庫
'''
import os;
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'
gStrConnection = 'username/password@10.123.5.123:1521/ora11g'
#解析SqlPlus的查詢結(jié)果,返回列表
def parseQueryResult(listQueryResult):
listResult = []
#如果少于4行,說明查詢結(jié)果為空
if len(listQueryResult) 4:
return listResult
#第0行是空行,第1行可以獲取字段名稱,第2行可獲取SQLPlus原始結(jié)果中每列寬度,第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行開始,解析結(jié)果,并建立映射,存儲(chǔ)到列表中
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
#構(gòu)造查詢命令
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'
#調(diào)用系統(tǒng)命令收集結(jié)果
result = os.popen(strCommand)
list = []
for line in result:
list.append(line)
return parseQueryResult(list)
其中os.environ['NLS_LANG']的值來自
select userenv['language'] from dual;
在調(diào)用的時(shí)候,只要類似:
listResult = QueryBySqlPlus('select * from studentinfo')
然后就可以用循環(huán)打印出結(jié)果了。
模型擬合
對(duì)于人口模型可以采用Logistic增長(zhǎng)函數(shù)形式,它考慮了初期的指數(shù)增長(zhǎng)以及總資源的限制。其函數(shù)形式如下。
首先載入car包以便讀取數(shù)據(jù),然后使用nls函數(shù)進(jìn)行建模,其中theta1、theta2、theta3表示三個(gè)待估計(jì)參數(shù),start設(shè)置了參數(shù)初始值,設(shè)定trace為真以顯示迭代過程。nls函數(shù)默認(rèn)采用Gauss-Newton方法尋找極值,迭代過程中第一列為RSS值,后面三列是各參數(shù)估計(jì)值。然后用summary返回回歸結(jié)果。
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)
在上面的回歸過程中我們直接指定參數(shù)初始值,另一種方法是采用搜索策略,首先確定參數(shù)取值范圍,然后利用nls2包的暴力方法來得到最優(yōu)參數(shù)。但這種方法相當(dāng)費(fèi)時(shí)。
還有一種更為簡(jiǎn)便的方法就是采用內(nèi)置自啟動(dòng)模型(self-starting Models),此時(shí)我們只需要指定函數(shù)形式,而不需要指定參數(shù)初始值。本例的logistic函數(shù)所對(duì)應(yīng)的selfstarting函數(shù)名為SSlogis
pop.mod2 - nls(population ~ SSlogis(year,phi1,phi2,phi3),data=USPop)
二、判斷擬合效果
非線性回歸模型建立后需要判斷擬合效果,因?yàn)橛袝r(shí)候參數(shù)最優(yōu)化過程會(huì)捕捉到局部極值點(diǎn)而非全局極值點(diǎn)。最直觀的方法是在原始數(shù)據(jù)點(diǎn)上繪制擬合曲線。
library(ggplot2)
p - ggplot(USPop,aes(year, population))
nls的數(shù)據(jù)源必須有誤差。不能精確等于公式返回值(零殘差)。循環(huán)次數(shù)大于50通常是使用 函數(shù)精確返回值 作為數(shù)據(jù)源去擬合函數(shù)。必須給y值加上隨機(jī)誤差。
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?是期望擬合出的結(jié)果。
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加上隨機(jī)誤差,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
#使用精確返回值擬合就會(huì)出錯(cuò)。
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))?:?
循環(huán)次數(shù)超過了50這個(gè)最大值
曲線擬合:(線性回歸方法:lm)
1、x排序
2、求線性回歸方程并賦予一個(gè)新變量
z=lm(y~x+I(x^2)+...)
3、plot(x,y) #做y對(duì)x的散點(diǎn)圖
4、lines(x,fitted(z)) #添加擬合值對(duì)x的散點(diǎn)圖并連線
曲線擬合:(nls)
lm是將曲線直線化再做回歸,nls是直接擬合曲線。
需要三個(gè)條件:曲線方程、數(shù)據(jù)位置、系數(shù)的估計(jì)值。
如果曲線方程比較復(fù)雜,可以先命名一個(gè)自定義函數(shù)。
例:
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可以是數(shù)據(jù)框或列表,但不能是矩陣
#對(duì)系數(shù)的估計(jì)要盡量接近真實(shí)值,如果相差太遠(yuǎn)會(huì)報(bào)錯(cuò):“奇異梯度”
summary(result); #結(jié)果包含對(duì)系數(shù)的估計(jì)和p值
根據(jù)估計(jì)的系數(shù)直接在散點(diǎn)圖上使用lines加曲線即可。
曲線擬合:(局部回歸)
lowess(x, y=NULL, f = 2/3, iter = 3)
#可以只包含x,也可使用x、y兩個(gè)變量
#f為窗寬參數(shù),越大越平滑
#iter為迭代次數(shù),越大計(jì)算越慢
loess(y~x, data, span=0.75, degree=2)
#data為包含x、y的數(shù)據(jù)集;span為窗寬參數(shù)
#degree默認(rèn)為二次回歸
#該方法計(jì)算1000個(gè)數(shù)據(jù)點(diǎn)約占10M內(nèi)存
舉例:
x=seq(0, 10, 0.1); y=sin(x)+rnorm(101) #x的值必須排序
plot(x,y); #做散點(diǎn)圖
lines(lowess(x,y)); #利用lowess做回歸曲線
lines(x,predict(loess(y~x))); #利用loess做回歸曲線,predict是取回歸預(yù)測(cè)值
z=loess(y~x); lines(x, z$fit); #利用loess做回歸曲線的另一種做法
當(dāng)前名稱:nls函數(shù)python r中nls函數(shù)
文章路徑:http://chinadenli.net/article28/hpsijp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、標(biāo)簽優(yōu)化、搜索引擎優(yōu)化、、App開發(fā)、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容