퐈니썬's LIfe - 잘 실패하자 RSS 태그 관리 글쓰기 방명록
분류 전체보기 (44)
2022-03-11 17:01:26
728x90
반응형

Introduction

파이썬을 처음 접했을 때, 무슨 뜻인지 몰라 헤매던 적이 있던 내용을 차근차근 정리하고자 합니다. 

파이썬 라이브러리 코드를 보다가 함수의 인자에 작성된 내용을 보고 당황했던 적 있습니다. 

# a function
func(*args, **kwargs)

어떤 의미인지 차근차근 알아가보겠습니다. 

 

 

*args, 위치인자

아래와 같은 함수가 있다고 해봅시다. 

def sum_val(a, b):
	return a+b

이 함수는 a, b  두 가지 인자를 입력으로 받아 합을 내는 함수입니다.

하지만, 이 함수를 사용하는 사용자는 두 변수 이상을 입력하여 합을 도출하고 싶습니다.

 

이 함수는 적절하지 못하기 때문에 아래와 같은 함수를 만들어 볼 수 있습니다. 

def sum_val_list(value_list):
	answer = 0
    for val in value_list:
    	answer += val
    return answer

 

위 함수는 입력에 여러 가지 변수를 넣어 합을 도출할 수 있으나, 입력 인자가 반드시 "리스트 형" 이여야 합니다. 즉, 이 함수를 사용하는 사용자는 "리스트"를 구성하여 입력해주어야 합니다. 

 

이런 경우 *args를 사용하여 해결할 수 있습니다. 

def sum_val_args(*args):
	answer = 0
    #*args를 통해 받은 인자를 리스트형으로 받아 냅니다. 
    for val in args:    
    	answer += val
    return answer

 

*args는 함수 내에서 args로 리스트형을 받아내기 때문에 위치 인자를 저장합니다. 리스트로 하나하나 받아내기 때문에 위치인자를 받기 위해 사용되는 것이죠.

 

*args 적용 전에는 사용자가 아래와 같이 사용해야 했습니다. 

sum_val_list([1,2,4])

*args를 적용한 함수는 아래와 같이 사용이 가능합니다. 

sum_val_args(1,2,4)

 

위치 인자와 키워드 인자???

function(1, 2, a=3, b=4)

위와 같은 함수가 있을 때, 1과 2는 위치 인자이며 a, b는 키워드 인자로 값을 받는 함수입니다. 
이때, 반드시 위치 인자와 키워드인자는 위치인자 다음에 키워드 인자가 와야 합니다.

 

 

**kwargs 키워드 인자

이번엔 **kwargs를 이해하기 위해서는 또 다른 예시의 함수를 정의해보겠습니다. 

def print_keyword(name, university):
	print("name: ", name)
	print("university: ", university)

위 함수는 name, university라는 변수를 받아 출력합니다. 하지만, 사용자가 새로운 파라미터를 추가하고 싶다면, 이 함수를 바꾸어야 할 것입니다. 굉장히 번거로운 일이 될 것입니다. 

 

그래서 "딕셔너리 형"을 이용해서 아래와 같은 함수를 만들 수 있을 것입니다.

def print_keyword_dict(dictionary):
	for key in dictionary:
    	print(key + ": " + dictionary[key])

위 함수는 dictionary를 받아서, key를 통해 해당 값을 출력할 수 있기 때문에 dictionary에 새로운 파라미터를 추가하여 출력할 수 있습니다. 하지만, "딕셔너리 형"을 구성해야 한다는 불편한 점이 있습니다.

 

이런 경우 **kwargs를 사용하여 해결할 수 있습니다. 

def print_keyword_kwargs(**kwargs):
	for key in kwargs:
    	print(key + ": " + kwargs[key])

**kwargs는 함수 내에서 kwargs로 딕셔너리 형을 받아내기 때문에 키워드 인자를 저장합니다.

 

 

# **kwargs 적용 전 함수
print_keyword_dict({"name":"jaehwan", "university":"seoul", "studentID":"123155"})

# **kwargs 적용 후 함수
print_keyword_kwargs(name="jaehwan", university="seoul", studentID="123155")

 

훨씬 깔끔하고, 사용하기 편한 함수가 된 거 같습니다. 

 

 

 

요약

  • 함수에 위치 인자를 받고 싶을 때! -> *args 사용! 리스트형으로 받아내기 때문에 위치(순서)대로 받아 처리!
  • 함수에 키워드 인자를 받고 싶을 때! -> **kwargs 사용! 딕셔너리형으로 받아내기 때문에 키워드에 따라 값을 받아 처리!

 

https://www.geeksforgeeks.org/args-kwargs-python/

 

*args and **kwargs in Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

728x90
반응형

'Programming > Python' 카테고리의 다른 글

파이썬 f-string  (0) 2021.12.31
파이썬 모듈이란? 패키지란?  (0) 2021.07.01
파이썬 PEP8 스타일 가이드 정리  (0) 2021.07.01
파이썬 클래스 상속  (0) 2021.06.28
numpy flip을 활용한 DICOM 이미지 반전 대칭  (0) 2021.06.25
2022-02-16 09:12:02
728x90
반응형

 

 

Introduction

 

인공지능을 통해 문제를 해결할 때, 기본적인 인공지능 개발의 절차에는 "데이터 전처리" 라는 단계가 있습니다. 

"데이터 전처리"는 정확하고, 좋은 성능의 예측 모델은 잘 정리된 데이터가 필수적으로 기반되어야하기 때문에 존재하는 단계 입니다. 즉, 교한 예측 분석 모델을 얻기 위해서는 수집된 데이터에 누락된 부분이나, 오차, 또는 데이터 처리에 있어서 가공할 부분은 없는지를 살펴보아야 합니다. 

 

이러한 "데이터 전처리"를 하기 위해서는 데이터를 살펴 보아야 하는 "탐색적 데이터 분석 (Exploratory Data Analysis)" 를 통해 진행하게 됩니다. 

 

"탐색적 데이터 분석 (Exploratory Data Analysis)"  진행하기 위해서 데이터를 눈으로 확인할 수 있도록 "데이터 시각화" 작업이 굉장히 중요합니다. 

 

본 포스트에서는 "탐색적 데이터 분석"에 대해 살펴 보고, 데이터에 따른 시각화 전략, 시각화 방법등이 잘 기록된 사이트를 공유하고자 합니다. 

 

 

탐색적 데이터 분석(EDA)란?

 

탐색적 데이터 분석은 데이터를 분석하고 조사하여 주요 특성을 파악하는 데 사용되는 방식을 뜻합니다.  데이터의 사건에 따른 변수들이 어떻게 구성되어 있는가?, 즉 데이터의 분포와 경향성을 파악하는 작업입니다. 

 

제가 생각하는 탐색적 데이터 분석에 대한 생각의 흐름은 다음과 같습니다. 

 

(1) Raw 데이터 수집

(2) 데이터의 사건(행)에 따른 변수(열)을 시각화

(3) 데이터의 사건마다 데이터 수가 밸런스 맞게 구성되어있나?

(4) 값의 전체 평균은 어떤가? 

(5) 결측치는 있을까? 

(6) 이상치는 있을까? (Domain-specific, 기존에 데이터의 변동성을 안다면)

(7) 데이터의 수집에는 문제가 있을까?

..등등

 

이러한 부분들을 고려하여서 데이터 클린이 이루어진 후에 예측 모델로 넘어가는 것이 차후에 발생하는 문제들이 줄어들고 오히려 워크 플로우에 시간이 단축되고 예측 모델의 성능에도 직접적인 영향을 주기 때문에 굉장히 중요한 단계입니다. 

 

탐색적 데이터 분석의 핵심

 

<1. 데이터 백업>

데이터 분석은 Raw 데이터를 통해서 뿐아니라, 가공된 데이터를 통해서도 해야합니다. 즉, 데이터를 가공할 때마다 또는, 변형할 때마다 해당 데이터가 적합한지 분석을 계속 진행하고 수정해야합니다. 그러므로, 항상 백업을 해두는게 좋습니다. 

 

<2. 데이터에 대한 정확한 이해>

데이터 분석에서 가장 중요한 것은 해당 데이터에 대한 "Domain Specific Knowlege" 라고 볼 수 있습니다. 

테이블 데이터의 row, column의 의미는 무엇인지?

데이터 값의 Feasibility를 정량/정성적으로 판단할 수 있는가? 

(예시. 대한민국 사람의 신장 통계치에 300cm 기재시, 이게 맞는가? 라는 의문)

 

<3. 데이터 결측치에 대한 합리적인 처리>

수집한 데이터가 모두 채워져 있는 경우는 많지 않을 것입니다. 이때, 결측치를 어떻게 처리할지는 데이터 분석에서 중요한 요소입니다. 

수집한 데이터의 결측치 처리는 결국  "Domain Specific Knowlege" 따라 판단해야합니다. 

해당 결측치를 특정 값으로 처리할지?, 버릴지? 등등의 판단이 필요합니다. 

종국에는, 결측치에 의해 예측모델의 성능에 영향을 주어선 안됩니다. 

 

<4. 데이터 시각화>

데이터 시각화는 "데이터에 대한 통찰을 직관적으로 이해", "팀간의 소통" 을 위한 것입니다.

업무의 의사결정을 하는 사람에게 반드시 시각화를 통해 보여주는 것이 가장 효율적이라는 것은 자명합니다. 

여기서 어떻게 보여주느냐 역시, "Domain Specific Knowlege" 따라 판단해야합니다.

데이터 처리자를 위해서~
- 나도 오해/착각 할수 있다!
- 기본적인 것은 꼭 표시하자!( legend, 축, 단위 등)

청자/독자를 위해서 ~
- 사소한 것 까지 알려줘야 한다.
- 저들은 모른다.
- 누구나 이해하기 쉽도록 시각화 하기
- 초등 학생 정도가 들어도 이해할 수 있도록 

 

유용한 시각화 전략 사이트

 

 


데이터를 어떻게 표현해야지, 청자가 잘 이해할 수 있을까?

 

데이터 시각화에서 많은 시간이 걸리는 이유가 되지 않을까 생각합니다. 유용하게 사용될 수 있는 시각화 전략 사이트가 있습니다. 가장많이 사용되는 차트 순위, 차트 표현된 블로그, html, python 코드 등등 많은 부분 영감을 얻어 가실 수 있을거라 생각합니다. 

 

 

<Datavizcatalogue>

많이 사용되는 차트 순위나, 데이터에 따른 차트 사용에 대한 내용을 정리되어 있습니다.

https://datavizcatalogue.com/search/comparisons.html

 

Comparisons: The Data Visualisation Catalogue

Comparisons Visualisation methods that help show the differences or similarities between values. With an axis Without an axis

datavizcatalogue.com

 

<The Python Graph Gallery>

대부분의 차트에 대한 파이썬코드를 공유하고 있습니다.

https://www.python-graph-gallery.com/

 

Python Graph Gallery | The Python Graph Gallery

The Python Graph Gallery displays hundreds of charts made with Python, always with explanation and reproduciible code

www.python-graph-gallery.com

 

 

 

728x90
반응형
2022-02-15 00:10:52
728x90
반응형

<Introduction>

본 포스트에서느 이미지 처리 중 "밝기조절" 과 "대조도"에 대해 알아보고 구현해보고자 합니다.


<Luminosity>

명도라고도 불리는 밝기는 이미지의 픽셀 값에 사용자가 설정하여 입력할 밝기도를 정하여 픽셀값에 더해주면 됩니다. 

 

픽셀의 값이 증가하면, 이미지가 밝아집니다. 반면에 픽셀의 값이 감소하면 어둬어집니다.

 

$$ LuminosityImageValue = ImageValue + LuminosityValue $$

 

간단하게 이미지의 픽셀을 불러와서 명도 수치를 더해주면 됩니다!

 

<Luminosity - 구현>

from PIL import Image, ImageDraw

# 설정하고자 하는 밝기도
luminosity = 80

# 이미지 로드
input_image = Image.open("input.png")
input_pixels = input_image.load()

# 출력 이미지 생성
output_image = Image.new("RGB", input_image.size)
draw = ImageDraw.Draw(output_image)

# 이미지의 픽셀에 밝기도 더하여 출력
for x in range(output_image.width):
    for y in range(output_image.height):
        r, g, b = input_pixels[x, y]
        r = int(r + luminosity)
        g = int(g + luminosity)
        b = int(b + luminosity)
        draw.point((x, y), (r, g, b))

output_image.save("output.png")


<Contrast 대조도>

Contrast는 이미지의 밝은 부분과 어두운 부분의 차이를 의미하고, 이를 조절한다는 것은 이미지의 밝은 부분과 어두운부분의 차이를 조절한다는 의미입니다. 이는 이미지내의 물체를 선명하게 보는 효과를 가지고 옵니다. 

 

예를들어, 이미지 안의 픽셀들이 대부분은 비슷한 Intensity(값)을 가진다면 어떨까요?

 

이미지는 아래와 같이 어떠한 물체 정보도 얻기 힘들 것입니다. 

 

 

이 경우를 대조도가 낮다 라고 말할 수 있습니다. 반면에, 대조도가 높다는 것은 이미지 내의 물체를 식별하는데 용이하고 이는 선명하다 라는 느낌을 주게됩니다. 

 

<Contrast 대조도 - 구현>

앞서 말씀드린 것처럼 대조도가 높다는 것은 이미지 내의 물체를 식별하는데 용이하고, 선명하다 라는 느낌을 주게됩니다. 즉, 대개는 대조도를 높여 이미지를 선명하게 하는 것이 이미지의 질을 높이는 방향일 것입니다. 

 

어떻게 대조도를 만드느냐에 대해는 여러가지 방법론이 있습니다. 하지만 핵심은 "intensity 값의 곱" 입니다.

 

즉, 입력이미지의 픽셀에 어떠한 조정 값을 곱하여 대조도를 변경 할 수 있습니다. 

 

예를 들어,  A라는 픽셀은 100이라는 Intensity를 가지고, B라는 픽셀은 50이라는  intenstiy를 가진다고 가정합니다.

 

Contrast를 높이기 위해 두 픽셀 값에 대해 1.5를 곱한다고 하면, A= 150, B=75가 됩니다.

 

1.5를 곱하기 전의 A-B의 값은 50이였지만, 1.5를 곱한 후의 A-B의 값은 75입니다.

 

즉, 두 픽셀의 값의 차이가 더 벌어진 것입니다. 이러한 원리로 대조도를 조정합니다.

 

이때 곱해지는 값을 정하는 방법은 여러가지가 있습니다.

 

from PIL import Image, ImageDraw

# Load image:
input_image = Image.open("input.png")
input_pixels = input_image.load()

# Create output image
output_image = Image.new("RGB", input_image.size)
draw = ImageDraw.Draw(output_image)

# Find minimum and maximum luminosity
imin = 255
imax = 0
for x in range(input_image.width):
    for y in range(input_image.height):
        r, g, b = input_pixels[x, y]
        i = (r + g + b) / 3
        imin = min(imin, i)
        imax = max(imax, i)

# Generate image
for x in range(output_image.width):
    for y in range(output_image.height):
        r, g, b = input_pixels[x, y]
        # Current luminosity
        i = (r + g + b) / 3
        # New luminosity
        ip = 255 * (i - imin) / (imax - imin)
        r = int(r * ip / i)
        g = int(g * ip / i)
        b = int(b * ip / i)
        draw.point((x, y), (r, g, b))

output_image.save("output.png")

 

 

728x90
반응형
2022-02-14 15:21:14
728x90
반응형

<Introduction>

2022.02.11 - [통계] - [통계] 독립 변수란? 종속 변수란?

 

[통계] 독립 변수란? 종속 변수란?

어떤 일이든 하다 보면, 어느 시점에서 드는 항상 드는 생각이 있습니다. "기본이 정말 중요하구나" 독립변수와 종속변수에 대해 중고등학교 과학 시간에도 익히 들었던 개념입니다. 이 두 변수

panython.tistory.com

독립변수와 종속변수에 대한 글에 이은 글입니다. 

 

독립변수와 종속변수의 관계를 알아보기 위한 방법, 우리가 알고자 하는 현상에 대해 수학적으로 모델을 어떻게 풀어갈 것인가 에 대한 방법인 상관분석과 회귀분석에 대해 작성하고자 합니다. 


<상관분석>

제가 생각하는 두 분석의 차이에 대한 예시를 들어보고자 합니다. 

 

"근육량과 운동시간은 어떤 관계를 가질까?" - 상관분석

 

"근육량과 운동시간의 관계"를 밝혀내고 싶을 때, 상관분석을 하는 것이 맞습니다. 

근육량, 운동시간이라는 두 변수의 상호 관계 또는 연관성을 볼 수 있기 때문에 상관분석을 통해 아래와 같은 결과를 볼 수 있을 것입니다. 

 

1. 근육량과 운동시간은 무관하다.

2. 근육량과 운동시간은 양의 상관 관계를 가진다 (근육량, 운동시간 비례적인 관계).

3. 근육량과 운동시간은 음의 상관 관계를 가진다 (근육량, 운동시간 반비례적인 관계). 

 

하지만, 상관분석으로 인과 관계를 밝힐 수 없습니다. 애초의 두 변수에 대한 원인과 결과를 정의해두고 있지 않고, 연관성이나 상호 관계를 분석하는 방식입니다. 

즉, 근육량과 운동시간이 양의 상관 관계를 가진다는 결과를 받았을 때, 근육량이 커서 운동시간이 긴 것일지 운동시간이 길어서 근육량이 큰 것인지는 정의하기는 어렵습니다. 

 

상관분석에서는 변수 사이의 관계를 표현하고 수치를 보고자 하는 것입니다. 즉, 두 변수의 관계가 어떻고, 얼마나 강한 연결관계를 가지는 가를 수치, 척도로 표현합니다


<회귀분석>

"운동시간이 길기 때문에,  근육량도 늘지않을까?" - 회귀분석

 

"근육량과 운동시간의 인과관계"를 밝혀내고자 할 때는, 회귀분석이 적합합니다. 

운동시간이 길기 때문에 근육량에 주는 영향을 수학적인 모델로 밝혀 낼 수 있을 것입니다.

회귀분석은 주어진 변수가 인과관계를 가지고 었어야합니다.

 

하나 이상의 독립 변수(운동시간)의 변화가 종속 변수(근육량)의 변화를 추정하는 것이 목표입니다.

 

회귀분석은 독립 변수와 종속 변수의 관계를 수학적 모델로 밝혀낸다고 말씀드렸습니다.

그렇기 때문에 회귀분석을 통해 나오는 결과는 "어떠한 수학 식" 이 되고, 일반적인 회귀 분석법인 선형 회귀 분석은 아래와 같은 하나의 직선, 회귀선이라 불리는 수식을 찾는 과정입니다. 

츌처 https://kkokkilkon.tistory.com/77

 

y= ax + b는 독립변수 x와 종속변수 y의 관계를 설명하는 수식이라 볼 수 있고, 이 수식을 통해 주어진 x 값을 통해 y값을 추정할 수 있습니다. 

 

즉, 운동시간과 근육량이 위의 그래프와 같은 관계를 가진다면, 1시간 정도 할 경우 근육량이 어느 정도 늘어날 것인가를 추정해 볼 수 있을 것입니다. 

 

결국 회귀분석 과정은 독립변수 x, 종속변수 y의 데이터가 산점도 그래프처럼 뿌려져 그려질 때, y=ax + b라는 최적의 회귀선을 찾아가는 과정을 말합니다.

 

최적의 회귀선? 두 변수 관계를 가장 잘 설명하는 회귀선!

 

가장 잘 설명하는 회귀선이라는 기준을 찾는 방법은?? 최소 제곱 법!

 

<최소 제곱 법>

최소 제곱 법을 설명하기 위해서는 잔차라는 개념을 먼저 알아야 합니다. 

잔차란 관측값(실측값)의 y와 예측값의 y 간의 차이를 말합니다. 

 

다시, 산점도 그래프로 뿌려진 데이터에서 가장 설명을 잘할 수 있는 회귀선 y = ax + b를 찾는 과정입니다. 

 

이때, a와 b를 어떻게 갱신하느냐에 따라 회귀선이 달리 표현될 것입니다. 

즉, a와 b에 의해 표현된 회귀선이 x, y의 관계를 가장 잘 설명해야하한다 라는 의미가 됩니다. 

 

그래서 a와 b를 임의로 설정한 후 주어진 데이터 x를 넣어보면서 관측값(실측값)  y와 차이가 없는지 계속 알아보면서 차이가 적은 그래프, 즉 가장 실측값에 가깝게 표현되는 회귀선을 찾아가는 방법입니다.

 

이 방법을 "최소 제곱 법"이라고 합니다. 

 

예를 들어 A(1, 4)과 B(2, 3)라는 2개의 점이 있고 회귀 식이 f(x) = y = 2x + 1이라 합니다.

 

A의 관측값은 4이지만, 회귀선에 의해 예측된 값은 f(1)인 3입니다. 이때 A의 잔차는 1입니다. 

B의 관측값은 3이지만, 회귀선에 의해 예측된 값은 f(1)인 5입니다. 이때 B의 잔차는 2입니다. 

 

이때, 잔차의 제곱의 합은 5일 것입니다. 이 값이 가장 최소가 되는 회귀식을 찾아가는 것이 회귀분석의 과정입니다. 

 

출처 https://wyn-associates.com/lr_pr/


<상관분석 vs 회귀분석 비교 차트>

출처 https://ko.gadget-info.com/difference-between-correlation


<내 생각>

상관분석은 결국 두 변수에 대한 관계성을 파악하고, 어느 정도 그 관계성이 강한가를 보는 것이고, 회귀분석은 인과관계에 있는 두 변수가 어떤 변화 양상을 가지는 지를 수학적 모델로 표현하고, 이 수학적 모델을 찾아가는 과정이라 이해가 되었습니다.

인공지능에서 하나하나의 노드(퍼셉트론)가 이러한 회귀분석을 통해 결과를 추출한다는 의미에 대해 더 명확하게 이해할 수 있었습니다. 

 

인공지능의 레이어층들은 엄청난 회귀분석의 연속, 집합체라는 생각이 들었습니다. 

 


<참고 자료>

https://ko.gadget-info.com/difference-between-correlation

https://kkokkilkon.tistory.com/77

https://wyn-associates.com/lr_pr/

 

728x90
반응형

'통계' 카테고리의 다른 글

[통계] 독립 변수란? 종속 변수란?  (0) 2022.02.11
2022-02-11 13:35:19
728x90
반응형

<Introduction>

어떤 일이든 하다 보면, 어느 시점에서 드는 항상 드는 생각이 있습니다.

 

"기본이 정말 중요하구나" 

 

독립변수와 종속변수에 대해 중고등학교 과학 시간에도 익히 들었던 개념입니다. 이 두 변수에 대해서는 통계에 기반한 인공지능을 이해할 때 반드시 숙지해두어야 하는 개념이라 생각하여 정리하게 되었습니다. 

 

<독립변수>


독립변수는 입력값(X)이나 원인으로 고려되는 변수로 설계자, 연구자가 변화시키는 변수를 말합니다. 

 

예를 들어, 근육은 어떻게 하면 키우지? 라고 어느 날 생각했습니다. 

근육이 크려면, 잘먹어야하나?, 운동을 열심히 해야 하나?, 영양제를 잘 챙겨 먹어야 하나?, 세트 간 쉬는 시간을 줄여야 할까? 등등..

근육이 키우기 위한 여러가지 예상되는 행위들이 떠오릅니다.

 

이때, 이러한 예상되는 행위들이 하나하나가 독립변수라고 할 수 있습니다. 원인으로 고려되는 변수들인 것이죠.

 

<종속변수>


종속변수는 출력값(Y)이나 결과로 고려되는 변수로 독립변수에 의해 영향을 받는 변수를 말합니다.

설계자, 연구자가 독립변수의 변화에 따라 어떻게 변하는지 보고자 하는 변수가 되겠습니다. 

 

<독립변수>에서 저는 근육은 어떻게 하면 키우지? 라는 궁금증이 생겼습니다. 

 

그에 대한 독립변수로, 영양, 운동량, 영양제 보충, 세트 간의 휴식시간이라는 독립변수를 떠올렸습니다.

 

이는 결국 근육량 이라는 종속변수가 독립변수에 의해 어떻게 변하는지, 상관관계를 보고 싶었던 겁니다.

 

<독립변수와 종속변수의 관계>


결국 독립변수와 종속변수는 우리(연구자)가 궁금한 문제를 통계적인 모델로 세울 때 사용되는 변수라고 할 수 있습니다. 

이는, 두 변수는 인과 관계에 있다는 것을 정의를 통해 알 수 있고, 두 변수의 관계를 밟혀 내는 것이 우리의 최종적인 목적이라 할 수 있을 겁니다. 

 

결론적으로 독립변수와 종속변수는 인과 관계를 가지고 있습니다.

 


우리의 최종적인 목적은 궁금증 해결, 즉 두 변수간의 관계를 밝혀내야 하는 것이죠. 

 

어떻게?? 밝혀 낼지를 상관관계분석, 회귀분석을 통해 밝혀냅니다.

 

다음 포스트에서 이 두 방법에 대해 작성 하고자 합니다.


 

<독립변수와 종속변수을 부르는 여러 가지 용어>


독립변수 = 설명변수 = 예측변수 = 위험인자 = 공변량(데이터가 연속형 자료일 때) = 요인(데이터가 범주형 자료일 때)

 

종속변수 = 반응변수 = 결과변수 = 표적변수

 

 

<참고 자료>

https://drhongdatanote.tistory.com/14

 

[개념 통계 05] 독립변수와 종속변수는 무엇인가?

안녕하세요. 홍박사입니다. 오늘은 변수와 관련해 마지막 포스팅을 해보려고 합니다. 오늘 다룰 변수는 독립변수와 종속변수입니다. 사실상 독립변수와 종속변수는 중고등학교 과학 시간에도

drhongdatanote.tistory.com

 

https://ko.wikipedia.org/wiki/%EB%8F%85%EB%A6%BD%EB%B3%80%EC%88%98%EC%99%80_%EC%A2%85%EC%86%8D%EB%B3%80%EC%88%98

728x90
반응형

'통계' 카테고리의 다른 글

[통계] 상관분석? 회귀분석?  (1) 2022.02.14
2022-01-26 22:48:57
728x90
반응형

<Introduction>

이번 포스트에서는 지난 포스트에 이어 Roboflow에 대해 알아보고자 합니다.

Roboflow의 특징인 사용자가 가지고 있는 데이터를 업로드하여 annotation 할 수 있는 기능을 활용해보고자 합니다. 

 

 

<Roboflow 사용 준비>

Roboflow를 사용 하기 위한 내용은 앞선 포스트를 참고하시길 바랍니다. 

 

2022.01.20 - [AI Study] - [AI Study] Roboflow 탐험하기(1) - 시작, 무료 데이터셋 접근

 

[AI Study] Roboflow 탐험하기(1) - 시작, 무료 데이터셋 접근

Roboflow라는 서비스에 대해 알아보고자 합니다. 최근 인공지능의 object detection task를 공부하면서 알게 된 서비스입니다.   Roboflow는 컴퓨터 비전(Computer Vision) 기술을 이용해 다양한 애플리케이션

panython.tistory.com

반응형

 

<Roboflow 탐험하기 (2) - 사용자 데이터 업로드 >

사용자의 데이터 업로드부터 살펴보겠습니다. 회원 가입을 완료하시고, 자신의 대시보드로 들어가시면 아래의 화면을 확인하실 수 있습니다. 

 

여기서 "Create New Project"를 클릭해주시면 아래의 창을 확인 할 수 있습니다. 

 

사용자가 업로드 할 데이터들에 대한 프로젝트 내용을 기입합니다. 

 

첫 번째로 프로젝트 명을 기입합니다.

두 번째로 해당 데이터에 대한 라이선스를 선택해줍니다. 여러 가지가 있는데, 특별히 정해진 내용은 있는 거 같진 않네요..

세 번째로 업로드 할 데이터들의 목적입니다. 

마지막으로, 업로드할 데이터의 라벨을 작성합니다. ex) 업로드할 이미지가 자동차 일 경우, car와 같이 작성해주시면 됩니다. 

 

저는 캐글의 "Brain MRI Images for Brain Tumor Detection" 의 데이터를 업로드하고자 합니다. 

분류 문제의 데이터를 객체 검출을 해보고자 프로젝트의 목적은 "Object Detection"이 되겠네요. 

 

 

해당 내용에 대한 작성이 완료되면 아래의 화면을 통해서 데이터를 업로드 하시면 됩니다!

 

업로드가 완료되면 "우측 상단의 Finish Uploading"을 누르시면 아래의 창을 확인할 수 있습니다!

 

업로드 된 데이터를 Train/Valid/Test로 나누는 비율을 설정해줍니다!! 목적에 맞게 설정하시고 "Continue"를 누르십시오!

 

업로드 완료!!

 

 

<Roboflow 탐험하기 (2) - 사용자 데이터 Annotation 하기>

이제 원하는 데이터를 업로드 하였으니, 목적에 맞는 Annotation을 진행하면 됩니다!

저는 객체 검출을 목적으로 데이터를 업로드하였습니다. 업로드가 완료된 화면에서 한 장의 이미지를 선택해줍니다. 

그러면 아래의 창을 확인할 수 있습니다. 

 

 

그러고 목적에 맞는 bounding box를 설정하시면 됩니다!! 이게 작업입니다 ㅠㅠ

 

 

 

<Roboflow 탐험하기 (2) - Annotation 한 데이터 다운로드하기>

위 단계에서  Annotation을 완료하였다면, 이제 학습을 위해 Annotation이 된 데이터를 받아야 할 겁니다. 원하는 데이터들에 대해 작업이 완료되면 우측 상단의 "Generate New Version"을 클릭하시면 아래의 창을 보실 수 있습니다. 

 

이제 Annotation이 된 우리의 데이터를 받기 전에 아~~ 주 중요하고 좋은 기능이 여기서 확인할 수 있습니다. 

데이터를 출력 전에 "전처리"와 "데이터 증폭 (Data augmentation)을 설정해서 다운로드할 수 있습니다!!

 

필요에 따라 설정하시면 되는데, 하나하나 확인하시면 좋을 거 같습니다!!

 

<Preprocessing Options>

 

<Data Augmentation Options>

 

해당 옵션을 설정하고 최종적으로 마지막 단계인 "Generate"를 클릭해주시면 아래의 창을 확인할 수 있습니다!

 

 

 

"Export"를 누르시면 Annotation 형식 설정 후 다운로드하시면 됩니다!!

 

이상 Roboflow 탐험하기를 마치겠습니다. 대회나 실제 프로젝트하시면서, 부족한 데이터를 충원할 때 충분히 유용하게 사용되고 있으니 꼭 한번 사용하시면 좋을 거 같습니다!

 

또 여러 가지 비슷한 웹 툴이 있으면 공유해주시면 감사하겠습니다!

728x90
반응형
2022-01-21 00:19:05
728x90
반응형

<Introduction>

입력 이미지를 "상하좌우 대칭 변환 (Image Flip)"을 구현해 보고자 합니다.

opencv 라이브러리를 통해 간단하게 진행이 가능하지만, 전반적인 이미지 처리에 대한 이해를 다지고자 작성하였습니다. 

 

<Flip>

이미지 대칭 변환(Flip)은 2차원에서는 width 방향, height 방향에 대하여 반전이 가능합니다.

입력 이미지의 크기와 이미지 대칭 변환을 한 출력 이미지의 크기는 동일합니다. 

 

입력 이미지의 크기가 (w, h)일때, 입력 이미지 위의 좌표 (x, y)는 다음과 같은 수식의 형태로 결과 이미지에서 좌표 (x', y')에 매핑합니다. 

 

[상하 대칭 변환]

$$  x' = x $$

$$  y' = h -1 -y $$

 

[좌우 대칭 변환]

$$  x' = w -1 -x $$

$$  y' = y $$

 

<구현>

import cv2
import numpy as np
#Load image
img = cv2.imread('./../Image02.png')
height, width = img.shape[0], img.shape[1]
#Flip
output = np.zeros((height, width,3), dtype=np.uint8)

for x in range(height):
    for y in range(width):
        xp = height - x - 1       #상하 반전
        yp = width - y - 1        #좌우 반전
        output[x,y] = img[xp, y] #상하 반전
        # output[x, y] = img[x, yp] #좌우 반전

cv2.imwrite('./flip_implement.png', output)

 

 

728x90
반응형
2022-01-20 15:16:26
728x90
반응형

<Introduction>

Roboflow라는 서비스에 대해 알아보고자 합니다. 

최근 인공지능의 object detection task를 공부하면서 알게 된 서비스입니다. 

 

  Roboflow는 컴퓨터 비전(Computer Vision) 기술을 이용해 다양한 애플리케이션을 만들 수 있도록 지원해주는 서비스라고 소개합니다. 웹으로 구성되어 쉽게 사용이 가능하고, 주요한 특징은 무료 데이터셋을 제공하고, 사용자가 가지고 있는 데이터를 업로드하여 annotation을 할 수 있다는 점이 매력적입니다!!

 

추가적인 데이터를 학습할 대 bounding box를 잡는데 굉장히 용이하였습니다. 

아래 그림은 Roboflow가 제공하는 서비스들입니다.

 

 

<Roboflow 사용 준비>

Roboflow의 다양한 기능을 사용하기 전에 회원가입을 시작하여야 합니다. 아래의 링크를 통해 회원가입을 진행하세요.

 

https://roboflow.com/

 

Roboflow: Give your software the power to see objects in images and video

With just a few dozen example images, you can train a working, state-of-the-art computer vision model in less than 24 hours

roboflow.com

 

회원가입을 완료하시면 가격정책에 대해서 설정하라고 할 것입니다.

 

개인적으로 어노테이션을 작성하거나 무료데이터를 받는 수준에서는 무료 정책도 충분하다고 생각합니다!

 

 

 

<Roboflow 탐험하기 (1) - 무료 데이터셋 >

회원가입-가격정책을 정한 후에 보게되는 화면에서 좌측을 보시면 "public dataset"이라고 있습니다.

여기에 Roboflow가 제공하는 무료 데이터셋을 확인할 수 있습니다.

 

 

 

 

<Roboflow 탐험하기 (2) - 무료 데이터셋  다운받기>

이렇게 많은 무료 데이터를 제공한다는데 놀라웠습니다. 그런 후 사용을 해야겠죠.

예시로 원하는 데이터 셋을 눌러 들어가시면 데이터에 대한 설명들이 있습니다. 

 

그리고 원하는 데이터를 다운로드하기 위해 아래 그림과 같이 버튼을 누르시면 됩니다.

저는 "Cottontail-Rabbits" 데이터셋을 눌러보았습니다. 2009개의 이미지를 제공하네요.

 

 

 

위의 버튼을 누르면 아래의 화면을 보시게 될 것입니다! 주요 부분을 아래에 빨간색 박스로 표기해두었습니다. 

 

 

 

첫 번째로 해당 데이터셋이 지원하는 Annotation의 형식들을 보실 수 있습니다. 이는 차후에 다운로드할 때 실제로 지원하는 형식들을 선택하여 추출할 수 있습니다. 

 

두 번째로 데이터셋 구성입니다. 선택한 데이터셋의 Train/Vaild/Test data 구성을 보실 수 있습니다. 

제가 선택한 데이터셋의 경우, 2009장의 이미지 중 Train은 1980장, Vaild는 19장, Test는 10장으로 구성되어 있네요.

다운로드하고 원하시는 대로 다시 data split 하시는 게 좋을 듯합니다! 

 

세 번째로 Augmentation output입니다. 한 장의 이미지에 대해 augmentation 된 이미지를 몇 장 추출할지를 설정할 수 있습니다. 

즉, 30으로 설정 시 2009 x 30 장으로 총 60180장을 생성하여 다운로드할 수 있습니다. 

아래에 Augmentation을 어떻게 할 것인가 옵션을 정하실 수 있습니다. 

 

모든 게 정해지셨다면, 최종적으로 우측 상단에 "Download" 버튼을 누르시면 됩니다!

 

 

Format은 앞서 말씀드린 Annotation 형식입니다. 원하시는 형식으로 설정하시면 됩니다. 

 

두 번째로 다운을 받으실 때 로컬 저장소에 받으실 거라면 "download zip to computer"  하시면 되고, 웹에서 받으실 것이라면 "show download code" 누르시고 진행하시면 됩니다!!

 

 "show download code"는 "Colab"에서 테스트해볼 때 사용하는 걸 추천드립니다!!

 

다음 포스팅에서는 사용자의 데이터를 업로드하여 Annotation을 하는 방법을 담아볼 예정입니다. 

감사합니다.

 

728x90
반응형
2022-01-20 00:05:31
728x90
반응형

<Introduction>

입력 이미지를 특정 사이즈에 맞게 Scale 하는 과정을 python으로 직접 구현하고자 합니다. 

opencv 라이브러리를 통해 간단하게 진행이 가능하지만, 전반적인 이미지 처리에 대한 이해를 다지고자 작성하였습니다. 

 

<Scale(Scaling)>

이미지 스케일링(Scaling)은 입력 이미지를 특정 사이즈에 맞게 줄였다가, 늘렸다가 하여 이미지를 구성하는 이미지 처리방법입니다. 즉, 이미지를 확대, 축소하는 과정입니다. 

 

그렇다면, 입력 이미지 대비 출력 이미지(특정 사이즈)의 비율이 중요하게 되고 그 비율만큼 입력 이미지는 확대 및 축소를 하게 될 것입니다. 

 

잠깐 상상을 해봅시다. 입력 이미지가 100x100의 사이즈를 가지고 해당 이미지를 200x200으로 만들고자 합니다. 즉 확대한 이미지를 만들고자 합니다.

 

이때, 픽셀의 갯수는 4배가 증가할 것입니다. 그러면 1개인 픽셀이 4개가 되는데 그 나머지 3개의 픽셀은 어떻게 할 것인가?

 

opencv에서는 다양한 보간법 제공하여 처리합니다. 구현에서는 인접한 픽셀을 그대로 취하도록 하였습니다. 

 

앞서 예시에서 3개의 픽셀은 1개의 픽셀과 동일한 값을 가지고 옵니다. 

출처 https://www.geeksforgeeks.org/image-processing-without-opencv-python/

 

 

<구현>

import cv2
import numpy as np
from math import floor

#Load image
img = cv2.imread('./../Image01.png')
print(img.shape, img.dtype)
height = img.shape[0]
width = img.shape[1]

#Scale
target_size = (300, 300)  # target size
output = np.zeros((target_size[0], target_size[1], 3), np.uint8)

x_scale = height/output.shape[0]   #input image / output image
y_scale = width/output.shape[1]   #input image / output image

for y in range(output.shape[1]):
    for x in range(output.shape[0]):
        # the pixel at coordinate (x, y) in the new image is equal to the pixel that is located at coordinate (floor(x * x_ratio), floor(y * y_ratio)).
        # floor는 인접한 픽셀을 가져오기 위해서 사용
        xp, yp = floor(x* x_scale), floor(y * y_scale)
        print(xp, yp)
        print(x, y)
        output[x,y] = img[xp,yp]
cv2.imwrite('./scale.png', output)

 

 

<opencv>

# cv2.reize()로 이미지 확대 및 축소 (scale_resize.py)

import cv2
import numpy as np

img = cv2.imread('../Image01.png')
height, width = img.shape[:2]

target_size = (300,300)
scale_img = cv2.resize(img, (target_size[0], target_size[1]), \
                         interpolation=cv2.INTER_AREA)

cv2.imwrite('./scale_cv.png', scale_img)

resize 함수를 통하여 간단하게 구현이 가능하며, 보간법은 영상 축소 시 효과적인 INTER_AREA(Nearest Neigbour 계열)을 사용하였습니다. 

 

 

 

728x90
반응형
2022-01-19 14:22:52
728x90
반응형

 

<Introduction>

뉴럴 네트워크의 각각 뉴런에 들어오는 입력값의 총합을 출력값으로 변환하는 함수를 "활성화함수 (activation function)" 라고 합니다. 대개 활성화함수의 종류를 보면, "비선형함수"를 고집합니다. 이에 대한 이유를 간단히 정리하고자합니다. 

 

<출처> https://hwk0702.github.io/ml/dl/deep%20learning/2020/07/09/activation_function/

 

<NonLinearlity>

검색해본바에의해 활성화함수 종류만 찾아보아도, "비선형성"이라는 말이 기본적으로 확인 할 수 있었습니다. 그렇다면 왜 활성화 함수는 비선형성을 지녀야할까요?

 

'''

선형함수인 h(x)=cx 를 활성화함수로 사용한 3층 네트워크를 떠올려 보세요.

이를 식으로 나타내면 y(x)=h(h(h(x))) 가 됩니다. 이는 실은 y(x)=ax 와 똑같은 식입니다. a=c3 (c의 세제곱임) 이라고만 하면 끝이죠.

즉, 은닉층이 없는 네트워크로 표현할 수 있습니다. 뉴럴네트워크에서 층을 쌓는 혜택을 얻고 싶다면 활성화함수로는 반드시 비선형 함수를 사용해야 합니다.

'''

 

즉, 역전파 알고리즘에 의해 활성화함수의 미분값이 곱해지면서 계산되는데, 선형함수의 경우 상수값이 곱해지는 단일층과 다를게 없으므로, 은닉층을 가진 뉴럴네트워크를 만들기 위해서, 각 레이어의 뉴런들의 weight 값들이 갱신 되기 위해서는 "활성화함수는 비선형성을 지녀야한다"

 

728x90
반응형