#Python干货#python实现——最优化算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#Python干货#python实现——最优化算法相关的知识,希望对你有一定的参考价值。

参考技术A 函数详见rres,此代码使该算法运行了两次

收获:
这是我第一个实现的代码。学习完该算法以后,逻辑框架基本上就有了,剩下需要明确的就是对应的python的语言。于是我就开始了查找“如何定义函数”(详见mofan的优酷),“循环体”和“if条件语句”的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)“数学符号”(详见mofan的优酷),以及print的使用

1.def是python中指定义,一般用来定义函数,如果需要深度学习搭建网络可用来定义网络。值得注意的一点是

我不清楚为什么,但是如果没有加的话,那个函数公式就是一个花瓶,就像一个结果输不出去。

2.最坑的就是逻辑。一开始逻辑没理清楚,或者说在代码上有疏漏,导致我将left和right放在了循环体里,结果可想而知。不过也是因为这个错误,我知道pycharm中的debug怎么用,挺简单的,百度一下就出来了。

3.不知道什么原因,看的莫烦视频中的print多个变量一起输出是没有办法在我的pycharm中使用的,出来的结果很奇怪。可能是因为我是win10不是ios吧。print如果多个变量一起输出必须是print("名字:%s,名字2:%s"%(a,b))结果输出就是名字:a ,名字2:b

关于python中数据变量。第一遍运行结果出现很明显不对,于是我采用了debug。结果发现,mid1处一直为1而不是1.5,于是就开始了解数据变量。起初我猜测python默认所有变量为整型,但是根据二分法的结果我意识到此猜测不对,所以要改整个file的变量格式没有必要。所以我就在mid1式子前面加了一个float,结果就显示为1.5了。但是如果我将整个式子用()括起来,前面加float,结果还是1。我不太理解为什么。不过我知道了python的数据格式是根据输入量决定的,也就是说你的输入量如果是整型,那么与其直接相关的计算输出结果一定是整型,而且还是不采用进位的整型。在我没有采用+float/+.0这两种方法之前,mid1~3全部是整型。

或者不再mid1前面加float,直接将输入量后面点个点就行
真的很想吐槽一下print,好麻烦啊啊啊啊每次都得弄个%s,而且有时候还不能放一起!!!!

不要问我掌握了什么,要问我现在写完这个代码后有多么的爱python的精度表示 :-)我决定以后只要再编写数学公式的代码都将输入量的小数学点后面补很多0
fibonacci函数定义,每次debug后我的手都是抖的O( _ )O~

不知道自己什么时候有的强迫症,只要是代码下面有“~”我就必须要消掉。笑哭。这个很简单,前四个除了费波纳茨,都很简单。

这个公式看起来很麻烦,便写的时候更要谨慎。我上回把那个2搁在了分号下面,结果很大,所以还是换算成0.5更好(PS:勿忘那长河般的0)。
虽然代码很长,但是主要是因为print太多。本打算在开头print,最后结果会漏掉最后一部分。懒得想其他办法了,直接就这样吧

一开始while里面写成了>,导致run不出来。继而,debug也没法用。在网上一查才知道 “没联网”+“没选断点”。最后想尝试将else里面的内容输出来,结果发现run以后被刷屏了。于是改成i<7以后还是不行,于是想着加一个break跳出循环,结果成效了。
然后刚刚由debug了一下,才知道原来是i+1在if里面,因为没有办法+1,所以i=6一直存在,就不断循环。因为加break也好,i+1也好,都可以。

这是我第一组自己实现的python代码,就是数学公式用python语言组装起来。刚开始的时候知道大概需要在语言中体现什么,但不太清楚。于是我就在网上找了几个二分法的,他们都各有不同,但框架都差不多,不过如果要用到我们的那个公式里还需要改变很多。然后我就开始分析我们的题,我发现大体需要两部分,一部分函数定义,一部分循环体。但我不知道如何定义函数,如何写数学公式,如何弄变量,也就是说一些小点不太会,所以我选择直接百度。因为我知道自己阅读的能力不错,相比于从视频中提取要素,我更擅长通过阅读获得要点。有目的性地找知识点,掌握地更牢固。
于是我就开始了第一个——二分法的编写。我发现,自己出现了很多错误而且有很多地方都很基础。但我依然没选择视频,而是将这些问题直接在百度上找,因为视频讲完或许你也没找到点。当然,这是一步一步走的,不是直接就将程序摆上去,一点一点改。
随着前两个的成功,我发现自己对于这些代码有了自信,似乎看透了他们的伪装,抓住了本质。除此之外,我还意识到自己自从8月份以后,学习能力似乎提高了不少,而且有了更为有效的学习方法。各方面都有了一定的觉醒。除了第一个找了几个牛头不对马嘴的代码,其他都是根据自己的逻辑写,逻辑通下来以后,对应语言中某一部分不知道如何翻译就去百度,其实这几个套路都一样或者说数学公式转化的套路都一样。
我还意识到,汇编其实是最难的语言,目前为止所学到的,因为很多都需要自己去定义,去死抠,需要记住大量的指令且不能灵活变通。但是其他的却只需要将一些对应的记下来就好。python真的挺简单的。而且,我发现自己今天似乎打开了新世界的大门,我爱上了这种充满了灵性的东西,充满了严谨的美丽,还有那未知的变化,我发现我似乎爱上了代码。可能不仅仅局限于python,这些语言都充满了挑战性。我觉得当你疑惑的时候,就需要相信直觉,至少我发现它很准

果蝇优化算法:优化ZScore模型 python实现

果蝇优化算法:优化ZScore模型 python实现

数据集:

0.016 0.177 0.4208 1.038 0.022 0
1.0957 0.19 0.2224 0.816 0.933 1
0.2543 0.206 0.5264 0.4 0.015 1
1.2257 0.224 0.3272 1.05 1.049 1
0.3872 0.228 0.2256 0.98 0.998 1
1.6066 0.231 0.2832 1.054 1.009 1
1.1594 0.252 0.3344 0.946 0.987 0
0.3424 0.26 0.3408 0.196 0.126 1
0.8604 0.261 0.2616 0.994 0.996 0
0.5107 0.264 0.2352 0.888 0.004 1
0.8981 0.271 0.1536 0.688 0.857 1
0.0878 0.275 0.2072 0.732 0.908 1
0.2384 0.297 0.2336 0.036 0.099 0
0.8591 0.308 0.4208 0.132 1.031 1
0.5861 0.309 0.1656 0.836 0.896 1
0.6329 0.311 -0.24 -0.134 0.611 0
0.6173 0.311 0.1256 0.714 0.848 0
0.7811 0.326 0.2896 0.834 0.909 1
0.3937 0.329 0.2552 0.024 0.493 0
0.1211 0.055 0.3744 1.142 1.077 1

代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties


#######果蝇算法######
##初始化果蝇参数
popsize = 20        #果蝇种群规模
maxgen = 100        #果蝇最大迭代次数
R = 1               #果蝇飞行半径
D = 5              #优化变量个数

# 读取数据的函数
TXY = np.loadtxt('e:\\\\TXY.txt')
# 计算这个TXY举证的行数还有列数
row= np.shape(TXY)[0]            
col=np.shape(TXY)[1]

# 将函数来进行分块,然后来进行之后的操作
set = row/5
row1 = row - set

# tr和t1来得到最优z-score系数
tr = TXY[0:row,:col-1]
t1 = TXY[0:row,col-1]

t_value = TXY[:,col-1]

# te和t2来检查优化效果
te = TXY[int(row1):,:col-1]
t2 = TXY[0:int(row1),col-1]

# 计算这个距离的容量
Dist = np.zeros([popsize,D])
# 味道浓度判定值
S = np.zeros([popsize,D])
# 优化参数的结果存放值
bestS = np.zeros([1,D])
# 味道气味值
Smell = np.zeros([popsize,1])

#果蝇种群里面的每一个果蝇需要存放的一个坐标位置,有五个种群,进行5个参数来进行优化参数的作用
X = np.zeros([popsize,D])
Y = np.zeros([popsize,D])

# 每次迭代之后,保存的结果
fitness = np.zeros([maxgen,1])

# 需要计算的保存的最有果蝇的位置
XBest = np.zeros([maxgen,D])
YBest = np.zeros([maxgen,D])

#赋予果蝇群体初始位置,五个种群的位置
num=0
for i in range(row):
    res = TXY[i,0]*1.2+1.4*TXY[i,1]+3.3*TXY[i,2]+0.6*TXY[i,3]+1.0*TXY[i,4]
    if res>2.675:
        if int(t_value[i])==1:
            num+=1
    else:
        if int(t_value[i])==0:
            num+=1
pre = num/row
now=0

# 由于随机化的原因,收敛不到这个寻优的效果,然后现在是直接找到超过的,那么代表这个可以了
while True:
    #初始化种群的位置
    X_axis = np.random.rand(1,D)
    Y_axis = np.random.rand(1,D)
    #果蝇寻优开始,利用嗅觉寻找食物
    for i in range(popsize):
        X[i,:] = X_axis + R*(2*np.random.rand(1,D)-1)
        Y[i,:] = Y_axis + R*(2*np.random.rand(1,D)-1)
        #计算距离Dist
        Dist[i,:] = np.sqrt(X[i,:]**2+Y[i,:]**2)
        #计算味道浓度的倒数作为味道浓度判定值
        S[i,:] = 1/Dist[i,:]
        #带入味道浓度函数中求出味道浓度值
        yc = S[i,0] * tr[:,0] + S[i,1] * tr[:,1] + S[i,2]* tr[:,2] + S[i,3] * tr[:,3] +  S[i,4] * tr[:,4];
        yy = yc - t1;
        # 每5个果蝇飞行一次计算一次均方根误差
        g = 0
        for j in range(row):
            g = g + yy[j]**2;
        Smell[i] = (g/row)**0.5; #将每次的和原来数据的均方根误差,当作气味值
    #找出味道值最小的,即最接近预测结果的气味值,及其下标
    Smellbest,index = np.min(Smell),np.argmin(Smell)
    bestSmell = Smellbest
    #保留最佳味道浓度处的果蝇
    X_axis = X[int(index),:]
    Y_axis = Y[int(index),:]
    #果蝇种群进入迭代寻优
    for j in range(maxgen):
        for i in range(popsize):
            X[i,:] = X_axis + R*(2*np.random.rand(1,D)-1)
            Y[i,:] = Y_axis + R*(2*np.random.rand(1,D)-1)
            #计算距离Dist
            Dist[i,:] = np.sqrt(X[i,:]**2+Y[i,:]**2)
            #计算味道浓度的倒数作为味道浓度判定值
            S[i,:] = 1/Dist[i,:]
            #带入味道浓度函数中求出味道浓度值
            yc = S[i,0] * tr[:,0] + S[i,1] * tr[:,1] + S[i,2]* tr[:,2] + S[i,3] * tr[:,3] +  S[i,4] * tr[:,4];
            yy = yc - t1;
            g = 0
            for k in range(row):
                g = g + yy[k]**2;
            Smell[i] = (g/row)**0.5; 

        Smellbest,index = np.min(Smell),np.argmin(Smell)
        if Smellbest < bestSmell:
            bestSmell = Smellbest
            bestS = S[index]
            X_axis = X[int(index),:]
            Y_axis = Y[int(index),:]
        fitness[j] = bestSmell
        XBest[j] = X_axis
        YBest[j] = Y_axis
    #计算当前预测的一个过程,
    num=0
    for i in range(row):
        res = TXY[i,0]*bestS[0]+bestS[1]*TXY[i,1]+bestS[2]*TXY[i,2]+bestS[3]*TXY[i,3]+bestS[4]*TXY[i,4]
        if res>0.5:
            if int(t_value[i])==1:
                num+=1
        else:
            if int(t_value[i])==0:
                num+=1 
    now = num/row
    if now>pre:
        break;

print("最后迭代的趋近值RMSE:")
print(bestSmell)
print("优化之后的参数:")
print(bestS)

print('之前的预测正确率:')
print(pre)
print('之后的预测正确率:')
print(now)




font_set = FontProperties(fname=r"c:\\\\windows\\\\fonts\\\\simsun.ttc", size=15)
plt.figure(1)
plt.plot(range(maxgen),fitness)
plt.xlabel('迭代次数',fontproperties=font_set)
plt.ylabel('RMSE',fontproperties=font_set)

plt.figure(2)
plt.plot(XBest,YBest,'r*')
plt.xlabel(u'X_axis',fontproperties=font_set)
plt.ylabel(u'Y_axis',fontproperties=font_set)
plt.show()

 

以上是关于#Python干货#python实现——最优化算法的主要内容,如果未能解决你的问题,请参考以下文章

干货|机器学习:Python实现聚类算法之K-Means

干货分享Python数据结构与算法设计总结篇

收藏 | 从SGD到NadaMax,十种优化算法原理及实现

收藏 | 从SGD到NadaMax,十种优化算法原理及实现

果蝇优化算法:优化ZScore模型 python实现

排序算法冒泡选择排序的Python实现及算法优化详解