python最小二乘擬合
Ⅰ 矩陣參數怎麼用最小二乘法擬合
Ⅱ python怎麼做最優化
一、概觀
scipy中的optimize子包中提供了常用的最優化演算法函數實現。我們可以直接調用這些函數完成我們的優化問題。optimize中函數最典型的特點就是能夠從函數名稱上看出是使用了什麼演算法。下面optimize包中函數的概覽:
1.非線性最優化
fmin -- 簡單Nelder-Mead演算法
fmin_powell -- 改進型Powell法
fmin_bfgs -- 擬Newton法
fmin_cg -- 非線性共軛梯度法
fmin_ncg -- 線性搜索Newton共軛梯度法
leastsq -- 最小二乘
2.有約束的多元函數問題
fmin_l_bfgs_b ---使用L-BFGS-B演算法
fmin_tnc ---梯度信息
fmin_cobyla ---線性逼近
fmin_slsqp ---序列最小二乘法
nnls ---解|| Ax - b ||_2 for x>=0
3.全局優化
anneal ---模擬退火演算法
brute --強力法
4.標量函數
fminbound
brent
golden
bracket
5.擬合
curve_fit-- 使用非線性最小二乘法擬合
6.標量函數求根
brentq ---classic Brent (1973)
brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個演算法的人名
bisect ---二分法
newton ---牛頓法
fixed_point
7.多維函數求根
fsolve ---通用
broyden1 ---Broyden』s first Jacobian approximation.
broyden2 ---Broyden』s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixing
excitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.實用函數
line_search ---找到滿足強Wolfe的alpha值
check_grad ---通過和前向有限差分逼近比較檢查梯度函數的正確性二、實戰非線性最優化
fmin完整的調用形式是:
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過我們最常使用的就是前兩個參數。一個描述優化問題的函數以及初值。後面的那些參數我們也很容易理解。如果您能用到,請自己研究。下面研究一個最簡單的問題,來感受這個函數的使用方法:f(x)=x**2-4*x+8,我們知道,這個函數的最小值是4,在x=2的時候取到。
from scipy.optimize import fmin #引入優化包def myfunc(x):
return x**2-4*x+8 #定義函數
x0 = [1.3] #猜一個初值
xopt = fmin(myfunc, x0) #求解
print xopt #列印結果
運行之後,給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
程序准確的計算得出了最小值,不過最小值點並不是嚴格的2,這應該是由二進制機器編碼誤差造成的。
除了fmin_ncg必須提供梯度信息外,其他幾個函數的調用大同小異,完全類似。我們不妨做一個對比:
from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):
return x**2-4*x+8
x0 = [1.3]
xopt1 = fmin(myfunc, x0)
print xopt1
print
xopt2 = fmin_powell(myfunc, x0)
print xopt2
print
xopt3 = fmin_bfgs(myfunc, x0)
print xopt3
print
xopt4 = fmin_cg(myfunc,x0)
print xopt4
給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 53
1.99999999997
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 12
Gradient evaluations: 4
[ 2.00000001]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 15
Gradient evaluations: 5
[ 2.]
我們可以根據給出的消息直觀的判斷演算法的執行情況。每一種演算法數學上的問題,請自己看書學習。個人感覺,如果不是純研究數學的工作,沒必要搞清楚那些推導以及定理雲雲。不過,必須了解每一種演算法的優劣以及能力所及。在使用的時候,不妨多種演算法都使用一下,看看效果分別如何,同時,還可以互相印證演算法失效的問題。
在from scipy.optimize import fmin之後,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數的含義說明,這是調用函數時候的最有價值參考。
有源碼研究癖好的,或者當你需要改進這些已經實現的演算法的時候,可能需要查看optimize中的每種演算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發現了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!
Ⅲ Python最小二乘法擬合只能return一個方程嗎
最小二乘法是一種數學優化技術,它通過最小化誤差的平方和尋找數據的最佳函數匹配。優化是找到最小值或等式的數值解的問題。而線性回歸就是要求樣本回歸函數盡可能好地擬合目標函數值,也就是說,這條直線應該盡可能的處於樣本數據的中心位置。因此,選擇最佳擬合曲線的標准可以確定為:使總的擬合誤差(即總殘差)達到最小。如果用p表示函數中需要確定的參數,那麼目標就是找到一組p,使得下面的函數S的值最小:
Ⅳ 最小二乘法多項式曲線擬合原理與實現
最小二乘法多項式曲線擬合,根據給定的m個點,並不要求這條曲線精確地經過這些點,而是曲線y=f(x)的近似曲線y= φ(x)。
給定數據點pi(xi,yi),其中i=1,2,…,m。求近似曲線y= φ(x)。並且使得近似曲線與y=f(x)的偏差最小。近似曲線在點pi處的偏差δi= φ(xi)-y,i=1,2,...,m。
1.使偏差絕對值之和最小
2.使偏差絕對值最大的最小
3.使偏差平方和最小
按偏差平方和最小的原則選取擬合曲線,並且採取二項式方程為擬合曲線的方法,稱為 最小二乘法 。
Python運行環境與編輯環境;
Matplotlib.pyplot圖形庫,可用於快速繪制2D圖表,與matlab中的plot命令類似,而且用法也基本相同。
Ⅳ python_numpy最小二乘法的曲線擬合
在了解了最小二乘法的基本原理之後 python_numpy實用的最小二乘法理解 ,就可以用最小二乘法做曲線擬合了
從結果中可以看出,直線擬合並不能對擬合數據達到很好的效果,下面我們介紹一下曲線擬合。
b=[y1]
[y2]
......
[y100]
解得擬合函數的系數[a,b,c.....d]
CODE:
根據結果可以看到擬合的效果不錯。
我們可以通過改變
來調整擬合效果。
如果此處我們把擬合函數改為最高次為x^20的多項式
所得結果如下:
矯正 過擬合 現象
在保持擬合函數改為最高次為x^20的多項式的條件下,增大樣本數:
通過結果可以看出,過擬合現象得到了改善。
Ⅵ 10X單細胞(10X空間轉錄組)降維分析之UMAP
UMAP ,全稱uniform manifold approximation and projection,統一流形逼近與投影,是基於黎曼幾何和代數拓撲的理論框架結構構建的。在處理大數據集時,UMAP優勢明顯,運行速度更快,內存佔用小。Etienne Becht等人2019年在Nature Biotechnology上發表一篇文章將其應用在生物學數據上並闡述了UMAP在處理單細胞數據方面的應用和優勢。
如果你不知道tSNE是什麼,它是如何工作的,也沒有讀過2008年的革命性的van der Maaten & Hinton原稿,可以參考我的那文章 10X單細胞(10X空間轉錄組)降維分析之tSNE(演算法基礎知識) 。盡管tSNE對一般的單細胞基因組學和數據科學產生了巨大的影響,但人們普遍認為它有一些缺點,這些缺點很快將得到解決。( tSNE的缺點在上次分享的文章中也做過詳細的介紹 )。
看看上面的圖,我想說的是 t分布應該提供全局距離信息,因為它們將高維空間中相距較遠的點推到低維空間中更遠的點。
然而,這種良好的意願被成本函數(KL-divergence)的選擇所扼殺,我們將在後面看到其原因。
(1),可以顯著降低計算時間高維圖像由於求和或集成是一個代價高昂的計算過程。想想馬爾可夫鏈蒙特卡羅(MCMC)它基本上是試圖近似地計算在貝葉斯規則的分母上的積分(UMAP使用最近鄰居的數量而不是perplexity)
(2)定義perplexity, UMAP則定義了沒有log2函數的最近鄰居k的個數,即:
UMAP使用稍微不同的高維概率對稱
symmterization是必要的因為UMAP融合在一起的點與本地不同的指標(通過參數ρ),它可能發生圖A和B節點之間的重量不等於B之間的權重和節點。為什麼UMAP使用這種對稱而不是tSNE使用的對稱還不清楚。我將在下一篇文章(從頭開始編寫UMAP)中展示我對不同的對稱化規則的實驗,這並沒有使我相信這是如此重要的一步,因為它對最終的低維嵌入式產生了很小的影響。
UMAP使用曲線族1 / (1+a*y^(2b))在低維中建模距離概率,不是完全的學生t分布,但非常非常相似,請注意再次沒有應用標准化:
其中,對於默認UMAP超參數a≈1.93,b≈0.79(實際上,對於min_dist = 0.001)。在實踐中,UMAP從非線性最小二乘擬合到帶有min_dist超參數的分段函數中找到a和b:
為了更好地理解曲線族1 / (1+a*y^(2b))的行為,讓我們畫出不同a和b的曲線:
我們可以看到曲線族對參數b非常敏感,在大的參數b處,在小的參數y處,曲線族形成了一種高峰。這意味著在UMAP超參數min_dist之下,所有的數據點都是同樣緊密相連的。由於Q(Y)函數的行為幾乎像一個Heaviside階躍函數,這意味著UMAP為所有在低維空間中相互靠近的點分配了幾乎相同的低維坐標。min_dist正是導致在UMAP維數降低圖中經常觀察到的超密集集群的原因。
為了演示如何准確地找到a和b參數,讓我們展示一個簡單的分段函數(其中高峰部分是通過min_dist參數定義的),並使用函數族1 / (1+a y^(2b))通過優化來擬合它。curve_fit來自Scipy Python庫。作為擬合的結果,我們得到了函數1 / (1+a y^(2b))的初值a和初值b。
由於我們需要知道交叉熵的梯度,以便以後實現梯度下降,讓我們快速計算它。忽略只包含p(X)的常數項,我們可以將交叉熵重新寫一下,並將其微分如下:
圖拉普拉斯、譜聚類、拉普拉斯Eignemaps、擴散圖、譜嵌入等,實際上是指將矩陣分解和鄰接圖方法結合起來解決降維問題的同一種有趣的方法。在這種方法中,我們首先構造一個圖(或knn圖),然後通過構造拉普拉斯矩陣用矩陣代數(鄰接矩陣和度矩陣)將其形式化,最後分解拉普拉斯矩陣,即求解特徵值分解問題。
我們可以使用scikit-learn Python庫,並使用spectralembedded函數在演示數據集(即與癌症相關的成纖維細胞(CAFs) scRNAseq數據)上輕松地顯示初始的低維坐標:
最後,UMAP使用隨機梯度下降(SGD)代替常規梯度下降(GD),如tSNE / FItSNE,這既加快了計算速度,又減少了內存消耗。
現在讓我們簡要地討論一下為什麼他們說tSNE只保留數據的局部結構。可以從不同的角度來理解tSNE的局部性。首先,我們有σ參數Eq。(1)本地數據點集這樣互相「感覺」。因為成對歐幾里得距離衰減指數的概率,在小的σ值,它基本上是零遙遠的點(大型X)和快速增長僅為最近的鄰居(小X)。相比之下,在大的σ,遙遠而近點的概率成為限制可比和σ→∞,概率就等於1為所有任何一對點之間的距離,即成為等距點。
有趣的是,如果我們擴大成對歐幾里得距離的概率高維度成泰勒級數在σ→∞,我們會在第二近似冪律:
關於兩兩歐幾里得距離的冪律類似於多維定標法(MDS)的成本函數,MDS是通過保存每對點之間的距離來保存全局距離,而不管它們是相距很遠還是很近。一個可以解釋這個大的σtSNE遠程數據點之間的相互作用,所以是不完全正確的說tSNE只能處理當地的距離。然而,我們通常會受到perplexity有限值的限制,Laurens van der Maaten建議perplexity的取值范圍在5到50之間,盡管在局部信息和全局信息之間可能會有一個很好的折衷,那就是使用平方根≈N^(1/2)來選擇perplexity,其中N為樣本量。相反的極限,σ→0,我們最終的極端「局部性」高維概率的行為類似於狄拉克δ函數的行為。
另一種理解tSNE「局部性」的方法是考慮KL-divergence函數。假設X是高維空間中點之間的距離Y是低維空間中點之間的距離
根據kl -散度的定義:
方程(9)的第一項對於X的大小都是趨近於0的,對於X的大小也是趨近於0的,因為指數趨近於1,而log(1)=0。對於大X,這一項仍然趨近於0因為指數前因子趨近於0的速度快於對數趨近於負無窮。因此,為了直觀地理解kl散度,只考慮第二項就足夠了:
這是一個看起來很奇怪的函數,讓我們畫出KL(X, Y)
這個函數的形狀非常不對稱。如果點在高維度X之間的距離很小,指數因子變成1和對數項行為日誌(1 + Y ^ 2)這意味著如果Y是在低維空間的距離大,將會有一個大的懲罰,因此tSNE試圖減少Y在小X為了減少罰款。相反,對於高維空間中的長距離X, Y基本上可以是0到∞之間的任何值,因為指數項趨於0,並且總是勝過對數項。因此,在高維空間中相距遙遠的點,在低維空間中可能會相互靠近。因此,換句話說,tSNE並不能保證高維空間中相距較遠的點在低維空間中會保持較遠的距離。然而,它確實保證了在高維空間中相鄰的點在低維空間中保持相鄰。所以tSNE不是很擅長遠距離投射至低維,所以它只保留本地數據結構提供了σ不去∞。
與tSNE不同,UMAP使用交叉熵(CE)作為成本函數,而不是KL-divergence
這導致了地方-全球結構保護平衡的巨大變化。在X的小值處,我們得到了與tSNE相同的極限,因為第二項由於前因子和對數函數比多項式函數慢的事實而消失:
因此,為了使懲罰規則最小化,Y坐標必須非常小,即Y→0。這與tSNE的行為完全一樣。但是,在大X的相反極限,即X→∞時,第一項消失,第二項的前因子為1,得到:
這里,如果Y很小,我們會得到一個很大的懲罰,因為Y在對數的分母上,因此,我們鼓勵Y很大,這樣,對數下的比率就變成了1,我們得到零懲罰。因此,我們在X→∞處得到Y→∞,所以從高維空間到低維空間的整體距離保持不變,這正是我們想要的。為了說明這一點,讓我們繪制UMAP CE成本函數:
在這里,我們可以看到圖的「右」部分看起來與上面的kl散度曲面非常相似。這意味著在X低的時候,為了減少損失,我們仍然想要Y低。然而,當X很大時,Y的距離也要很大,因為如果它很小,CE (X, Y)的損失將是巨大的。記住,之前,對於KL (X, Y)曲面,在X很大的情況下,我們在高Y值和低Y值之間沒有差別,這就是為什麼CE (X, Y)代價函數能夠保持全局距離和局部距離。
我們知道UMAP是速度比tSNE擔憂)時大量的數據點,b)嵌入維數大於2或3,c)大量環境維度的數據集。在這里,讓我們試著了解UMAP要優於tSNE來自於數學和演算法實現。
tSNE和UMAP基本上都包含兩個步驟:
然而,我注意到UMAP的第一步比tSNE快得多。這有兩個原因:
接下來,UMAP實際上在第二步中也變得更快了。這種改善也有幾個原因:
在這篇文章中,我們了解到盡管tSNE多年來一直服務於單細胞研究領域,但它有太多的缺點,如速度快、缺乏全球距離保存。UMAP總體上遵循了tSNE的哲學,但是引入了一些改進,例如另一個成本函數和缺少高維和低維概率的標准化。
除了運行速度快,內存佔用小等特點,UMAP在處理細胞學數據時還有一個大的優勢,就是可以反映細胞群體之間分化的連續性和組織性。下面將通過文獻中的數據【2】來為大家詳細講解。
對同一組數據分別進行tSNE和UMAP降維,該數據為多達30萬個從8種不同組織富集得到的T細胞和NK細胞的樣本,並使用Phenograph聚類把細胞分為6大類,每種顏色代表一種細胞。從圖中可以看出,UMAP和tSNE都可以較好地把不同類別的細胞分開。但tSNE傾向於把相同細胞群劃分為更多的群,如圖顯示,黑色圈中CD8 T細胞,在tSNE結果中,群數更多,距離更遠。
同樣這組數據用組織來源對UMAP和t-SNE圖上細胞的進行顏色區分,可以觀察到一個有意思的現象。與UMAP相比,t-SNE更加傾向於根據它們的來源來分離總體細胞。而 UMAP則會兼顧細胞群的類別和來源來排列,如圖中在CD4 T細胞和CD8 T細胞群內,細胞的排列與來源也會有一定的規律性,都是大致從臍帶血(CB)和外周血單核細胞(PBMC),到肝臟(Liver)和脾臟(Spleen),最後到一端的扁桃或另一端的皮膚(Skin)、腸道(Gut)和肺(Lung)。
通過駐留記憶T細胞標志物CD69/CD103、記憶T細胞標志物CD45 RO和naïve T細胞標志物CCR7表達群的分布,可以觀察到UMAP可以展示出T細胞連續的分化階段。而tSNE結果中,這些群之間也是連續的,但是卻沒有非常明顯的沿軸結構。同樣的現象也在造血細胞系統中被觀察到。由此可見, UMAP在大數據集的處理時可以展現細胞集群的連續性。
對三組數據(Samusik、Wong、Han_400k)分別進行數據隨機降低至100-200,000之間不同的數量級,形成小數據集。縱軸為小數據集與原始數據集的相關性,代表降維方法在不同數據量上的可重復性。UMAP表現最好,數據集越大,優勢越明顯。
下圖是UMAP和t-SNE對一套784維Fashion MNIST高維數據集降維到3維的效果的比較。
雖然這兩種演算法都表現出強大的局部聚類並將相似的類別分組在一起,但UMAP還將這些相似類別的分組彼此分開。另外,UMAP降維用了4分鍾,而多核t-SNE用了27分鍾。
UMAP的兩個最常用的參數:n_neighbors 和 min_dist,它們可有效地用於控制最終結果中局部結構和全局結構之間的平衡。
最重要的參數是 n_neighbors ,近似最近鄰居數。它有效地控制了UMAP局部結構與全局結構的平衡,數據較小時,UMAP會更加關注局部結構,數據較大時,UMAP會趨向於代表大圖結構,丟掉一些細節。
第二個參數是 min_dist,點之間的最小距離。此參數控制UMAP聚集在一起的緊密程度,數據較小時,會更緊密。較大的值會更鬆散,而將重點放在保留廣泛的拓撲結構上。
t-SNE和UMAP大部分的表現非常相似,但以下示例明顯例外:寬而稀疏的cluster中有密集的cluster(如下圖所示)。UMAP無法分離兩個嵌套的群集,尤其是在維數較高時。
UMAP在初始圖形構造中局部距離的使用可以解釋該演算法無法處理情況的原因。由於高維點之間的距離趨於非常相似(維數的詛咒),所以可能會因此將其混合在一起。
演算法很難,所以懂的人才顯得牛
天行健,君子以自強不息
Ⅶ 怎麼用Python將圖像邊界用最小二乘法擬合成曲線
本文實例講述了Python基於最小二乘法實現曲線擬合。分享給大家供大家參考,具體如下:
這里不手動實現最小二乘,調用scipy庫中實現好的相關優化函數。
考慮如下的含有4個參數的函數式:
希望本文所述對大家Python程序設計有所幫助。
Ⅷ Python中如何使用最小二乘法
##最小二乘法
importnumpyasnp##科學計算庫
importscipyassp##在numpy基礎上實現的部分演算法庫
importmatplotlib.pyplotasplt##繪圖庫
fromscipy.optimizeimportleastsq##引入最小二乘法演算法
'''
設置樣本數據,真實數據需要在這里處理
'''
##樣本數據(Xi,Yi),需要轉換成數組(列表)形式
Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])
'''
設定擬合函數和偏差函數
函數的形狀確定過程:
1.先畫樣本圖像
2.根據樣本圖像大致形狀確定函數形式(直線、拋物線、正弦餘弦等)
'''
##需要擬合的函數func:指定函數的形狀
deffunc(p,x):
k,b=p
returnk*x+b
##偏差函數:x,y都是列表:這里的x,y更上面的Xi,Yi中是一一對應的
deferror(p,x,y):
returnfunc(p,x)-y
'''
主要部分:附帶部分說明
1.leastsq函數的返回值tuple,第一個元素是求解結果,第二個是求解的代價值(個人理解)
2.官網的原話(第二個值):
3.實例:Para=>(array([0.61349535,1.79409255]),3)
4.返回值元組中第一個值的數量跟需要求解的參數的數量一致
'''
#k,b的初始值,可以任意設定,經過幾次試驗,發現p0的值會影響cost的值:Para[1]
p0=[1,20]
#把error函數中除了p0以外的參數打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#讀取結果
k,b=Para[0]
print("k=",k,"b=",b)
print("cost:"+str(Para[1]))
print("求解的擬合直線為:")
print("y="+str(round(k,2))+"x+"+str(round(b,2)))
'''
繪圖,看擬合效果.
matplotlib默認不支持中文,label設置中文的話需要另行設置
如果報錯,改成英文就可以
'''
#畫樣本點
plt.figure(figsize=(8,6))##指定圖像比例:8:6
plt.scatter(Xi,Yi,color="green",label="樣本數據",linewidth=2)
#畫擬合直線
x=np.linspace(0,12,100)##在0-15直接畫100個連續點
y=k*x+b##函數式
plt.plot(x,y,color="red",label="擬合直線",linewidth=2)
plt.legend(loc='lowerright')#繪制圖例
plt.show()
Ⅸ 如何應用最小二乘法進行實驗曲線擬合
打開Excel,先將數據繪成線性圖,然後在圖表中添加趨勢線,然後勾選:顯示公式,就可以擬合出數據的公式了。
Ⅹ Python中如何使用最小二乘法
static void(int[]group) { int temp; int pos=0; for(int i=0;i< group.Length-1;i++) { pos=i; for(intj=i+1;j