基本算法库
首先遗传算法是一种优化算法,通过模拟基因的优胜劣汰,进行计算(具体的算法思路什么的就不赘述了)。大致过程分为初始化编码、个体评价、选择,交叉,变异。
以目标式子 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中文版
前者新书,后者老书,但是可以在网上下载。