⑴ 排序演算法總結
排序演算法是什麼?有多少種?排序演算法總結又是怎樣?以下是為您整理的排序演算法總結,供您參考!
排序演算法:一種能將一串數據依照特定的排序方式進行排列的一種演算法。
排序演算法性能:取決於時間和空間復雜度,其次還得考慮穩定性,及其適應的場景。
穩定性:讓原本有相等鍵值的記錄維持相對次序。也就是若一個排序演算法是穩定的,當有倆個相等鍵值的記錄R和S,且原本的序列中R在S前,那麼排序後的列表中R應該也在S之前。
以下來總結常用的排序演算法,加深對排序的理解。
冒泡排序
原理
倆倆比較相鄰記錄的排序碼,若發生逆序,則交旅派配換;有倆種方式進行冒泡,一種是先把小的冒泡到前邊去,另一種是把大的元素冒泡到後邊。
性能
時間復雜度為O(N^2),空間復雜度為O(1)。排序是穩定的,排序比較次數與初始序列無關,但交換次數與初始序列有關。
優化
若初始序列就是排序好的,對於冒泡排序仍然還要比較O(N^2)次,但無交換次數。可根據這個進行優化,設置一個flag,當在一趟序列中沒有發生交換,則該序列已排序好,但優化後排序的時間復雜度沒有發生量級的改變。
代碼
插入排序
原理
依次選擇一個待排序的數據,插入到前邊已排好序的序列中。
性能
時間復雜度為O(N^2),空間復雜度為O(1)。演算法是穩定的,比較次數和交換次數都與初始序列有關。
優化
直接插入排序每次往前插入時,是按順序依次往前找,可在這里進行優化,往前找合適的插入位置時採用二分查找的方式,即折半插入。
折半插入排序相對直接插入排序而言:平均性能更快,時間復雜度降至O(NlogN),排序是穩定的,但排序的比較次數與初始序列無關,總是需要foor(log(i))+1次排序比較。
使用場景
當數據基本有序時,採用插入排序可以明顯減少數據交換和數據移動次數,進而提升排序效率。
代碼
希爾排拆指序
原理
插入排序的改進版,是基於插入排序的以下倆點性質而提出的改進方法:
插入排序對幾乎已排好序的數據操作時,效率很高,可以達到線性排序的效率。
但插入排序在每次往前插入時只能將數據移動一位,效率比較低。
所以希爾排序的思想是:
先是取一個合適的gap
縮小間隔gap,例如去gap=ceil(gap/2),重復上述子序列劃分和排序
直到,最後gap=1時,將所有元素放在同一個序列中進行插入排序為止。
性能
開始時,gap取值較大,子序列中的元素較少,排序速度快,克服了直接插入排序的缺點;其次,gap值逐漸變小後,雖然子序列的元素逐漸變多,但大多元素已基本有序,所以繼承了直接插入排序的優點,能以近線性的速度排好序。
代碼
選擇排序
原理
每次從未排序的序列中找到最小值,記錄並最後存放到已排序序羨碰列的末尾
性能
時間復雜度為O(N^2),空間復雜度為O(1),排序是不穩定的(把最小值交換到已排序的末尾導致的),每次都能確定一個元素所在的最終位置,比較次數與初始序列無關。
代碼
快速排序
原理
分而治之思想:
Divide:找到基準元素pivot,將數組A[p..r]劃分為A[p..pivotpos-1]和A[pivotpos+1…q],左邊的元素都比基準小,右邊的元素都比基準大;
Conquer:對倆個劃分的數組進行遞歸排序;
Combine:因為基準的作用,使得倆個子數組就地有序,無需合並操作。
性能
快排的平均時間復雜度為O(NlogN),空間復雜度為O(logN),但最壞情況下,時間復雜度為O(N^2),空間復雜度為O(N);且排序是不穩定的,但每次都能確定一個元素所在序列中的最終位置,復雜度與初始序列有關。
優化
當初始序列是非遞減序列時,快排性能下降到最壞情況,主要因為基準每次都是從最左邊取得,這時每次只能排好一個元素。
所以快排的優化思路如下:
優化基準,不每次都從左邊取,可以進行三路劃分,分別取最左邊,中間和最右邊的中間值,再交換到最左邊進行排序;或者進行隨機取得待排序數組中的某一個元素,再交換到最左邊,進行排序。
在規模較小情況下,採用直接插入排序
代碼
歸並排序
原理
分而治之思想:
Divide:將n個元素平均劃分為各含n/2個元素的子序列;
Conquer:遞歸的解決倆個規模為n/2的子問題;
Combine:合並倆個已排序的子序列。
性能
時間復雜度總是為O(NlogN),空間復雜度也總為為O(N),演算法與初始序列無關,排序是穩定的。
優化
優化思路:
在規模較小時,合並排序可採用直接插入;
在寫法上,可以在生成輔助數組時,倆頭小,中間大,這時不需要再在後邊加倆個while循環進行判斷,只需一次比完。
代碼
堆排序
原理
堆的性質:
是一棵完全二叉樹
每個節點的值都大於或等於其子節點的值,為最大堆;反之為最小堆。
堆排序思想:
將待排序的序列構造成一個最大堆,此時序列的最大值為根節點
依次將根節點與待排序序列的最後一個元素交換
再維護從根節點到該元素的前一個節點為最大堆,如此往復,最終得到一個遞增序列
性能
時間復雜度為O(NlogN),空間復雜度為O(1),因為利用的排序空間仍然是初始的序列,並未開辟新空間。演算法是不穩定的,與初始序列無關。
使用場景
想知道最大值或最小值時,比如優先順序隊列,作業調度等場景。
代碼
計數排序
原理
先把每個元素的出現次數算出來,然後算出該元素所在最終排好序列中的絕對位置(最終位置),再依次把初始序列中的元素,根據該元素所在最終的絕對位置移到排序數組中。
性能
時間復雜度為O(N+K),空間復雜度為O(N+K),演算法是穩定的,與初始序列無關,不需要進行比較就能排好序的演算法。
使用場景
演算法只能使用在已知序列中的元素在0-k之間,且要求排序的復雜度在線性效率上。
代碼
桶排序
原理
根據待排序列元素的大小范圍,均勻獨立的劃分M個桶
將N個輸入元素分布到各個桶中去
再對各個桶中的元素進行排序
此時再按次序把各桶中的元素列出來即是已排序好的。
性能
時間復雜度為O(N+C),O(C)=O(M(N/M)log(N/M))=O(NlogN-NlogM),空間復雜度為O(N+M),演算法是穩定的,且與初始序列無關。
使用場景
演算法思想和散列中的開散列法差不多,當沖突時放入同一個桶中;可應用於數據量分布比較均勻,或比較側重於區間數量時。
基數排序
原理
對於有d個關鍵字時,可以分別按關鍵字進行排序。有倆種方法:
MSD:先從高位開始進行排序,在每個關鍵字上,可採用計數排序
LSD:先從低位開始進行排序,在每個關鍵字上,可採用桶排序
性能
時間復雜度為O(d*(N+K)),空間復雜度為O(N+K)。
總結
以上排序演算法的時間、空間與穩定性的總結如下:
⑵ R-CNN, Fast R-CNN, Faster R-CNN, YOLO:目標檢測演算法總結
參考鏈接
以下是文中涉及的演算法的最原始的文章:
一個最直接的解決辦法是從圖中取不同的感興趣區域,然後對這些區域用CNN進行分類,檢測這些區域中是否有物體的存在。
但是待檢測物體可能存在於圖片的不同位置而且有不同的長寬比例。所以以上方法需要選取量非常大的區域並需要非常大的計算量。
因此,R-CNN, Fast R-CNN, Faster R-CNN, YOLO被開發去又快又准地找物體。
為了解決上述提到的有大量區域被選擇的問題, Ross Girshick et al 提出了一種方法:用了選擇性搜索從圖片提取了2000個區域,這些區域被稱為」region proposals「。
用這種辦法,我們不需要去分類巨大數量的區域了,我們只需要去處理2000個區域。這2000個區域是用如下的選擇性搜索演算法(selective search algorithm)來找到的:
這篇文章 介紹了更多關於選擇性搜索演算法(selective search algorithm)的內容。
RCNN步驟:
R-CNN存在的問題:
Fast R-CNN的幾個改進:
The same author of the previous paper(R-CNN) solved some of the drawbacks of R-CNN to build a faster object detection algorithm and it was called Fast R-CNN. The approach is similar to the R-CNN algorithm.
Fast R-CNN更快的原因是:
Fast R-CNN更快:
From the above graphs, you can infer that Fast R-CNN is significantly faster in training and testing sessions over R-CNN. When you look at the performance of Fast R-CNN ring testing time, including region proposals slows down the algorithm significantly when compared to not using region proposals. Therefore, region proposals become bottlenecks in Fast R-CNN algorithm affecting its performance.
上面兩個演算法的缺點:
selective search耗時
Both of the above algorithms(R-CNN & Fast R-CNN) uses selective search to find out the region proposals . Selective search is a slow and time-consuming process affecting the performance of the network.
Faster R-CNN的改進:
不用selective search去找region proposals;
用network去找region proposals;
Therefore, Shaoqing Ren et al . came up with an object detection algorithm that eliminates the selective search algorithm and lets the network learn the region proposals .
Faster R-CNN的步驟:
時間上的對比:
Faster R-CNN最快並且能用作實時目標檢測
之前幾種演算法的缺點:
產生region的時候沒有縱覽整幅圖。其實圖的某些部分有更高的可能性包含物體。
All of the previous object detection algorithms use regions to localize the object within the image. The network does not look at the complete image. Instead, parts of the image which have high probabilities of containing the object .
YOLO的思想:
用一個單獨的網路去預測bounding boxes和bounding boxes中存在物體的概率
YOLO or You Only Look Once is an object detection algorithm much different from the region based algorithms seen above.
In YOLO, a single convolutional network predicts (1) the bounding boxes and (2)the class probabilities for these boxes.
YOLO的具體步驟:
How YOLO works is that:
YOLO的優缺點:
⑶ 優化演算法總結
本文介紹一下機器學習和深度學習中常用的優化演算法和優化器以及一些其他我知道的優化演算法,部分演算法我也沒有搞懂,就先記錄下來以後慢慢研究吧.*_*.
1.梯度下降演算法(Gradient Descent)
梯度下降法可以參考我另一篇文章 機器學習-線性回歸 里的講解,這里就不在重復敘述.這里需要強調一下,深度學習里常用的SGD,翻譯過來是隨機梯度下降,但是實質是mini-batch梯度下降(mini-batch-gd),或者說是兩者的結合更准確一些.
SGD的優點是,演算法簡單,計算量小,在函數為凸函數時可以找到全局最優解.所以是最常用的優化演算法.缺點是如果函數不是凸函數的話,很容易進入到局部最優解而無法跳出來.同時SGD在選擇學習率上也是比較困難的.
2.牛頓法
牛頓法和擬牛頓法都是求解無約束最優化問題的常用方法,其中牛頓法是迭代演算法,每一步需要求解目標函數的海森矩陣的逆矩陣,計算比較復雜.
牛頓法在求解方程根的思想:在二維情況下,迭代的尋找某一點x,尋找方法是隨機一個初始點x_0,目標函數在該點x_0的切線與x坐標軸的交點就是下一個x點,也就是x_1.不斷迭代尋找x.其中切線的斜率為目標函數在點x_0的導數(梯度),切必過點(x_0,f(x_0)).所以迭代的方程式如圖1,為了求該方程的極值點,還需要令其導數等於0,也就是又求了一次導數,所以需要用到f(x)的二階導數.
在最優化的問題中,牛頓法提供了一種求解的辦法. 假設任務是優化一個目標函數f, 求函數ff的極大極小問題, 可以轉化為求解函數f導數等於0的問題, 這樣求可以把優化問題看成方程求解問題(f的導數等於0). 剩下的問題就和牛頓法求解方程根的思想很相似了.
目標函數的泰勒展開式:
化簡後:
這樣就得到了與圖1相似的公式,這里是二維的,在多維空間上,求二階導數就是求海森矩陣,因為是分母,所以還需要求海森矩陣的逆矩陣.
牛頓法和SGD的區別:
牛頓法是二階求導,SGD是一階求導,所以牛頓法要收斂的更快一些.SGD只考慮當前情況下梯度下降最快的方向,而牛頓法不僅考慮當前梯度下降最快,還有考慮下一步下降最快的方向.
牛頓法的優點是二階求導下降速度快,但是因為是迭代演算法,每一步都需要求解海森矩陣的逆矩陣,所以計算復雜.
3.擬牛頓法(沒搞懂,待定)
考慮到牛頓法計算海森矩陣比較麻煩,所以它使用正定矩陣來代替海森矩陣的逆矩陣,從而簡化了計算過程.
常用的擬牛頓法有DFP演算法和BFGS演算法.
4.共軛梯度法(Conjugate Gradient)
共軛梯度法是介於最速下降法與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法計算海森矩陣並求逆的缺點.共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的演算法之一.
5.拉格朗日法
參考SVM里的講解 機器學習-SVM
6.動量優化法(Momentum)
動量優化法主要是在SGD的基礎上,加入了歷史的梯度更新信息或者說是加入了速度更新.SGD雖然是很流行的優化演算法,但是其學習過程很慢,因為總是以同樣的步長沿著梯度下降的方向.所以動量是為了加速學習的方法.
其中第一行的減號部分是計算當前的梯度,第一行是根據梯度更新速度v,而α是新引進的參數,在實踐中,α的一般取值為 0.5,0.9 和 0.99.和學習率 一樣,α 也會隨著時間不斷調整.一般初始值是一個較小的值,隨後會慢慢變大.
7.Nesterov加速梯度(NAG, Nesterov accelerated gradient)
NAG是在動量優化演算法的基礎上又進行了改進.根據下圖可以看出,Nesterov 動量和標准動量之間的區別體現在梯度計算上, Nesterov 動量中,梯度計算在施加當前速度之後.因此,Nesterov 動量可以解釋為往標准動量方法中添加了一個校正因子
8.AdaGrad演算法
AdaGrad演算法,自適應優化演算法的一種,獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平均值總和的平方根.具有代價函數最大梯度的參數相應地有個快速下降的學習率,而具有小梯度的參數在學習率上有相對較小的下降.通俗一點的講,就是根據實際情況更改學習率,比如模型快要收斂的時候,學習率步長就會小一點,防止跳出最優解.
其中g是梯度,第一行的分母是計算累計梯度的平方根, 是為了防止分母為0加上的極小常數項,α是學習率.
Adagrad的主要優點是不需要人為的調節學習率,它可以自動調節.但是依然需要設置一個初始的全局學習率.缺點是隨著迭代次數增多,學習率會越來越小,最終會趨近於0.
9.RMSProp演算法
RMSProp修改 AdaGrad 以在非凸設定下效果更好,改變梯度積累為指數加權的移動平均.AdaGrad旨在應用於凸問題時快速收斂.
10.AdaDelta演算法
11.Adam演算法
Adam是Momentum和RMSprop的結合體,也就是帶動量的自適應優化演算法.
12.Nadam演算法
13.模擬退火演算法
14.蟻群演算法
15.遺傳演算法
動量是為了加快學習速度,而自適應是為了加快收斂速度,注意學習速度快不一定收斂速度就快,比如步長大學習速度快,但是很容易跳出極值點,在極值點附近波動,很難達到收斂.
未完待定....
參考:
《統計學習方法》 李航 著
《深度學習》 花書
⑷ 圖像分割演算法總結
圖像處理的很多任務都離不開圖像分割。因為圖像分割在cv中實在太重要(有用)了,就先把圖像分割的常用演算法做個總結。
接觸機器學習和深度學習時間已經不短了。期間看過各種相關知識但從未總結過。本文過後我會盡可能詳細的從工程角度來總結,從傳統機器學習演算法,傳統計算機視覺庫演算法到深度學習目前常用演算法和論文,以及模型在各平台的轉化,量化,服務化部署等相關知識總結。
圖像分割常用演算法大致分為下面幾類。由於圖像的能量范函,邊緣追蹤等方法的效果往往只能解決特定問題,效果並不理想,這里不再闡述。當然二值化本身也可以分割一些簡單圖像的。但是二值化演算法較多,我會專門做一個文章來總結。這里不再贅述。
1.基於邊緣的圖像分割演算法:
有利用圖像梯度的傳統演算法運算元的sobel,roberts,prewitt,拉普拉斯以及canny等。
這些演算法的基本思想都是採用合適的卷積運算元,對圖像做卷積。從而求出圖像對應的梯度圖像。(至於為什麼通過如圖1這樣的運算元卷積,即可得到圖像的梯度圖像,請讀者復習下卷積和倒數的概念自行推導)由於圖像的邊緣處往往是圖像像素差異較大,梯度較大地方。因此我們通過合適的卷積核得到圖像的梯度圖像,即得到了圖像的邊緣圖像。至於二階運算元的推導,與一階類似。優點:傳統運算元梯度檢測,只需要用合適的卷積核做卷積,即可快速得出對應的邊緣圖像。缺點:圖像邊緣不一定準確,復雜圖像的梯度不僅僅出現在圖像邊緣,可以能出現在圖像內部的色彩和紋理上。
也有基於深度學習方法hed,rcf等。由於這類網路都有同一個比較嚴重的缺陷,這里只舉例hed網路。hed是基於FCN和VGG改進,同時引出6個loss進行優化訓練,通過多個層輸出不同scale的粒度的邊緣,然後通過一個訓練權重融合各個層的邊緣結果。hed網路結構如下:
可以得到一個比較完整的梯度圖像,可參考github的hed實現。優點:圖像的梯度細節和邊緣完整性,相比傳統的邊緣運算元要好很多。但是hed對於邊緣的圖像內部的邊緣並不能很好的區分。當然我們可以自行更改loss來嘗試只擬合外部的圖像邊緣。但最致命的問題在於,基於vgg的hed的網路表達能力有限,對於圖像和背景接近,或者圖像和背景部分相融的圖片,hed似乎就有點無能為力了。
2.基於區域分割的演算法:
區域分割比較常用的如傳統的演算法結合遺傳演算法,區域生長演算法,區域分裂合並,分水嶺演算法等。這里傳統演算法的思路是比較簡單易懂的,如果有無法理解的地方,歡迎大家一起討論學習。這里不再做過多的分析。
基於區域和語意的深度學習分割演算法,是目前圖像分割成果較多和研究的主要方向。例如FCN系列的全卷積網路,以及經典的醫學圖像分割常用的unet系列,以及rcnn系列發展下的maskrcnn,以及18年底的PAnet。基於語意的圖像分割技術,無疑會成為圖像分割技術的主流。
其中,基於深度學習語意的其他相關演算法也可以間接或直接的應用到圖像分割。如經典的圖像matting問題。18年又出現了許多非常優秀的演算法和論文。如Deep-Image-Matting,以及效果非常優秀的MIT的 semantic soft segmentation(sss).
基於語意的圖像分割效果明顯要好於其他的傳統演算法。我在解決圖像分割的問題時,首先嘗試用了hed網路。最後的效果並不理想。雖然也參考github,做了hed的一些fine-tune,但是還是上面提到的原因,在我多次嘗試後,最終放棄。轉而適用FCN系列的網路。但是fcn也無法解決圖像和背景相融的問題。圖片相融的分割,感覺即需要大的感受野,又需要未相融部分原圖像細節,所以單原FCN的網路,很難做出准確的分割。中間還測試過很多其他相關的網路,但都效果不佳。考慮到感受野和原圖像細節,嘗試了resnet和densenet作為圖像特徵提取的底層。最終我測試了unet系列的網路:
unet的原始模型如圖所示。在自己拍照爬蟲等手段採集了將近1000張圖片。去掉了圖片質量太差的,圖片內容太過類似的。爬蟲最終收集160多張,自己拍照收集200張圖片後,又用ps手動p了邊緣圖像,採用圖像增強變換,大約有300*24張圖片。原生unet網路的表現比較一般。在將unet普通的卷積層改為resnet後,網路的表達能力明顯提升。在將resnet改為resnet101,此時,即使對於部分相融的圖像,也能較好的分割了。但是unet的模型體積已經不能接受。
在最後階段,看到maskrcnn的實例分割。maskrcnn一路由rcnn,fasterrcnn發展過來。於是用maskrcnn來加入自己的訓練數據和label圖像進行訓練。maskrcnn的結果表現並不令人滿意,對於邊緣的定位,相比於其他演算法,略顯粗糙。在產品應用中,明顯還不合適。
3.基於圖的分割演算法
基於深度學習的deepgrab,效果表現並不是十分理想。deepgrab的git作者backbone採用了deeplabv2的網路結構。並沒有完全安裝原論文來做。
論文原地址參考: https://arxiv.org/pdf/1707.00243.pdf
整體結構類似於encode和decoder。並沒有太仔細的研究,因為基於resent101的結構,在模型體積,速度以及deeplab的分割精度上,都不能滿足當前的需求。之前大致總結過計算機視覺的相關知識點,既然目前在討論移動端模型,那後面就分模塊總結下移動端模型的應用落地吧。
由於時間實在有限。這里並沒有針對每個演算法進行詳細的講解。後續我會從基礎的機器學習演算法開始總結。
⑸ 數學建模演算法總結
無總結反省則無進步
寫這篇文章,一是為了總結之前為了准備美賽而學的演算法,而是將演算法羅列並有幾句話解釋方便以後自己需要時來查找。
數學建模問題總共分為四類:
1. 分類問題 2. 優化問題 3. 評價問題 4. 預測問題
我所寫的都是基於數學建模演算法與應用這本書
一 優化問題
線性規劃與非線性規劃方法是最基本經典的:目標函數與約束函數的思想
現代優化演算法:禁忌搜索;模擬退火;遺傳演算法;人工神經網路
模擬退火演算法:
簡介:材料統計力學的研究成果。統計力學表明材料中不同結構對應於粒子的不同能量水平。在高溫條件下,粒子的能量較高,可以自由運動和重新排列。在低溫條件下,粒子能量較低。如果從高溫開始,非常緩慢地降溫(此過程稱為退火),粒子就可以在每個溫度下達到熱平衡。當系統完全被冷卻時,最終形成處於低能狀態的晶體。
思想可用於數學問題的解決 在尋找解的過程中,每一次以一種方法變換新解,再用退火過程的思想,以概率接受該狀態(新解) 退火過程:概率轉化,概率為自然底數的能量/KT次方
遺傳演算法: 遺傳演算法是一種基於自然選擇原理和自然遺傳機制的搜索演算法。模擬自然界中的生命進化機制,在人工系統中實現特定目標的優化。
遺傳演算法的實質是通過群體搜索技術(?),根據適者生存的原則逐代進化,最終得到最優解或准最優解。
具體實現過程(P329~331)
* 編碼
* 確定適應度函數(即目標函數)
* 確定進化參數:群體規模M,交叉概率Pc,變異概率Pm,進化終止條件
* 編碼
* 確定初始種群,使用經典的改良圈演算法
* 目標函數
* 交叉操作
* 變異操作
* 選擇
改良的遺傳演算法
兩點改進 :交叉操作變為了以「門當戶對」原則配對,以混亂序列確定較差點位置 變異操作從交叉操作中分離出來
二 分類問題(以及一些多元分析方法)
* 支持向量機SVM
* 聚類分析
* 主成分分析
* 判別分析
* 典型相關分析
支持向量機SVM: 主要思想:找到一個超平面,使得它能夠盡可能多地將兩類數據點正確分開,同時使分開的兩類數據點距離分類面最遠
聚類分析(極其經典的一種演算法): 對樣本進行分類稱為Q型聚類分析 對指標進行分類稱為R型聚類分析
基礎:樣品相似度的度量——數量化,距離——如閔氏距離
主成分分析法: 其主要目的是希望用較少的變數去解釋原來資料中的大部分變異,將掌握的許多相關性很高的變數轉化成彼此相互獨立或不相關的變數。通常是選出比原始變數個數少,能解釋大部分資料中的變異的幾個新變數,及主成分。實質是一種降維方法
判別分析: 是根據所研究的個體的觀測指標來推斷個體所屬類型的一種統計方法。判別准則在某種意義下是最優的,如錯判概率最小或錯判損失最小。這一方法像是分類方法統稱。 如距離判別,貝葉斯判別和FISHER判別
典型相關分析: 研究兩組變數的相關關系 相對於計算全部相關系數,採用類似主成分的思想,分別找出兩組變數的各自的某個線性組合,討論線性組合之間的相關關系
三 評價與決策問題
評價方法分為兩大類,區別在於確定權重上:一類是主觀賦權:綜合資訊評價定權;另一類為客觀賦權:根據各指標相關關系或各指標值變異程度來確定權數
* 理想解法
* 模糊綜合評判法
* 數據包絡分析法
* 灰色關聯分析法
* 主成分分析法(略)
* 秩和比綜合評價法 理想解法
思想:與最優解(理想解)的距離作為評價樣本的標准
模糊綜合評判法 用於人事考核這類模糊性問題上。有多層次模糊綜合評判法。
數據包絡分析法 是評價具有多指標輸入和多指標輸出系統的較為有效的方法。是以相對效率為概念基礎的。
灰色關聯分析法 思想:計算所有待評價對象與理想對象的灰色加權關聯度,與TOPSIS方法類似
主成分分析法(略)
秩和比綜合評價法 樣本秩的概念: 效益型指標從小到大排序的排名 成本型指標從大到小排序的排名 再計算秩和比,最後統計回歸
四 預測問題
* 微分方程模型
* 灰色預測模型
* 馬爾科夫預測
* 時間序列(略)
* 插值與擬合(略)
* 神經網路
微分方程模型 Lanchester戰爭預測模型。。
灰色預測模型 主要特點:使用的不是原始數據序列,而是生成的數據序列 優點:不需要很多數據·,能利用微分方程來充分挖掘系統的本質,精度高。能將無規律的原始數據進行生成得到規律性較強的生成序列。 缺點:只適用於中短期預測,只適合指數增長的預測
馬爾科夫預測 某一系統未來時刻情況只與現在狀態有關,與過去無關。
馬爾科夫鏈
時齊性的馬爾科夫鏈
時間序列(略)
插值與擬合(略)
神經網路(略)
⑹ 推薦演算法總結
一、協同過濾
基於用戶協同過濾UserCF
基於物品協同過濾ItemCF
基於模型協同過濾Mode_based
基於用戶和基於物品協同過濾都稱為以記憶為基礎的協同過濾技術,共同缺點是資料稀疏、難以處理大數據量下的即時結果,因此發展出基於模型的協同過濾
核心思想:
基於歷史資料得到一個模型,再用此模型進行預測用戶對物品的評分
二、聚類演算法
三、分類演算法:
主要思路:根據文本特徵或屬性,劃分到已有的類別中。常用分類演算法包括:決策樹分類法、樸素的貝葉斯分類演算法、基於支持向量機的分類器,神經網路法,K-最近鄰法,模糊分類法
#樸素貝葉斯分類演算法
⑺ 比對演算法總結(二)——基於BWT索引結構的比對演算法-Bowite1
這是美國馬里蘭大學計算機研究所、生物信息學和計算生物學中心於2009年發表在《Genome Biology》雜志的一篇經典文章,至此以後依賴於BWT索引的比對演算法成為主流。 Bowite 是一款超快速、內存佔用低的短序列比對軟體,適用於將短reads比對至大型參考基因組。採用Burrows-Wheeler 演算法建立索引的Bowite軟體可以在1 CPU時內,將2000萬條reads 比對至人參考基因組,且內存只佔有1.3Gb。於此同時Bowite 採用了新的quality-aware backtracking(質量回溯)演算法,比對過程允許錯配。
在此之前都是採用對reads (SHRiMP, Maq, RMAP,ZOOM) 或者參考基因組 (SOAP)構建哈希表的演算法進行序列比對,該演算法已在上篇文章中進行了介紹 https://www.jianshu.com/p/f5ccff73b181 。
Bowite 採用了一種完全新的索引構建策略,適用於哺乳動物重測序。根據千人基因組計劃數據,Bowite 在35bp PE 序列上的比對速度要比Maq 軟體快35 倍,比SOAP軟體快300倍。Bowite 採用 Burrows-Wheeler 演算法對 full-text minute-space (FM) 構建索引,人參考基因組佔用的內存為1.3 GB。
為了追求速度,Bowite 針對哺乳動物重測序項目進行了很多合理的折中。例如,如果一條reads有多條最優匹配,Bowite 只會輸出一條最優匹配。當輸出的最優匹配也不是完全匹配時,Bowite並不能保證在所有情況下都能輸出最高質量的匹配。在設定了較高的匹配閾值時,一小部分含有多個錯配的reads可能會比對失敗。在默認參數條件下,Bowite 的靈敏度與SOAP 相當,略低於Maq。可以在命令行手動改變參數,在犧牲更多時間的情況下,增加靈敏度,給出reads所有可能的比對結果。目前Bowite 比對的reads長度范圍為4bp - 1024bp。
Bowite 對參考基因組建立索引的方法是 Burrows-Wheeler transform (BWT) 和 FM index。Bowite 建立的人類基因組索引在硬碟上的大小為2.2GB,在比對時的內存為1.3GB。FM index 常用的精確查找方法為 Ferragina 和 Manzini 演算法。Bowite 沒有完全使用該演算法,因為該演算法不允許錯配,不能比對含有測序錯誤和變異的reads。針對這種情況,Bowite引入了新的擴展演算法:quality-aware backtracking 演算法,允許錯配並支持高質量比對;double indexing 策略,避免過度回溯;Bowite比對策略與Maq軟體相似,允許小部分的高質量reads 含有錯配,並且對所有的錯配位點的質量值設置了上限閾值。
BWT 轉換是字元串的可逆性排列,它最早應用於文本數據的壓縮,依賴BWT建立的索引,可以在較低內存下,實現大型文本的有效搜索。它被在生物信息學中有廣泛的應用,包括重復區域計數、全基因組比對、微陣列探針設計、Smith-Waterman 比對到人參考基因組。Burrows-Wheeler transform (BWT) 的轉換步驟如圖1所示:
1、輪轉排序。如圖1a 所示,(1)將字元$ 添加到文本 T (acaacg)的末尾,但需注意其中字元$ 並未實際添加到文本 T 中,且其在字母表中邏輯順序小於 T 中所有出現過的字元。(2) 然後將當前字元串的第一個字元移到最後一位,形成一個新的字元串,再將新的字元串的第一位移到最後一位形成另一個新的字元串,就這樣不斷循環這個過程,直到字元串循環完畢(即$處於第一位),這樣就形成了一個基於原字元串的字元矩陣M(這一步原圖1a 進行了省略,見下方小圖)。(3) 然後對矩陣M的各行字元按照字典先後順序排序,獲得排序後的字元矩陣 BWM(T),矩陣的最後一列定義為 BWT(T)。 前期經過一個小復雜的過程獲得了BWT(T)列,那這一列到底有什麼用呢?其實BWT(T)列通過簡單的演算法就可以推算出原始文本T的所有信息。而經過轉換之後的BWT(T)列大量重復字元是靠近的,只儲存該列信息,可以大大提高字元壓縮比例。
2、LF-Mapping。圖1a 轉換矩陣 BWM(T)含有一種 'last first (LF) mapping' 的特性,即最後一列L中出現某字元出現的順序與第一列F某字元出現的次序時一致的。根據Supplementary1 圖中演算法1 STEPLEFT 和 演算法2 UNPERMUTE 就可以推算出BWT(T)到 T 的過程, 圖1 b記錄了整個推算過程。 詳細推算過程可參考這個博客介紹: https://blog.csdn.net/stormlovetao/article/details/7048481 。
3、reads精確匹配。使用BWT演算法的最終目的是要將短reads比對到參考基因組上,確定短reads在參考基因組上的具體位置。轉換後的BWT(T)序列,可以利用Supplementary1 圖中演算法3 EXACTMATCH 實現reads的精確匹配。圖1c 列出了 字元串 aac 比對至acaacg 的過程 。 詳細推算過程可參考這篇介紹: https://zhuanlan.hu.com/p/158901556 。
上述的BWT轉換只能用於精確的匹配,但是測序reads是含有測序錯誤和突變的,精確匹配並不適用。這里應用了 backtracking 搜索的演算法,用於允許錯配快速比對 。含有錯配的reads只是一小部分。測序reads的每個鹼基都含有唯一的測序量值,測序質量值越該位點是測序錯誤的可能越大,只有當一條read 的所有錯配的測序質量值總和小於一定閾值時可以允許錯誤匹配。
圖2顯示了精確匹配和非精確匹配的過程,backtracking 搜索過程類似於 EXACTMATCH ,首先計算連續較長的後綴矩陣。如果矩陣中沒有搜索到相應的reads,則演算法會選擇一個已經匹配的查詢位置,替換一個不同鹼基,再次進行匹配。EXACTMATCH搜索從被替換位置之後開始,這樣就可以比對就可以允許一定的錯配。backtracking 過程發生在堆棧結構的上下文中,當有替換產生時,堆棧的結構會增長;當所有結果都不匹配時,堆棧結構會收縮。
Bowite 軟體的搜索演算法是比較貪婪的,Bowite軟體會報出遇到的第一個有效比對,並不一定是在錯配數目和變異質量上的「最佳比對」。沒有查詢最優比對的原因是尋找「最佳比對」會比現有的模型慢2-3倍。而在重測序項目上,速度是更重要的因素。Bowite 也設置了可以輸出多個比對位置(-k)和所有比對位置(-a)的參數,添加這些參數後,比對速度會顯著變慢。
目前的比對軟體會有過度回溯的情況,在reads的3『端花費大量無用時間去回溯。Bowite利用『double indexing』技術減少了過度回溯的發生。簡單來說就是對正向參考基因組進行BWT轉換,稱為 『Forward index』,同時對反向(注意不是互補配對序列,是反向序列)參考基因組也進行BWT轉換,稱為『Mirror index』。 當只允許一個錯配時,比對根據reads是前半段出現錯配,還是後半段出現錯配會有兩種情況:(1)Phase1 將Forward index 載入入內存,不允許查詢reads右半段出現錯配;(2)Phase2 將Mirror index 載入如內存,不允許查詢序列的反向reads右半段(原查詢序列的左半端) 出現錯配。這樣可以避免過度回溯,提高比比對的靈敏度。 但是,如果比對軟體允許一個reads有多個錯配時,仍然會有過度回溯的現象發生,為了減少過度回溯現象的發生,這里將回溯的上限進行了限定(默認值為:125次)。
Bowite 允許使用者在高質量reads的末端(默認是28bp)設置錯配數目(默認的錯配數目是2)。高質量reads末端的28bp序列被稱為 '種子' 序列。這個『種子』序列又可分為兩等份:14bp的高質量末端稱為 『hi-half』(通常位於5『端),14bp的低質量末端稱為『lo-half』。 如果種子序列只允許2bp 的錯配,比對會出現4 種情況:(1)種子序列中沒有錯配(case1);(2)hi-half區域沒有錯配,lo-half區域有一個或兩個錯配(case2);(3)lo-half區域沒有錯配,hi-half區域有一個或兩個錯配(case3);(4)lo-half區域有一個錯配,hi-half區域有一個錯配(case4);
在所有情況下,reads的非種子部分允許任意數目的錯配。如圖3所示,Bowite 演算法會根據上面4 種情況交替變化『Forward index』和『Mirror index』比對策略,主要會有三種比對策略。
Bowite 建立一次參考基因組索引後,後續的比對可反復使用該索引。表1和表2列出了在默認參數條件下,Bowite、SOAP、Maq軟體性能的比較。在reads比對率相近的條件下,Bowite軟體的比對速度速度相對於SOAP、Maq軟體有較大的提升。
1、將reads 比對至人參考基因組上,Bowite相對於SOAP和Maq軟體有較大的優勢。它運行的內存非常小(1.2GB),在相同靈敏度下,速度有了較大的提升。
2、Bowite 軟體建立一次參考基因組索引後,後續的比對可反復使用該索引。
3、Bowite 速度快、內存佔用小、靈敏度高主要是因為使用了BWT演算法構建索引、利用回溯演算法允許錯配、採用Double index策略避免過度回溯。
4、Bowite 軟體目前並不支持插入、缺失比對,這個是今後需要努力的方向。
[1] Langmead B . Ultrafast and memory-efficient alignment of short DNA sequences to the human genome[J]. Genome biology, 2009, 10(3):R25.
[2] BWT 推算過程參考博客 https://blog.csdn.net/stormlovetao/article/details/7048481
[3] FM index 精確查匹配過程參考文章 https://zhuanlan.hu.com/p/158901556
⑻ 《演算法心得:高效演算法的奧秘(原書第2版)》pdf下載在線閱讀,求百度網盤雲資源
《演算法心得:高效演算法的奧秘(原書第2版)》([美] Henry S. Warren, Jr.)電子書網盤下載免費在線閱讀
鏈接:https://pan..com/s/1c2AAxOe1HvDXDia4RorcVg 密碼:t38w
書名:演算法心得:高效演算法的奧秘(原書第2版)
作者:[美] Henry S. Warren, Jr.
譯者:愛飛翔
豆瓣評分:8.8
出版社:機械工業出版社
出版年份:2014-3
頁數:419
內容簡介:
在本書中,作者給我們帶來了一大批極為誘人的知識,其中包括各種節省程序運行時間的技巧、演算法與竅門。學習了這些技術,程序員就可寫出優雅高效的軟體,同時還能洞悉其中原理。這些技術極為實用,而且其問題本身又非常有趣,有時甚至像猜謎解謎一般,需要奇思妙想才行。簡而言之,軟體開發者看到這些改進程序效率的妙計之後,定然大喜。
作者簡介:
【作者簡介】
Henry S. Warren, Jr.
計算機科學家,在IBM供職50餘年,經歷了IBM704時代、PowerPC時代及其後種種更迭。曾參與多個軍事指揮與控制系統工程,並且參加了由Jack Schwarz領銜的「SET語言」項目。自1973年起,Hank就職於IBM研發部,努力探索編譯器和計算機架構。當前正研究一種旨在每秒執行百億億次運算的超級計算機。Hank擁有紐約大學柯朗數學科學研究所計算機科學博士學位。
【譯者簡介】
愛飛翔
資深軟體開發工程師,擅長Web開發、移動開發和游戲開發,有10餘年開發經驗,曾主導和參與了多個手機游戲和手機軟體項目的開發,經驗十分豐富。他是手機軟體開發引擎AgileMobileEngine的創始人兼項目經理,同時也是CatEngine手機游戲開發引擎的聯合創始人兼代碼維護員。他對極限編程、設計模式、重構、測試驅動開發、敏捷軟體開發等也有較深入的研究,目前負責敏捷移動開發網(http://www.agilemobidev.com/)的運營。業余愛好文學和歷史,有一定的文學造詣。翻譯並出版了多本計算機著作。
⑼ 《挑戰程序設計競賽2演算法和數據結構》pdf下載在線閱讀全文,求百度網盤雲資源
《挑戰程序設計競賽2 演算法和數據結構》([日]渡部有隆)電子書網盤下載免費在線閱讀
鏈接: https://pan..com/s/1B5oEwukMNtPgrWcmM05upQ
書名:挑戰程序設計競賽2 演算法和數據結構
作者:[日]渡部有隆
譯者:支鵬浩
豆瓣評分:8.3
出版社:人民郵電出版社
出版年份:2016-9-1
頁數:404
內容簡介:
本書分為准備篇、基礎篇和應用篇三大部分,藉助在線評測系統Aizu Online Judge以及大量例題,詳細講解了演算法與復雜度、初等和高等排序、搜索、遞歸和分治法、動態規劃法、二叉搜索樹、堆、圖、計算幾何學、數論等與程序設計競賽相關的演算法和數據結構,既可以作為挑戰程序設計競賽的參考書,也可以用來引導初學者系統學習演算法和數據結構的基礎知識。本書適合所有程序設計人員、程序設計競賽愛好者以及高校計算機專業師生閱讀。
作者簡介:
渡部有隆(作者)
出生於1979年,計算機理工學博士。會津大學計算機理工學部信息系統學部門副教授。專業領域為可視化編程語言。AIZU ONLINE JUDGE開發者。
Ozy(審校)
本名岡田佑一,出生於日本大阪的短碼高手。他花費相當長的時間提升短碼編程技術,進而將其發展成一種技能,曾獲得程序設計大賽的冠軍。他開辦過程序設計方面的培訓班,目前致力於數學教育和程序設計師的培養工作。曾著有《短碼之美:變成達人的心得技法》(人民郵電出版社)。
秋葉拓哉(審校)
2011年考入東京大學研究生院。以iwi的昵稱活躍在程序設計競賽中。TopCoder評級好成績為世界第四(2013年)。《挑戰程序設計競賽(第2版)》(人民郵電出版社)作者之一。
⑽ 《編程之法面試和演算法心得gitbook》pdf下載在線閱讀全文,求百度網盤雲資源
《編程之法面試和演算法心得gitbook》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/16awQV8D5SLoWTkg66Cv2ZA