基本演算法庫
首先遺傳演算法是一種優化演算法,通過模擬基因的優勝劣汰,進行計算(具體的演算法思路什麼的就不贅述了)。大致過程分為初始化編碼、個體評價、選擇,交叉,變異。
以目標式子 y = 10 * sin(5x) + 7 * cos(4x)為例,計算其最大值
首先是初始化,包括具體要計算的式子、種群數量、染色體長度、交配概率、變異概率等。並且要對基因序列進行初始化
[python]view plain
pop_size=500#種群數量
max_value=10#基因中允許出現的最大值
chrom_length=10#染色體長度
pc=0.6#交配概率
pm=0.01#變異概率
results=[[]]#存儲每一代的最優解,N個二元組
fit_value=[]#個體適應度
fit_mean=[]#平均適應度
pop=geneEncoding(pop_size,chrom_length)
defgeneEncoding(pop_size,chrom_length):
pop=[[]]
foriinrange(pop_size):
temp=[]
forjinrange(chrom_length):
temp.append(random.randint(0,1))
pop.append(temp)
returnpop[1:]
#0.0coding:utf-80.0
#解碼並計算值
importmath
defdecodechrom(pop,chrom_length):
temp=[]
foriinrange(len(pop)):
t=0
forjinrange(chrom_length):
t+=pop[i][j]*(math.pow(2,j))
temp.append(t)
returntemp
defcalobjValue(pop,chrom_length,max_value):
temp1=[]
obj_value=[]
temp1=decodechrom(pop,chrom_length)
foriinrange(len(temp1)):
x=temp1[i]*max_value/(math.pow(2,chrom_length)-1)
obj_value.append(10*math.sin(5*x)+7*math.cos(4*x))
returnobj_value
#0.0coding:utf-80.0
#淘汰(去除負值)
defcalfitValue(obj_value):
fit_value=[]
c_min=0
foriinrange(len(obj_value)):
if(obj_value[i]+c_min>0):
temp=c_min+obj_value[i]
else:
temp=0.0
fit_value.append(temp)
returnfit_value
#0.0coding:utf-80.0
#選擇
importrandom
defsum(fit_value):
total=0
foriinrange(len(fit_value)):
total+=fit_value[i]
returntotal
defcumsum(fit_value):
foriinrange(len(fit_value)-2,-1,-1):
t=0
j=0
while(j<=i):
t+=fit_value[j]
j+=1
fit_value[i]=t
fit_value[len(fit_value)-1]=1
defselection(pop,fit_value):
newfit_value=[]
#適應度總和
total_fit=sum(fit_value)
foriinrange(len(fit_value)):
newfit_value.append(fit_value[i]/total_fit)
#計算累計概率
cumsum(newfit_value)
ms=[]
pop_len=len(pop)
foriinrange(pop_len):
ms.append(random.random())
ms.sort()
fitin=0
newin=0
newpop=pop
#轉輪盤選擇法
whilenewin<pop_len:
if(ms[newin]<newfit_value[fitin]):
newpop[newin]=pop[fitin]
newin=newin+1
else:
fitin=fitin+1
pop=newpop
- 以上代碼主要進行了3個操作,首先是計算個體適應度總和,然後在計算各自的累積適應度。這兩步都好理解,主要是第三步,轉輪盤選擇法。這一步首先是生成基因總數個0-1的小數,然後分別和各個基因的累積個體適應度進行比較。如果累積個體適應度大於隨機數則進行保留,否則就淘汰。這一塊的核心思想在於:一個基因的個體適應度越高,他所佔據的累計適應度空隙就越大,也就是說他越容易被保留下來。
#0.0coding:utf-80.0
#交配
importrandom
defcrossover(pop,pc):
pop_len=len(pop)
foriinrange(pop_len-1):
if(random.random()<pc):
cpoint=random.randint(0,len(pop[0]))
temp1=[]
temp2=[]
temp1.extend(pop[i][0:cpoint])
temp1.extend(pop[i+1][cpoint:len(pop[i])])
temp2.extend(pop[i+1][0:cpoint])
temp2.extend(pop[i][cpoint:len(pop[i])])
pop[i]=temp1
pop[i+1]=temp2
- 變異:
#0.0coding:utf-80.0
#基因突變
importrandom
defmutation(pop,pm):
px=len(pop)
py=len(pop[0])
foriinrange(px):
if(random.random()<pm):
mpoint=random.randint(0,py-1)
if(pop[i][mpoint]==1):
pop[i][mpoint]=0
else:
pop[i][mpoint]=1
- 整個遺傳演算法的實現完成了,總的調用入口代碼如下
#0.0coding:utf-80.0
importmatplotlib.pyplotasplt
importmath
fromselectionimportselection
fromcrossoverimportcrossover
frommutationimportmutation
frombestimportbest
print'y=10*math.sin(5*x)+7*math.cos(4*x)'
#計算2進制序列代表的數值
defb2d(b,max_value,chrom_length):
t=0
forjinrange(len(b)):
t+=b[j]*(math.pow(2,j))
t=t*max_value/(math.pow(2,chrom_length)-1)
returnt
pop_size=500#種群數量
max_value=10#基因中允許出現的最大值
chrom_length=10#染色體長度
pc=0.6#交配概率
pm=0.01#變異概率
results=[[]]#存儲每一代的最優解,N個二元組
fit_value=[]#個體適應度
fit_mean=[]#平均適應度
#pop=[[0,1,0,1,0,1,0,1,0,1]foriinrange(pop_size)]
pop=geneEncoding(pop_size,chrom_length)
foriinrange(pop_size):
obj_value=calobjValue(pop,chrom_length,max_value)#個體評價
fit_value=calfitValue(obj_value)#淘汰
best_indivial,best_fit=best(pop,fit_value)#第一個存儲最優的解,第二個存儲最優基因
results.append([best_fit,b2d(best_indivial,max_value,chrom_length)])
selection(pop,fit_value)#新種群復制
crossover(pop,pc)#交配
mutation(pop,pm)#變異
results=results[1:]
results.sort()
X=[]
Y=[]
foriinrange(500):
X.append(i)
t=results[i][0]
Y.append(t)
plt.plot(X,Y)
plt.show()
- 最後調用了一下matplotlib包,把500代最優解的變化趨勢表現出來。
其中genEncodeing是自定義的一個簡單隨機生成序列的函數,具體實現如下
[python]view plain
編碼完成之後就是要進行個體評價,個體評價主要是計算各個編碼出來的list的值以及對應帶入目標式子的值。其實編碼出來的就是一堆2進制list。這些2進制list每個都代表了一個數。其值的計算方式為轉換為10進制,然後除以2的序列長度次方減一,也就是全一list的十進制減一。根據這個規則就能計算出所有list的值和帶入要計算式子中的值,代碼如下
[python]view plain
有了具體的值和對應的基因序列,然後進行一次淘汰,目的是淘汰掉一些不可能的壞值。這里由於是計算最大值,於是就淘汰負值就好了
[python]view plain
然後就是進行選擇,這是整個遺傳演算法最核心的部分。選擇實際上模擬生物遺傳進化的優勝劣汰,讓優秀的個體盡可能存活,讓差的個體盡可能的淘汰。個體的好壞是取決於個體適應度。個體適應度越高,越容易被留下,個體適應度越低越容易被淘汰。具體的代碼如下
[python]view plain
選擇完後就是進行交配和變異,這個兩個步驟很好理解。就是對基因序列進行改變,只不過改變的方式不一樣
交配:
[python]view plain
[python]view plain
[python]view plain
完整代碼可以在github查看
歡迎訪問我的個人博客
閱讀全文
❷ 淺談單反/手機相機結構、攝影以及效果基本概念和原理(二)
本部分內容主要解釋如下幾個問題:1,camera結構是怎麼樣的?各部分有何作用?2,如何實現對焦?3,DSP/ISP結構和作用?
單反主要包括機身和鏡頭,手機camera也主要包括sensor,鏡頭和馬達等三部分,其基本組件相同,都是由鏡頭完成視角和光線的聚集,對焦馬達系統完成准確的對焦,sensor等完成可見光的感應,然後通過自己集成的DSP完成數字圖像處理。其中,以佳能相機的工作原理為例,可以參看其官網數碼單反相機攻略關於基本概念的解釋,下文主要介紹手機camera結構和工作原理。
手機camera基本的物理組件就是模組,如下圖所示,主要組件之一鏡頭,由多個鏡片組組成,包括塑料片以及玻璃片,樹脂鏡片比較貴,很少用。例如,大家常說的5P1G鏡頭組就是指該鏡頭由5片塑料片,1片玻璃片組成。一般長焦距的需要更多的鏡片組,所以看到長焦的鏡頭會相對更長點,當然還有潛望式的設計方法。另外,玻璃材料的色散等控制明顯優於塑料,但價格稍貴。
另外一個重要部件就是感光區,主要指CCD或者CMOS感測器。CCD(Charge-coupled Device)是電感耦合元件,CMOS(Compementary Metal Oxide Semiconctor)是互補性金屬氧化物半導體,CCD工藝技術發展的比較早,技術成熟,成像效果好,目前高端單反主流還是CCD,但CMOS發展勢頭迅猛,集成度高,成本低,工藝技術正在不斷突破,值得一提的是手機上雖然普遍採用低成本的CMOS工藝,但未來一定會尋求更好的技術進步。如下圖所示,CCD每個像素電荷信號是逐行讀出,然後再放大,且ADC和信號放大器共需要3-4組電源,功耗高;而CMOS可以做到逐個讀出,並且輸出信號之前就可以單獨放大,且需要一組電源就可以完成,但是信噪比稍低。
CCD/CMOS圖像感測器最基本結構是像素,如下圖所示,從上到下包括微透鏡,CFA(主流是拜爾陣列),金屬布線,光電二極體以及其他晶體管。當然,結構上還有很多不同類型,比如說BIS和FIS等等,光電二極體是主要感光的元件,然後通過其他晶體管進行選通、跟隨、開關控制等等;還有一些金屬布線,二氧化硅阻擋層等等,這些部分在實際製作過程中需要盡可能地少。另外,像素一方面可以用來感光,同時,有一部分像素用來相位對焦(PDAF)。這些PD點通光量只有正常像素亮度的一半,圖像上會顯示出黑點/壞點,後期需要在ISP中進行校準。
camera工作流程大致如下圖所示:
對焦是實現清晰物像的重要一步,首先我是認識一下什麼是清楚的物像。主要涉及兩個概念,景深和彌散斑。如下圖所示,對上焦的物像在底片上成像的點是個圓形斑,且斑點很小,可以簡單的理解這就是一個彌散斑,像面上的彌散斑直徑越小,成像越清晰,且在一定范圍內,人眼都是看得清楚的,對應的物像距離就稱之為景深。景深范圍內,一般都稱之為清晰的像,沒對上焦的物體在底片上形成的彌散斑過大,導致無法分辨。
那在實際攝像過程中是如何首先對焦的呢?這個時候是需要輔助對焦系統,基本原理是通過激光、多次拍照等提出相位或者對比度等信息,通過演算法識別對焦情況計算測距,然後再藉助馬達等工具,將鏡頭推到合適的距離完成清晰成像。目前主要由兩種對焦方式,PDAF(相位對焦)和CDAF(對比度對焦),目前PDAF被廣泛應用於單反相機,但在手機上精度能力還有一定缺陷,往往還需要CDAF輔助對焦。
相位對焦,它的原理是在CCD或者CMOS上專門做一些PD的像素點,並且成對出現,分別左、右遮擋一半的通光量,專門用來進行相位檢測,通過像素之間的距離及其變化等來決定對焦的偏移值從而實現准確對焦,並且計算一次即可實現對焦。而CDAF主要是拍攝不同焦距下的照片,計算圖片的對比度,確定最合適的對比度,計算出該點對應的對焦距離,然後將距離信息指令發布給音圈馬達,將鏡片推到指定位置完成自動對焦。
DSP(digital signal processing)主要功能是進行數字信號處理,光信號經過sensor感光,AD轉換器之後就成為了數字信號,流程可以參考上文所述的camera工作流程圖。常見的白平衡校準,伽馬校準,色彩校準,壞點檢測等等,其中還包括去噪,圖像復原,增強,壓縮以及色彩空間轉換等等,都在這一塊進行的,跟ISP(Image Signal Processor圖像信號處理)相似,ISP類似與DSP中的一部分,主要都是數學模型,演算法原理相關的處理,但這一部分對最終的圖像質量有著非常大的影響。
ISP的主要包括三部分,第一部分是ISP控制單元和基本演算法庫,是總的控制中樞和演算法庫中心;第二部分是3A信息演算法庫,3A即AE(自動曝光),AF(自動對焦)和AWB(自動白平衡),這是三個最基本也是最重要的拍照參數;第三個是sensor庫,這一塊和sensor相關聯,它們為基本演算法庫注冊函數回調,以適配sensor的差異化,得到最終的初始化參數,包括基本的曝光時間,增益以及焦馬達的步長等等。ISP中涉及了非常多的基礎圖像處理演算法,此處暫不做延伸,另外,在軟體端也有一些圖像處理的相關演算法,包括現在非常火的深度學習,高動態處理等等,以減輕CPU 的內存。
後續待更新
註:圖片均來源與網路!如有涉及版權問題聯系刪除!
主要參考資料:
1, https://jiahao..com/s?id=1605957088336008360&wfr=spider&for=pc
2, https://wenku..com/view/.html?from=search
3, https://blog.csdn.net/zero_zeo/article/details/79448009
4, http://www.canon.com.cn/special/ds_abcbook/approach.html
5, https://www.cnblogs.com/lifan3a/articles/5006760.html
6, https://blog.csdn.net/l18318931829/article/details/78274790
❸ 常用的數據挖掘演算法有哪幾類
常用的數據挖掘演算法分為以下幾類:神經網路,遺傳演算法,回歸演算法,聚類分析演算法,貝耶斯演算法。
目前已經進入大數據的時代,所以數據挖掘和大數據分析的就業前景非常好,學好大數據分析和數據挖掘可以在各個領域中發揮自己的價值;同時,大數據分析並不是一蹴而就的事情,而是需要你日積月累的數據處理經驗,不是會被輕易替代的。一家公司的各項工作,基本上都都用數據體現出來,一位高級的數據分析師職位通常是數據職能架構中領航者,擁有較高的分析和思辨能力,對於業務的理解到位,並且深度知曉公司的管理和商業行為,他可以負責一個子產品或模塊級別的項目,帶領團隊來全面解決問題,把控手下數據分析師的工作質量。
想要了解更多有關數據挖掘演算法的信息,可以了解一下CDA數據分析師的課程。課程教你學企業需要的敏捷演算法建模能力,可以學到前沿且實用的技術,挖掘數據的魅力;教你用可落地、易操作的數據科學思維和技術模板構建出優秀模型,只教實用干貨,以專精技術能力提升業務效果與效率。點擊預約免費試聽課。
❹ Python科學計算常用的工具包有哪些
1、 NumPy
NumPy幾乎是一個無法迴避的科學計算工具包,最常用的也許是它的N維數組對象,其他還包括一些成熟的函數庫,用於整合C/C++和Fortran代碼的工具包,線性代數、傅里葉變換和隨機數生成函數等。NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray是存儲單一數據類型的多維數組,而ufunc則是能夠對數組進行處理的函數。
2、SciPy:Scientific Computing Tools for Python
“SciPy是一個開源的Python演算法庫和數學工具包,SciPy包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。其功能與軟體MATLAB、Scilab和GNU Octave類似。 Numpy和Scipy常常結合著使用,Python大多數機器學習庫都依賴於這兩個模塊。”—-引用自“Python機器學習庫”
3、 Matplotlib
matplotlib 是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地進行制圖。而且也可以方便地將它作為繪圖控制項,嵌入GUI應用程序中。Matplotlib可以配合ipython shell使用,提供不亞於Matlab的繪圖體驗,總之用過了都說好。
關於Python科學計算常用的工具包有哪些,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。
❺ 程序員必須掌握哪些演算法
一.基本演算法:
枚舉. (poj1753,poj2965)
貪心(poj1328,poj2109,poj2586)
遞歸和分治法.
遞推.
構造法.(poj3295)
模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
圖的深度優先遍歷和廣度優先遍歷.
最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓撲排序 (poj1094)
二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.數據結構.
串 (poj1035,poj3080,poj1936)
排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)
簡單並查集的應用.
哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼樹(poj3253)
堆
trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
背包問題. (poj1837,poj1276)
型如下表的簡單DP(可參考lrj的書 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
幾何公式.
叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)
中級(校賽壓軸及省賽中等難度):
一.基本演算法:
C++的標准模版庫的應用. (poj3096,poj3007)
較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
差分約束系統的建立和求解. (poj1201,poj2983)
最小費用最大流(poj2516,poj2516,poj2195)
雙連通分量(poj2942)
強連通分支及其縮點.(poj2186)
圖的割邊和割點(poj3352)
最小割模型、網路流規約(poj3308)
三.數據結構.
線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
靜態二叉檢索樹. (poj2482,poj2352)
樹狀樹組(poj1195,poj3321)
RMQ. (poj3264,poj3368)
並查集的高級應用. (poj1703,2492)
KMP演算法. (poj1961,poj2406)
四.搜索
最優化剪枝和可行性剪枝
搜索的技巧和優化 (poj3411,poj1724)
記憶化搜索(poj3373,poj1691)
五.動態規劃
較為復雜的動態規劃(如動態規劃解特別的旅行商TSP問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.
數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
隨機化演算法(poj3318,poj2454)
雜題(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
坐標離散化.
掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多邊形的內核(半平面交)(poj3130,poj3335)
幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高級(regional中等難度):
一.基本演算法要求:
代碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
保證正確性和高效性. poj3434
二.圖演算法:
度限制最小生成樹和第K最短路. (poj1639)
最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最優比率生成樹. (poj2728)
最小樹形圖(poj3164)
次小生成樹.
無向圖、有向圖的最小環
三.數據結構.
trie圖的建立和應用. (poj2778)
LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法(RMQ+dfs)).(poj1330)
雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移的目的). (poj2823)
左偏樹(可合並堆).
後綴樹(非常有用的數據結構,也是賽區考題的熱點).(poj3415,poj3294)
四.搜索
較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
需要用數據結構優化的動態規劃.(poj2754,poj3378,poj3017)
四邊形不等式理論.
較難的狀態DP(poj3133)
六.數學
組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
半平面求交(poj3384,poj2540)
可視圖的建立(poj2966)
點集最小圓覆蓋.
對踵點(poj2079)
❻ 通用演算法庫 <algorithm>
去看c++ STL入門導引
或者看:c++ STL中文版
前者新書,後者老書,但是可以在網上下載。