>  기사  >  백엔드 개발  >  Python은 다양한 최적화 알고리즘을 구현합니다.

Python은 다양한 최적화 알고리즘을 구현합니다.

coldplay.xixi
coldplay.xixi앞으로
2020-12-02 17:03:585945검색

python 비디오 자습서 컬럼은 다양한 최적화 알고리즘과 관련하여 무료 학습 권장 사항을 소개합니다 알고리즘 두 번 실행해 보세요
def asdf(x):
    rres=8*x**3-2*x**2-7*x+3
    return rres

i=2
left=0
right=1
while i>0 :
    i = i-1
    ans = 0.1
    mid1 = (left + right + ans) / 2
    mid2 = (left + right - ans) / 2
    a=asdf(mid1)
    c=asdf(mid2)
    if a > c :
        right = mid1
    else :
        left = mid2
b=(left+right) / 2
print("左极限=%s,右极限=%s,极小值x=%s"%(left,right,b))
左极限=0.45,右极限=0.775,极小值x=0.6125

재예약:

제가 처음으로 구현한 코드입니다. 알고리즘을 학습한 후에는 기본적으로 논리적 프레임워크가 있으며, 명확하게 해야 할 유일한 것은 해당 Python 언어입니다. 그래서 "함수를 정의하는 방법"(자세한 내용은 mofan의 Youku 참조), "루프 본문" 및 "if 조건문"의 형식(https://blog.csdn.net/qq_39407518/article/details/)을 찾기 시작했습니다. 79822498) "수학적 기호"(자세한 내용은 mofan의 Youku 참조) 및 print Python은 다양한 최적화 알고리즘을 구현합니다.

1.def의 사용은 Python의 가운데 손가락 정의입니다. 일반적으로 네트워크 구축에 딥러닝이 필요한 경우 사용됩니다. 네트워크를 정의하는 데 사용할 수 있습니다. 한 가지 주목할 만한 점은

return을 함수 뒤의 새 줄에 추가해야 한다는 것입니다. 왜인지는 모르겠지만 덧셈이 없으면 함수식은 마치 꽃병처럼 출력할 수 없는 결과처럼 됩니다. 2. 가장 혼란스러운 것은 논리입니다. 처음에는 논리가 명확하지 않거나 코드에 누락이 있어서 루프 본문에 왼쪽과 오른쪽을 넣었습니다. 결과는 예측 가능합니다. 하지만 내가 pycharm에서 디버그를 사용하는 방법을 알게 된 것도 이 오류 때문이었습니다. 매우 간단했고 Baidu는 이를 즉시 생각해 냈습니다.

3. 이유는 모르겠지만 제가 본 영상에서 함께 출력된 다중 변수 print 를 제 pycharm에서 사용할 수 없고 결과가 매우 이상합니다. 아마도 iOS가 아니라 Win10을 사용하고 있기 때문일 수도 있습니다. print 여러 변수가 함께 출력되는 경우 print("이름: %s, 이름 2: %s" % (a, b))여야 합니다. 결과 출력은 name: a, Name 2: b

Question: 1입니다. . 왜 반품을 추가해야 합니까?

return은 이 def의 모든 변수 값을 결과로 출력하는 것을 의미합니다. 일반적으로 출력 함수의 관계식은 이 함수를 호출하면 변수에 해당하는 함수 값을 표시할 수 있도록 이름을 지정합니다. 그렇지 않으면 결과 없이만 실행되고 아무런 효과가 없습니다.

그리드 방식 - 3점 균등 분할 방식

import numpy as np
def qwer(x):
    third = np.exp(x) - 5*x
    return third

left = 1
right = 2
mid1 =float(left+right) / 2
mid2 = (left+mid1) / 2
mid3 = (mid1+right) /2
a = qwer(mid1)
b = qwer(mid2)
c = qwer(mid3)
i = 5
while i > 0:
    i=i-1
    if a > b:
        if c > b :
            #b
            right = mid1
            mid1 = mid2
            a=b
            mid2 = (left + mid1) / 2
            mid3 = (mid1 + right) / 2
            b = qwer(mid2)
            c = qwer(mid3)
        else:#b>c
            #c
            left = mid1
            mid1 = mid3
            a = c
            mid2 = (left + mid1) / 2
            mid3 = (mid1 + right) / 2
            b = qwer(mid2)
            c = qwer(mid3)
    else:#b>a
            if a > c:
                #C
                left = mid1
                mid1 = mid3
                a = c
                mid2 = (left + mid1) / 2
                mid3 = (mid1 + right) / 2
                b = qwer(mid2)
                c = qwer(mid3)
            else:#b>a&c>a
                # a
                left = mid2
                right = mid3
                mid2 = (left + mid1) / 2
                mid3 = (mid1 + right) / 2
                b = qwer(mid2)
                c = qwer(mid3)

print("最小值=%s"%mid1)
print("函数值=%s"%a)
最小值=1.609375
函数值=-3.047189552275773
파이썬의 데이터 변수에 대하여. 첫 번째 실행 결과가 명백히 잘못된 것 같아 디버깅을 사용했습니다. mid1은 항상 1.5가 아닌 1이라는 것이 밝혀졌으므로 데이터 변수를 이해하기 시작했습니다. 처음에는 Python의 모든 변수가 기본적으로 정수형인 줄 알았으나 이분법의 결과를 토대로 이 추측이 틀렸음을 깨달았으므로 전체 파일의 변수 형식을 변경할 필요가 없었습니다. 그래서 mid1 수식 앞에 float를 추가했더니 결과가 1.5로 표시되었습니다. 그러나 전체 수식을 ()로 묶고 앞에 float를 추가하면 결과는 여전히 1입니다. 이유를 잘 모르겠습니다. 하지만 파이썬의 데이터 형식은 입력량에 따라 결정되는 것으로 알고 있습니다. 즉, 입력량이 정수라면 그에 직접적으로 관련된 계산 출력도 정수형이어야 하고, 정수형이어야 합니다. 캐리를 사용하지 않는 것입니다. +float/+.0 두 가지 방법을 사용하기 전에는 mid1~3이 모두 정수였습니다.

left = 1.0
right = 2.0
mid1 =(left+right) / 2
아니면 mid1 앞에 float를 추가하는 대신 입력량 뒤에 점을 찍으면 됩니다
인쇄에 대해 정말 불평하고 싶은데 너무 번거로워서 매번 %s를 얻어야 하고 가끔은 안 되는 경우도 있습니다. 함께 출시됩니다! ! ! !

피보나치 방법

def fibonacci(n):
    i=0
    a = 0
    b = 1
    for i in range(n):
        i=i+1
        c = a+b
        a = b
        b = c
    return c
def bn(x):
    ert = x**2 - 6*x + 2
    return ert
z = 2
p = 0
left = 0.00000
right = 10.00000
L1 = right - left
while z < 100:
    m = fibonacci(z)
    l = L1/m
    k = 1.000/m
    if k < 0.03:
        print("n=%s,Fn=%s"%(z,m))
        L2 = l*fibonacci(z-1)
        t = left + L2
        r = right -L2
        while p < 3:
            p = p + 1
            l3 = t - r
            e= bn(t)
            o = bn(r)
            if e>o :
                right = t
                t = r
                r = left + l3
            else:#o>e
                left = r
                r = t
                t = right - l3
        break
    else:
        z = z + 1

okk=(left+right)/2
okky=bn(okk)
print(left)
print(right)
print("极小值x=",okk)
print("极小值y=",okky)
무엇을 마스터했는지 묻지 말고, 이 코드를 작성한 후 파이썬의 정밀 표현이 얼마나 마음에 드는지 물어보세요 :-) 저는 앞으로 수학 공식을 코딩할 때마다 다음을 유지하기로 결정했습니다. 입력량이 적다 수학 포인트 뒤에 0

fibonacci 함수 정의를 많이 추가하세요. 디버깅할 때마다 손이 떨리네요 O(∩_∩)O~

골든섹션
def gold(x):
    gg= x**2 - 6*x + 9
    return gg

left = 1
right = 7
ans = 0.4
a = left + 0.618 * (right - left)
b = left + 0.382*(right - left)
gga = gold(a)
ggb = gold(b)
i = 0
while i < 7:
    print("i=%s" % i)
    print("left=%s,right=%s" % (left, right))
    print("x左=%s,x右=%s" % (a, b))
    print("y左=%s,y右=%s" % (ggb, gga))
    c = right - left
    if c > 0.4:
        i = i + 1
        if gga > ggb:
            right = a
            a = b
            b = left + 0.382*(right - left)
            gga = ggb
            ggb = gold(b)
        else:#gga<ggb
            left = b
            b = a
            a = left + 0.618 * (right - left)
            ggb = gga
            gga = gold(a)
    else:
        break
언제 강박관념이 있는지 모르겠습니다. -강박장애, 코드 아래에 "~"가 있는 한, 이를 제거해야 합니다. 웃고 울다. 이것은 매우 간단합니다. 처음 4개는 피보나치를 제외하면 모두 간단합니다.

간접법 - 2차 보간법
def yy(x):
    y=x**4-4*x**3-6*x**2-16*x+4
    return y

def xing(xm1,xm2,xm3,fm1,fm2,fm3):
    yxxx=0.5000*((xm2**2-xm3**2)*fm1+(xm3**2-xm1**2)*fm2+(xm1**2-xm2**2)*fm3)/((xm2-xm3)*fm1+(xm3-xm1)*fm2+(xm1-xm2)*fm3)
    return yxxx

x1 = -1.0000
f1 = yy(x1)
x3 = 6
f3 = yy(x3)
x2 = 0.50000*(x1+x3)
f2 = yy(x2)
xp = xing(x1,x2,x3,f1,f2,f3)
fp = yy(xp)
a = abs(xp-x2)
while abs(xp-x2) > 0.05000:
    a = abs(xp - x2)
    if xp > x2:
        if fp > f2:
            x3=xp
            f3=fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")
        else:#f2>fp
            x1 = x2
            f1 = f2
            x2 = xp
            f2 = fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")
    else:#xp<x2
        if fp > f2:
            x1 = xp
            f1 = fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")
        else:
            x3 = x2
            f3 = f2
            x2 = xp
            f2 = fp
            xp = xing(x1, x2, x3, f1, f2, f3)
            fp = yy(xp)
            print("ans=%s" % a)
            print("left=%s,right=%s" % (x1, x3))
            print("x*=%s,fp*=%s" % (xp, fp))
            print("x2=%s,f2=%s" % (x2, f2))
            print("******************")

이 수식은 매우 번거로워보이므로 작성 시 더욱 주의해야 합니다. 지난번에는 세미콜론 아래에 2를 넣었는데 결과가 너무 커서 0.5로 변환하는 것이 좋습니다(PS: 0이라는 긴 강을 잊지 마세요).

코드가 많이 길긴 하지만 인쇄량이 너무 많아서 그런 것 같습니다. 처음에 인쇄하려고 했는데 마지막 부분이 놓칠 뻔했어요. 다른 방법은 생각하기 귀찮으니 이것만 하자

간접 방법 - 뉴턴의 방법

def fd(x):
    y = 4*x**3-12*x**2-12*x-16
    return y
def fdd(x):
    ys = 12*x**2-24*x-12
    return ys

i = 1
x0 = 3.00000
ans = 0.001
while i < 7:
    fd0 = fd(x0)
    fdd0 = fdd(x0)
    if abs(fd0) > ans:
        x1 = x0 - (fd0/fdd0)
        x0 = x1
        print("次数:%s,所得的值x:%s"%(i,x1))
        i = i + 1
    else:#fd0<0.001
        print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
        print("Bingo!顺利通关!祝您开学愉快!")
        print("Boss  X=%s"%x0)
        break

처음에 while에 "썼다"는 뜻은 ""을 의미하기 때문에 실행이 되지 않습니다. 그러면 디버그를 사용할 수 없습니다. 온라인으로 확인한 결과 "인터넷에 연결되지 않음" + "중단점이 선택되지 않음"이라는 것을 알게 되었습니다. 마지막으로 else에 내용을 출력해보고 싶었는데, 실행 후 화면이 새로 고쳐지는 현상을 발견했습니다. 그래서 i<7로 변경한 후에도 여전히 작동하지 않아서 루프에서 벗어나기 위해 중단을 추가하려고 생각했는데 작동했습니다. 그런 다음 방금 디버깅한 결과 i+1이 if에 있다는 것을 알았습니다. +1할 수 있는 방법이 없기 때문에 i=6은 항상 존재하고 계속 반복됩니다. break를 추가하든 i+1을 추가하든 상관이 없기 때문입니다.

한 시간 반 전에 외부 힘 없이 모두 손으로 6가지 주요 코드의 최적화를 성공적으로 마쳤습니다. Happy!

이것은 제가 직접 구현한 첫 번째 Python 코드 세트입니다. Python 언어를 사용하여 수학 공식을 조합하는 것입니다. 처음 시작했을 때 언어에 무엇을 반영해야 할지 대략적으로는 알았지만 명확하지 않았습니다. 그래서 인터넷에서 몇 가지 이분법을 발견했습니다. 그것들은 모두 다르지만 프레임워크는 비슷합니다. 그러나 우리의 공식을 사용하려면 많은 것을 바꿔야 합니다. 그런 다음 문제를 분석하기 시작했고 일반적으로 두 부분, 즉 함수 정의 부분과 루프 본문 부분이 필요하다는 것을 발견했습니다. 하지만 저는 함수를 정의하는 방법, 수학 공식을 작성하는 방법, 변수를 만드는 방법을 모릅니다. 즉, 작은 일을 하는 방법을 모른다는 뜻이므로 바로 Baidu를 선택했습니다. 왜냐하면 저는 제가 책을 잘 읽는 사람이고, 동영상에서 요점을 추출하는 것보다 독서에서 주요 요점을 얻는 데 더 능숙하기 때문입니다. 목적에 맞게 지식 포인트를 찾아 더욱 확실하게 파악하세요.
그래서 저는 첫 번째 이분법을 쓰기 시작했습니다. 나는 많은 실수를 저질렀으며 그 중 상당수는 매우 기본적인 것임을 깨달았습니다. 하지만 저는 여전히 영상을 선택하지 않았습니다. 대신에 Baidu에서 직접 이러한 질문을 찾아보았습니다. 영상을 본 후에 요점을 찾지 못했을 수도 있기 때문입니다. 물론 이것은 단지 프로그램을 제자리에 놓고 조금씩 변경하는 것이 아니라 단계별 과정입니다.
처음 두 가지의 성공으로 저는 이러한 코드에 대한 자신감을 얻었고 그들의 위장을 간파하고 본질을 파악하는 것 같았습니다. 게다가 8월부터 학습능력이 많이 좋아진 것 같고, 더 효과적인 학습 방법도 생겼다는 것도 깨달았습니다. 모든 측면에서 어느 정도 각성이 이루어졌습니다. 몇 가지 잘못된 코드를 발견한 첫 번째 코드를 제외하면 나머지는 모두 내 논리에 따라 작성된 것입니다. 논리가 명확해진 후 언어의 특정 부분을 번역하는 방법을 모른다면 그냥 가겠습니다. 실제로 이러한 루틴은 모두 동일하거나 수학 공식을 변환하는 루틴이 동일합니다.
어셈블리가 사실 가장 어려운 언어라는 것도 깨달았습니다. 지금까지 배운 것 중 상당수는 혼자서 정의하고 조작해야 하는 언어가 많기 때문입니다. 하지만 다른 경우에는 해당 항목을 적어두면 됩니다. 파이썬은 정말 간단해요. 게다가 오늘은 새로운 세계의 문을 연 것 같았다. 영성이 넘치고, 엄밀한 아름다움이 가득한, 알 수 없는 변화에 사랑에 빠진 것 같았다. 코드로. Python에만 국한되지 않고 이러한 언어에는 어려움이 가득합니다. 의심스러울 때는 직관을 믿어야 한다고 생각합니다. 적어도 저는 직관이 매우 정확하다고 생각합니다

위 내용은 Python은 다양한 최적화 알고리즘을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jianshu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제