机器学习 使用三分法找最优解参数

先说一下,这个算法其实就是一个简单的贪心和三分的实现
其用于计算的模型是类似于
在这里插入图片描述
这样的模型,但是这里不同的是,针对于机器学习中的特定性,我们需要的一般是极大值,在这里只有最小值,但是其实是一样的。
今天的是两个变量的更新,下一次更新多个变量。

python实现

# -*- coding: utf-8 -*-
"""
Created on Mon Sep  9 18:44:30 2019

@author: C-82
"""
'''
首先是三维空间内的曲线,想象是一个凸上去的形状
'''
'''
func函数是计算正确率的函数
也就是你要进行调参的机器学习模型
这个需要你自己进行实现
'''
def func(x,y):
    return 
'''
下面是四个常量
分别对应了两个参数的上下界
'''
XL = 0
XR = 10000
YL = 0
YR = 10000
'''
x,y
用于保存最终的计算结果,也就是模型的参数,默认初始值是(0,0)
'''
def optimize(x = XL,y = YL):
    '''
    最终的正确率
    初始化为0
    '''
    ans = 0
    '''
    开始进行两个变量的三分交叉计算
    '''
    while True:
        '''
        定x对y进行三分
        '''
        l = XL
        r = XR
        while r - l > 0.0000001:
            lmid = l + (r - l) / 3
            rmid = l + (r - l) / 3 * 2
            if(func(x,lmid) < func(x,rmid)):
                l = lmid
            else:
                r = rmid
        y = r
        '''
        定y对x进行三分
        '''
        l = YL
        r = YR
        while r - l > 0.0000001:
            lmid = l + (r - l) / 3
            rmid = l + (r - l) / 3 * 2
            if func(lmid,y) < func(rmid,y):
                l = lmid
            else:
                r = rmid
        x = r
        '''
        算法结束的条件
        '''
        if abs(ans - func(x,y)) < 0.0000001:
            break
        ans = max(ans,func(x,y))
        '''
        ret保存返回结果
        '''
        ret = {}
        ret['x'] = x
        ret['y'] = y
        ret['correctnessRate'] = ans
        return ret

举个例子:拟合计算z = 4 - x * x - y * y的极值点

def func(x,y):
    return 4 - x * x - y * y
'''
下面是四个常量
分别对应了两个参数的上下界
'''
XL = -10000
XR = 10000
YL = -10000
YR = 10000
'''
x,y
用于保存最终的计算结果,也就是模型的参数,默认初始值是(0,0)
'''
def optimize(x = XL,y = YL):
    '''
    最终的正确率
    初始化为0
    '''
    ans = 0
    '''
    开始进行两个变量的三分交叉计算
    '''
    while True:
        '''
        定x对y进行三分
        '''
        l = XL
        r = XR
        while r - l > 0.0000001:
            lmid = l + (r - l) / 3
            rmid = l + (r - l) / 3 * 2
            if(func(x,lmid) < func(x,rmid)):
                l = lmid
            else:
                r = rmid
        y = r
        '''
        定y对x进行三分
        '''
        l = YL
        r = YR
        while r - l > 0.0000001:
            lmid = l + (r - l) / 3
            rmid = l + (r - l) / 3 * 2
            if func(lmid,y) < func(rmid,y):
                l = lmid
            else:
                r = rmid
        x = r
        '''
        算法结束的条件
        '''
        if abs(ans - func(x,y)) < 0.0000001:
            break
        ans = max(ans,func(x,y))
        '''
        ret保存返回结果
        '''
        ret = {}
        ret['x'] = x
        ret['y'] = y
        ret['correctnessRate'] = ans
        return ret

print(optimize(10,10))

运行结果:
{‘x’: 3.752887422336493e-08, ‘y’: -3.857856258637885e-08, ‘correctnessRate’: 3.9999999999999973}
欢迎关注公众号BBIT
让我们共同学习共同进步!

在这里插入图片描述

你可能感兴趣的:(机器学习 使用三分法找最优解参数)