[카테고리:] Python

  • exact p-value – Python 으로 구하기. normal distribution 구현

    exact p-value – Python 으로 구하기. normal distribution 구현

    잊어버리기 전에 다시 정리…

    python으로 normal distribution 공식과 공식을 통해 해당 값의 frequency를 구해봤다.

    공식을 변형해서,

    python으로 구현하면 다음과 같다.

    import math
    import numpy as np
    
    def normal_distribution(x , mean , standard_deviation):
        frequency = (1/(math.sqrt(np.pi*2)*standard_deviation)) * np.exp(-0.5*((x-mean)/standard_deviation)**2)
        return frequency

    z-score가 2.45가 나올 때 해당 frequency값을 구하면,

    z-score는 평균이 0이고, 표준편차가 1일 때를 기준으로 하기 때문에 다음과 같이 집어넣어서 구할 수 있다.

    normal_distribution(2.45, 0, 1)

    그럼 값은

    0.019837354391795313

    이 나오고,

    지난번 포스팅에서 “해당 값을 표준화 했더니 z값이 2.45, 해당 값이 일어날 확률이 p=.0142가 나왔다.”는

    -> “해당 값을 표준화 했더니 z값이 2.45, 해당 값이 일어날 확률이 p=.0198가 나왔다.”로 수정해야한다.

    뭔가 계속 찜찜해서 결국 직접 구해봤다.

    추가로,

    실제 랜덤 데이터로 생성해서 구현했다.

    random_number = np.random.normal(0, 1, 100000000)
    print(np.mean(random_number))
    print(np.std(random_number))

    1억 개 정도 normal distribution 정규 분포 형태의 랜덤 데이터를 만들어서 평균값과 표준 편차 값을 확인했다.

    1억개 정도 하니 평균은 0, 표준편차는 1에 가까운 값이 나온다. 소숫점 이하의 오차는 갯수가 클 수록 더 작아진다.

    import seaborn as sb
    from scipy.stats import norm
    
    pdf = norm.pdf(random_number , loc = 0 , scale = 1 )
    sb.lineplot(random_number, pdf , color = 'red')

    이건 1억개 정도 돌리려고 했는데 램 용량 부족으로 못돌려서 1만개 정도만 돌린 그래프,

    pdf는 Probability density function 으로 확률 밀도 함수를 구해서 그래프로 그린 것,

    plt로 그래프 그린다고 해도 동일함

    import matplotlib.pyplot as plt
    
    count, bins, ignored = plt.hist(random_number, 100, density=True)
    plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp(-(bins-mu)**2 / (2 * sigma**2) ), linewidth=2, color='r')
    plt.show()

    여기에서 cdf 값, Cumulative distribution fuction으로.

    누적값으로 z값 2.45까지의 면적 값을 구해보면,

    # Library
    from matplotlib import pyplot as plt
    import numpy as np
    from scipy.stats import norm
    
    fig, ax = plt.subplots()
    
    # for distribution curve
    x= np.arange(-4,4,0.001)
    ax.plot(x, norm.pdf(x))
    
    ax.set_title("Normal distribution")
    ax.set_xlabel('x')
    ax.set_ylabel('pdf(x)')
    ax.grid(True)
    
    # for fill_between
    px=np.arange(-4, 2.45,0.01)
    ax.set_ylim(0,0.5)
    ax.fill_between(px,norm.pdf(px),alpha=0.5, color='g')
    
    # cdf(x) 값 구하기
    cdf_x = round(norm.cdf(x=2.45, loc=0, scale=1), 5)
    
    # for text
    ax.text(-1, 0.1, cdf_x, fontsize=20)
    plt.show()

    으로,

    z-score가 2.45를 기준으로 좌측 끝 부분부터 해당 값까지의 누적 면적 값… Cumulative 값은 0.993정도가 된다는 것을 추가로 확인했다.

  • Mac) anaconda 설치

    Mac) anaconda 설치

    뭔가 맥에 아나콘다가 설치가 잘 되지 않습니다. 이유를 모르겠군요… 설치는 되는데 작동이 잘 되지 않는 듯한,

    설치 과정을 일단 기록했습니다.

    1. 아나콘다 사이트에서

    해당 맥 파일을 다운로드 받고,

    https://www.anaconda.com/products/distribution

    2. 허용하고 그대로 쭉 설치 과정 진행

    확인

    3. 여기서 부터 문제

    설치해 실패했습니다 라고 뜹니다.

    설치는 실패했지만 깔려있긴 하니.

    업데이트도 있어서

    업데이트도 해주고,

    주피터 노트북도 돌려봤는데 localhost: 8888인 상태에서 돌아갑니다.

    일단, 당장 주피터 노트북을 사용할 일은 없어서 몇 번 써보고 말긴 했지만.

    뭔가 찜찜하게 설치가 되고 끝났습니다.

    이렇게 설치 실패하면 라이브러리 설치할 때 꼭 문제가 생기던데,

    흠. 원인을 모르겠네요.

    약간의 추정은 m1과 관련한 이슈가 아닐런지. miniforge로 설치하는 분들이 많아서…

  • RAM 용량 건으로 Colab Pro 결제

    RAM 용량 건으로 Colab Pro 결제

    코랩 유료 버전은 어디에서 사용할 수 있냐는 faq에서 한국인 없길래 한국에선 안 된다고 생각하고 테스트 삼아 결제했는데 잘 돌아간다

    코랩 pro를 쓴 이유는 RAM 용량 때문에 뭘 좀 돌렸는데 램이 부족해서 코랩에서도 돌아가지 않아서 프로로 결제하고,

    옵션에서 고용량 RAM 선택해서 돌렸더니 잘 돌아갔다

    저 위의 코드를 돌려보면 GPU 이름과, NVIDIA-SMI, CUDA version 등을 확인할 수 있다. GPU 버전 아니면 GPU에 연결할 수 없다라고 뜸.

    문제의 데이터셋. 무료 코랩을 쓸 때는 이 부분을 아예 볼 수 없었다. 중간에 다 끊겨서. 프로를 쓰니 볼 수 있었다. 데이터가 크면 이런 문구를 띄어 주는 것 같다.

    이 데이터셋트는 507만 개 정도 된다. 507만 개 정도 for문으로 돌리면 RAM 용량 초과로 코랩으로 돌리면 안 돌아가집니다.

    문제 해결!

  • M1 tensorflow와 keras 설치 실패

    M1 tensorflow와 keras 설치 실패

    이것은 실패 기록입니다. 실패 로그도 남깁니다.

    tensorflow와 keras는 m1 맥북에는 miniforge를 통해서 설치해야 하는 것 같다. 아직, miniforge로 못해보고 conda 로만 시도해봤는데

    tensorflow가 깔리지 않는다. conda install -c 설치채널이름 패키지이름 순으로 작성하면 윈도우는 되는 것 같다. 그런데

    맥북 터미널에서,

    conda install -c conda-forge tensorflow

    conda install -c conda-forge keras

    로 설치시도 했는데 m1 맥북엔 안 먹힘.

    tensorboard를 보기 위해서 직접 설치해보려고 했는데…

    miniforge로 설치하는 방법이 있다고 한다. 그건 나중에. 일단 코랩으로 해결했다.

  • python) TypeError: ‘int’ object is not callable – sum(list)

    python) TypeError: ‘int’ object is not callable – sum(list)

    이런 에러가 생겼다. 타입 에러. ‘int’ object is not callable

    sum() 으로 리스트 내의 요소들을 전부 더해주려고 했는데 아무리 돌려도 타입에러가 났는데,

    그럴 리가 없었다. sum(리스트 이름) 이면 요소 값이 전부 더해지는 건데,

    그리고 알아낸 게. for문 써서 합계 구하는 거 테스트 하고, 그 다음 리스트 컴프리헨션으로 어찌저찌 뭘 만들어보다가. sum 을 쓴 거였는데.

    for 문 구문 앞에 썼을 때 sum을 변수 명으로 썼었다…..

    예약어였지 하면서 total 로 바꿨지만 sum을 변수명으로 썼던 건 계속 남아있었으니…

    midterm_class_a = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]
    total = 0
    for i in midterm_class_a:
      total += i
    
    avg = total / len(midterm_class_a)
    print(avg)

    del sum

    으로 돌려주고,

    다시 돌리면 리스트 내의 요소들을 합칠 수 있었다.

    혹시나 해서… 포스팅…

  • AttributeError: ‘Series’ /’DataFrame’ object has no attribute ‘~’ /

    AttributeError: ‘Series’ /’DataFrame’ object has no attribute ‘~’ /

    AttributeError: ‘DataFrame’ object has no attribute ‘difference’ 혹은 AttributeError: ‘Series’ object has no attribute ‘difference’

    에러를 보고, 얼른 Pandas 라이브러리로 pd로 만들어서 어찌저찌 했는데도 여전히

    에러가 뜨길래 다시 확인해보니

    difference라는 변수명을 가진 열 자체가 없었다. 알고 보니!

    변수명을 만들어주어야 한다!

    data[‘difference’] = data[‘열 이름’] + data[‘열 이름’]

    이런 식으로 만들어주고 호출해주면 된다….고 생각했는데 value error가 떴다.

    ValueError: Data must be at least length 3.

    오… 이 부분은 data.diff로 호출하는지. 아니면 data[‘diff’]로 호출하는지에 따라서 에러가 나는 것 같다.

    data[‘해당 열 이름’]

    으로 호출해주면 돌아간다.

  • ValueError) Input 0 of layer “inception_resnet_v2” is incompatible with the layer: expected shape=(None, 299, 299, 3), found shape=(32, 256, 3)

    ValueError) Input 0 of layer “inception_resnet_v2” is incompatible with the layer: expected shape=(None, 299, 299, 3), found shape=(32, 256, 3)

    2022.10월 말 기준

    여전히 레이어 개념이 헷갈린다. (256, 256, 3) 이렇게 있는데 한 개의 층을 왜 도대체 더해주어야 하는 걸까 (1, 256, 256, 3) 이런 식으로

    하나를 더해주는데 졸면서 코드 따라서 치기는 했는데, 여전히 풀리지 않는 의문이다.

    ValueError: Input 0 of layer “inception_resnet_v2” is incompatible with the layer: expected shape=(None, 299, 299, 3), found shape=(None, 256, 256, 3)

    이런 에러나,

    ValueError: Input 0 of layer “inception_resnet_v2” is incompatible with the layer: expected shape=(None, 299, 299, 3), found shape=(32, 256, 3)

    이런 에러.

    한 개의 이미지는 3개의 층, R, G, B 층으로 되어 있고 픽셀 값을 각각 행렬로 해두었다. 까진 어떻게 이해하는데 이미지넷으로 소트할 때 왜 층을 하나 더 더해줘야 하는지.

    에러는 해결하지만 원리는 솔직히 헤매고 있다. 내 자신이 이해가 안 됨. 책을 읽으면 그렇쿠나 하지만 막상 실전에선 다시 헤매는 걸 보니 뭔가 이해가 안되는 것 같다.

    # 이런식으로 target_size를 정해주고,
    load_img(FILE_1, target_size=(299, 299))

    .shape를 통해서 확인,

    하면 299, 299, 3 으로 되어 있음 케라스 공식 문서 에서 요구하는 사이즈가 299, 299 였고,

    import numpy as np 로 했으니 np. 으로 넣고 dims를 하나 더 추가…

    np.expand_dims(pic_array, axis=0)

    (1, 299, 299, 3)

    으로 나와서

    inception_model.predict(expanded)

    로 넣었을 때 저런 에러가 나타나지 않는다.

    저 행렬 값의 형태가 중요한데,

    엄 글을 쓰면서도 정리가 잘 되지 않아서…

    다시 공부해야겠단 생각이 들었다. (그래도 쓰다 보니 뭔가 알듯 말듯 하기도 하고)

  • Import Error) cannot import name ‘img_to_array’ from ‘keras.preprocessing.image’

    Import Error) cannot import name ‘img_to_array’ from ‘keras.preprocessing.image’

    현재 기준 2022.10월 말.

    2년 전에 작동되었던 tensor와 keras는 지금과 많이 다르다. 정말 빠르게 변하고 있다고 느낀다. 뭐가 조금만 해도 이미 옛날 버전이 되어 있다.

    텐서플로우와 케라스를 import 하는데 이전에 preprocessing에서 있던 게 지금은 utils에 있다.

    이미지를 행렬로 변환하고 로드하는 코드 에러나는 걸 수정했던 부분.

    ImportError: cannot import name ‘img_to_array’ from ‘keras.preprocessing.image’ (/usr/local/lib/python3.7/dist-packages/keras/preprocessing/image.py

    이 건 하단의 코드로 변경.

    # from keras.preprocessing.image import img_to_array, load_img
    from tensorflow.keras.utils import img_to_array, load_img

    다음으로 # tf.keras.applications.InceptionResNetV2

    공식 문서에서 tf.keras 어쩌구 되어 있는데 이 부분은 import tensorflow as tf로 불러오고 하는데 이상하게 코랩에서 에러가 나서 그냥

    tensorflow.keras.applications. ~ 로 수정했다.

    # from tensorflow.keras.applications.InceptionResNetV2 import InceptionResNetV2
    from tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2, decode_predictions, preprocess_input

    코드 관련해서 공식 문서는 케라스 홈페이지에

    https://keras.io/api/applications/vgg/#vgg19-function

    에 들어가면 코드가 뜬다.

  • Python) Reeborg’s World Maze – 알고리즘

    Python) Reeborg’s World Maze – 알고리즘

    일요일에는 Maze 부분 못 풀었는데 정답 보기는 싫고 어떻게든 알아서 풀어보고자 했고,

    퇴근하고 와서 다시 Maze 부분 붙들고 풀다가 풀었습니다.

    뭐 만들 때 안 풀리면 하루 잠을 자고 다음 날 풀거나 산책하고 와서 풀거나, 커피 마시고 돌아와서 풀고, 수학 문제처럼 머리 속에 두고두고 있다가 어떻게 하다보면 풀리는 것 같습니다.

    Reeborg’s World – Maze 편

    python 함수 move() 를 넣으면 움직이고, turn_left()하면 왼쪽으로 돕니다.

    front_is_clear(), wall_in_front(), right_is_clear(), wall_on_right(), at_goal() 이 부분은 True / False 로 반환 받을 수 있습니다받는 부분입니다.

    while로 루프 써서,

    저 미로를 로봇이 도착지점까지 올 수 있도록 코드를 짜는 것이 요 미로 편이였습니다.

    미로 풀기는 하단 링크에서 할 수 있습니다.

    https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Maze&url=worlds%2Ftutorial_en%2Fmaze1.json

    주어지는 미로 속에서 로봇이 잘 헤쳐나갈 수 있도록 많은 경우의 수를 고려해서 코드를 짜는 걸 알고리즘이라고 합니다.

    로봇이 보는 곳은 동서남북 중 랜덤으로 방향이 정해집니다.

    풀었던 코드:

    이렇게 저렇게 풀어보다가 풀었던 코드는 이 방법이었습니다.

    def turn_north():
        while is_facing_north() != True:
            turn_left()
    
    def turn_west():
        turn_north()
        turn_left()
        turn_left()
        turn_left()
            
    turn_west()            
    while at_goal() != True:
        if front_is_clear() and wall_on_right():
            move()
        if wall_in_front() and right_is_clear():
            turn_left()
            turn_left()
            turn_left()
            move()
        if wall_in_front() and wall_on_right():
            turn_left()
        if front_is_clear() and right_is_clear():
            turn_left()
            turn_left()
            turn_left()
            move()
        elif front_is_clear():
            move()

    이 중에서 약간 핵심이라고 생각하는 조건이 front_is_clear() and right_is_clear()일 때 어느 방향으로 움직일 지 설정해 주는 거였습니다. 미로를 푸는 방법은 벽을 따라 오른쪽으로 쭉 돌다보면 나가는 곳이 보일테니 오른쪽으로 가도록 설정을 하고, 하지만 벽이 막혀 있다면 왼쪽으로 틀어주는 방법. 으로.

    이렇게 저렇게 실험하 듯 짜다보니 코드가 정리되지 않았는데,

    저 turn_left() 3번 쓰는 걸 함수로 묶는

    def turn_right():
       turn_left()
       turn_left()
       turn_left()

    대략 어떻게 움직일지 동작하는 걸 구현했지만 좀 더 깔끔한 코드 리팩토링이 필요할 것 같네요.

    깊이 우선 탐색, 넓이 우선 탐색 이런 걸 뭔가 몸으로 체득하듯이 코드를 짜는 것 같아서 저 사이트 정말 유용하다고 생각합니다.

    문제는 답지 없이 꼭 풀고. 어떻게든 혼자 힘으로 풀어내는 걸 추천합니다 🤖🤖🤖🤖🤖

    굳었던 머리가 말랑해지는?? 좋아지는 느낌도 듭니다.

    치매 예방! 두뇌 회전!

    (무슨 광고 같아ㅋㅋㅋㅋ)

  • python) Reeborg’s World Hurdle4 풀기

    python) Reeborg’s World Hurdle4 풀기

    은근히 안되서 될 때까지 붙잡고 풀었습니다.

    python 코드를 연습하기 좋은. 스크래치 게임과 비슷한 Reeborg’s World 입니다.

    Reeborg's World
    Reeborg’s World

    1, 2, 3 단계는 쉽게 풀릴테고, 4단계부터는 코드 하나에 하나하나 어떻게 돌아가는지 확인이 필요합니다.

    코드를 짜는 건 귀찮으니 빠르게 해결하려고 했던 건데… 가는지 안가는지 확인해야 한다니ㅋㅋㅋ

    사람이라면 장애물이 대략 몇 미터인지 파악해서 4미터면 4번 갔다 도는 것, 1미티 정도면 1번 돌고… 이런 식으로 빠를 텐데.

    귀여운 Reeborg는 눈 앞에 장애물이 없으면 이동해, 우측에는 벽이 있어? 앞에는 장애물이 있어? 만약 우측에 벽이 없다면…

    이라고 하나부터 열까지 하나하나 설정해야 합니다.

    일단 4단계 풀었던 코드는 요렇습니다. 그런데 해결된 코드 복붙해봐야 재미없으니 직접 하는 걸 강추…

    원래 가지고 있던 def와 따로 만들어서 움직이도록 짰습니다.

    하다가 에러나면 오기도 생기고, 될 때까지 한다. 이런 느낌으로 해보면 엄청 재밌습니다.

    사이트 주소:

    https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Hurdle%201&url=worlds%2Ftutorial_en%2Fhurdle1.json

    def turn_right():
        turn_left()
        turn_left()
        turn_left()
    
    def jump():
        turn_left()
        move()
        turn_right()
        move()
        turn_right()
        move()
        turn_left()
        
    while at_goal() != True:
        if right_is_clear():
            turn_right()
            move()
            turn_right()
            move()
        elif front_is_clear():
            move()
        elif wall_in_front():
            turn_left()
        elif wall_on_right():
            move()
            turn_right()

    그리고 다음 스테이지로 이동!

    또다른 솔루션은

    def turn_right():
        turn_left()
        turn_left()
        turn_left()
    
    def jump():
        turn_left()
        while wall_on_right():
            move()
        turn_right()
        move()
        turn_right()
        while front_is_clear():
            move()
        turn_left()
            
        
    while at_goal() != True:
        if wall_in_front():
            jump()
        else:
            move()

    좀 더 깔끔한 코드

error: Content is protected !!