기본 콘텐츠로 건너뛰기

10월, 2024의 게시물 표시

벡터와 행렬에 관련된 그림들

[ML]softmax와 분류(Classification)

softmax와 분류(Classification) 일반적인 분류 문제는 클래스 간의 순서는 의미를 담지 않습니다. 단지 분류만을 목적으로 하는 경우가 많습니다. 그러나 분석을 위해서는 이러한 데이터를 수치로 변환하여야 합니다. one-hot coding 은 이러한 목적에 부합합니다. 즉, 다음 표와 같이 샘플이 대응되는 클래스(카테고리)에 1 그렇지 않으면 0을 할당합니다. 예를들어 데이터의 라벨이 cat, dog, chicken의 세 카테고리로 구성되어 있다면 원-핫인코딩은 다음과 같이 나타낼 수 있습니다. cat dog chicken cat 1 0 0 dog 0 1 0 chicken 0 0 1 그러므로 라벨 y의 집합은 다음과 같이 나타낼 수 있습니다. y ∈ {(1,0,0), (0,1,0), (0,0,1)} 다음 그림은 regression과 classification의 신경망을 나타낸 것입니다. 위 그림은 4개의 feature를 가진 데이터에서 회귀(regression)는 한개의 출력, 분류(classfication)의 경우 3개의 출력을 가지는 경우입니다. 회귀의 경우 4개의 가중치를 가지지만 분류의 경우 각 feature에서 각 출력 카테고리에 대한 가중치를 가지므로 총 4 × 3 =12개의 가중치를 가집니다. 이를 수식으로 나타내면 다음과 같습니다. \begin{align} \hat{y}_1&=x_1w_{11}+x_2w_{12}+x_3w_{13}+x_4w_{14}+b_1\\\hat{y}_2&=x_1w_{21}+x_2w_{22}+x_3w_{23}+x_4w_{24}+b_2\\\hat{y}_3&=x_1w_{31}+x_2w_{32}+x_3w_{33}+x_4w_{34}+b_3\\ \tag{식 1}\begin{bmatrix}\hat{y}_1\\\hat{y}_2\\\hat{y}_3\end{bmatrix}&=...

[ML]비용함수: cross_entropy loss

비용함수: cross_entropy loss 한개의 특성(feture)과 3개의 클래스를 가진 라벨에 매핑시키는 모델을 생성합니다. 즉, 데이터는 다음의 구조를 가집니다. x y 1.5 0 $\vdots$ $\vdots$ 클래스 0, 1, 2를 각각 A, B, C로 나타내면 각각에 부여되는 가중치를 $w_A, w_B, w_C$로 표시하여 식 1과 같이 x에 대한 예측치를 계산할 수 있습니다. \begin{align}\tag{식 1}w_A \cdot x &= \hat{y}_A\\w_B \cdot x &= \hat{y}_B\\w_c \cdot x &= \hat{y}_C\end{align} 간단한 예로 다음의 경우에 대해서만 예측치를 계산해 봅니다. x=1.5, y=0 import numpy as np np.random.seed(3) W=np.random.rand(3) W array([0.5507979 , 0.70814782, 0.29090474]) x=1.5 y=0 haty=W*x haty array([0.82619685, 1.06222173, 0.43635711]) 위 haty는 x가 label의 각 클래스 A, B, C로 대응하기 위한 선형변환의 결과입니다. 위 값들이 [0, 1] 구간내에 포함하도록 정규화 할 수 있습니다. 이것은 특성이 A, B, C에 매핑될 확률로 간주할 수 있습니다. \begin{align}S(\hat{y_i})&=P_i\\\tag{식 2}&=\frac{e^{\hat{y_i}}}{\sum^k_{j=1}e^{\hat{y_i}}}\\ k:& \text{클래스 갯수} \end{align} 위 계산결과의 총합은 1이 됩니다. haty2=np.exp(haty) s1=haty2/np.sum(haty2) s1 array([0.33974648, 0.43018897, 0.23006455]) s1.sum().round(3) 1.0 위 결과 중 ...

[ML] 비용함수: hinge

손실함수(Loss function): hinge 통계적 분류 훈련에서 자주 사용되는 순실함수로서 특히 서포트 백터머신(SVM)에서 사용됩니다.학습데이터의 각 클래스의 범위를 구분하면서 데이터와의 가장 먼 결정경계를 찾는 역할을 수행합니다. 다음과 같이 정의 됩니다. $$\tag{식 1}\text{loss}=\text{max}\{0, 1-(\hat{y}\times y)\}$$ 다음 그림은 svm 모델에 의한 결정경계를 나타낸 것입니다. 위 그림의 svm 모델을 근거로 관측값 1에 대해 예측값의 영역은 다음과 같습니다. \begin{align}\tag{식 2}w^T+b \gt 1 \quad & \text{plus-plane 보다 위쪽}\\w^T+b \lt 1 \quad & \text{minus-plane 보다 아래쪽}\end{align} 그러므로 식 1에서 loss=0이 되기 위해서는 식 3과 같이 되어야 합니다. $$\tag{식 3}\hat{y}\times y=y(w^T+b) \ge 1$$ $\hat{y}\times y \le 1$은 위 그림의 plus-plane과 minus-plane 사이의 모든 공간이 margin내에 존재한다는 것을 의미합니다. 예측값이 magin내에 포함되면 손실(loss)이 0이되며 그 외부분에 존재하면 손실이 발생하도록 작성한 함수가 hinge 손실함수 입니다.

[pandas]데이터 간의 상관성(correlation) 찾기

데이터 간의 상관성(correlation) 찾기 데이터 간의 상관성을 분석합니다. 이 분석은 두개 이상 데이터들 사이의 상관성을 나타내는 것으로 인관관계를 나타내는 것은 아님을 주의해야 합니다. 다음은 yfinance 패키지를 적용하여 kospi 지수(kos), 원화-미달러(krw), 그리고 나스닥 지수(nsq)의 일일 종가자료를 호출하여 사용합니다. import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import yfinance as yf import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns %matplotlib inline fontdict={"fontsize":12, 'fontweight': "bold"} 호출한 자료들의 kos-kre, kos-nsq, 그리고 krw-nsq를 비교할 것으로 각 데이터간의 scale의 차이를 고려하여 모두 표준화하여 사용합니다. st=pd.Timestamp(2023, 10, 17) et=pd.Timestamp(2024, 10, 26) kos=yf.download("^KS11",st, et)["Close"] krw=yf.download("KRW=X", st, et)["Close"] nsq=yf.download("^IXIC", st, et)["Close"] data=pd.concat([kos, krw, nsq], axis=1, join="outer").dropna(...

[Pandas]rolling 통계량: 이동평균

rolling 통계량: 이동평균 날짜 또는 시간 차이에 따른 통계량을 계산하기 위해 pd.DataFrame 클래스이 메서드인 pd객체.rolling(widnow, …) 메서드를 적용합니다. 메서드의 인수 window 는 날짜 또는 시간 차이입니다. 이 메서드는 하위 메서드인 mean(), var(), min(), max() 등과 함께 사용합니다. 다음은 yfinance 패키지를 적용하여 kospi 지수의 일일자료를 호출하여 사용합니다. import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import yfinance as yf import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns %matplotlib inline fontdict={"fontsize":12, 'fontweight': "bold"} st=pd.Timestamp(2023, 10, 17) et=pd.Timestamp(2024, 10, 26) kos=yf.download("^KS11",st, et) kos=kos.drop('Adj Close', axis=1) kos.index=pd.DatetimeIndex(kos.index.date) kos.columns=kos.columns.levels[0][1:] kos.tail(3) Price Close High Low Open Volume 2024-10-23 ...

[Stock] MACD

MACD(Moving Average Convergence/Divergence) 이동평균선 대순환 분석은 매매 타이밍을 명확히 나타내지만 신호가 늦게 나타난다. 이러한 단점에 대응하기 위해 MACD 지표를 추가 한다. MACD는 이동평균 수렴/확산으로 번역되는 것으로 부터 알 수 있듯히 이평선의 일종이며 이들이 서로 붙거나 떨어짐을 의미한다. 즉, 두개의 이평선을 적용하는 것으로 다음과 같이 나타낼 수 있다. MACD = 단기이평 - 장기이평 (식 1) 그러므로 기간이 다른 이평선의 차이를 의미한다. 이 지수의 고안자인 제럴드 아펠은 단기 이평선으로 12일 EMA(Exponential Moving Average), 장기 이평선으로 26일 EMA를 사용헸다. 12EMA > 26EMA → MACD는 양수이며 그 값은 커짐, 상승추세 위 양수 MACD의 최대점 즉, 정점 후 감소 (peak out): 12EMA 감소, 26EMA 증가 12EMA = 26EMA → MACD=0, 12EMA와 26EMA의 데드크로스 발생 12EMA < 26EMA → MACD는 음수이며 그 값의 절대치는 커짐, 하락추세 위 음수 MACD 절대값의 최대점 후 증가: 12EMA 증가, 26EMA 감소 12EMA = 26EMA → MACD=0, 12EMA와 26EMA의 골든크로스 발생 위 순서는 이평선 대순환 분석에서 이평선의 위치관계 추세와 같은 형태를 나타내며 MACD에 의한 신호가 앞서서 표시됩니다. 지수이동평균(EMA) EMA = price(t) × α + EMA(y) × (1-α) price(t):오늘 가격 EMA(y): 어제의 EMA $\alpha=\frac{2}{span+1}$: smoothing factor smoothing factor인 α는 평활화하기 위한 기간(span)을 기...

[seaborn] 이변량 분포의 시각화

이변량 분포의 시각화 그래프를 작성하기 위해 kospi 지수의 일일자료를 호출하여 사용합니다. import numpy as np from sklearn.datasets import make_blobs import pandas as pd from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns import yfinance as yf from scipy import stats st=pd.Timestamp(2023, 10, 17) et=pd.Timestamp(2024, 10, 17) kos=yf.download("^KS11",st, et) kos=kos.drop('Adj Close', axis=1) kos.columns=kos.columns.levels[0][1:] scaler=StandardScaler().fit(kos) kos1=scaler.transform(kos) kos1df=pd.DataFrame(kos1) kos1df.columns=kos.columns kos1df['coChg']=pd.qcut(np.ravel((kos1df.Close-kos1df.Open)/kos1df.Open*100), 10, range(10)) kos1df['volChg']=pd.qcut(np.ravel(kos1df.Volume.pct_change()), 5, range(5)) kos1df=kos1df.dropna() kos1df.head(3) Price Close High Low Open Volume ...

[data analysis] 커널밀도추정(kernel density estimator)

커널밀도추정(kernel desity estimation) 내용 밀도추정(Density estimation) Histogram Kernel Density Estimation python을 적용한 kde의 계산 밀도추정(Density estimation) 확률, 통계에서 밀도(density)는 확률(probability)를 나타냅니다. 그러므로 밀도 추정은 관찰된 데이터에서 관찰치의 확률을 추정하는 것으로 밀도 함수의 추정치를 구성하는 것입니다. 즉, 다음 식과 같이 일정한 구간에 포함된 포인트의 개수(빈도수)나 면적등을 계산하는 것으로 관찰치의 밀도를 추정할 수 있습니다. $$\tag{식 1}P(a \lt x \lt b)=\int^b_a f(d) \,dx \quad \forall a\lt b$$ 식 1과 같이 추정치를 계산하기 위해서는 밀도함수인 f(x)를 알아야 합니다. 정규분포와 같이 기존의 분포함수를 가정하여 사용할 수 있습니다. 이러한 분포에 적용하기 위해서는 평균과 분산과 같이 모수를 가정할 수 있어야 합니다. 이러한 분석을 모수적 분석(parametic analysis)이라합니다. 반면에 모수를 가정할 수 없는 경우를 비모수 분석(nonparametic analysis)라고 하며 이 경우 커널 밀도 함수를 적용합니다. 특정한 밀도 함수의 가정없이 데이터의 분포에서 특정한 관찰치의 밀도를 계산하는 고전적이지만 자주 사용하는 방법으로 히스토그램이 있습니다. Histogram 빈도 히스토그램 형태로 데이터를 그룹화하는 것은 다양한 추정 절차의 기초에 내재되어 있는 고전적 방법론입니다. 유용한 시각적 정보를 제공하여 데이터 표현 장치로 사용되었지만 밀도 추정 방법으로서 비모수 통계에서 근본적인 역할을 했습니다. 기본적으로 히스토그램은 빈 높이로 정의되는 계단 함수로, 빈 높이란 각 빈에 포함된 관측치의 비율을 빈 너비로 나눈 값과 같습니다. 분포 함수 $F_x$로부터 랜덤변수 $X_1, \cdots, X_n$를...

[python] 날짜와 시간 다루기: datetime 패키지

날짜와 시간 다루기: datetime 패키지 내용 datetime 클래스 date 클래스 timedelta 클래스 datetime 패키지는 4개의 클래스로 구성됩니다. 표 1. datetime패키지의 클래스 클래스 내용 datetime() 날짜와 시간을 저장 date() 날짜만 저장 time() 시간만 저장 timedelta() 시간 구간의 정보를 저장 import datetime as dt datetime 클래스 datetime 클래스는 인스턴스 생성없이 적용할 수 있는 클래스메서드(Classmethod) 입니다. 이 클래스는 년, 월, 일, 시, 분, 초, 마이크로초등의 인수를 전달할 수 있으며 모두 정수입니다. dt.datetime(2024, 10, 25, 13, 20) datetime.datetime(2024, 10, 25, 13, 20) 이 클래스의 메소드 now() 는 실행시의 날짜와 시간을 반환합니다. a=dt.datetime.now() a datetime.datetime(2024, 10, 25, 18, 2, 12, 658796) 다음의 속성을 사용하여 결과를 분리하여 나타낼 수 있습니다. 표 2. datetime 클래스의 속성과 메서드 속성 내용 메서드 내용 year 연도 반환 weekday() 요일반환(0 ~ 6 &rarrr; 월 ~ 금) month 월 반환 strftime() 문자열 반환 day 일 반환 date() 날짜정보만 가지는 date 클래스 객체 반환 hour, minute 시, 분 반환 time() 시간 정보만 time 클래스 객체 반환 second, microsecond 초, 마이크로 초 반환 strptime() 문자열을 datetime 객체로 전환 a.year, a.month, a.day (2024, 10, 25) a.hour, a.minute, a.second, a...

[matplotlib] 산점도(scatter plot)

산점도(scatter plot) 2차원 그래프의 기본 구성은 한 축(x)에 대한 값들에 대응하는 다른 축(y)의 값들입니다. 산점도는 대응하는 위치마다 표시를 하는 것으로 다음 함수를 적용합니다. plt.scatter(x, y, s, c, marker, label) x, y: data s: 표시(marker)의 크기, x, y, c외에 다른 변수를 지정하여 그 변수에 따라 크기를 조절할 수 있음 c: 표시 색, x, y, s외에 다른 변수를 지정하여 그 변수에 따라 색을 조절할 수 있음 다양한 marker label: 범례 import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import yfinance as yf import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns %matplotlib inline matplotlib하에서 작성된 플롯이지만 seaborn에서 제공하는 플롯의 스타일을 사용할 수 있습니다. 위 코드 sns.set_style() 함수에 의해 이루어집니다. np.random.seed(1) data=np.random.randn(100, 2) plt.figure(figsize=(4,3)) plt.scatter(data[:,0], data[:,1], s=10, c="b", label="random") plt.xlabel("x", loc="right") plt.ylabel("y", loc="top...

[data analysis]Date 데이터의 조정

Date 데이터의 조정 내용 Date 클래스 날짜 문자(열)과 날짜 인덱스 일일 주가자료를 주중자료로 변환 시간 데이터 수열 생성 Date 클래스 날짜는 date 클래스를 사용하여 조정할 수 있습니다. 이 클래스는 year, month, day 의 속성을 가지고 있다. 또한 요일은 메소드 weekday() 에 의해 확인할 수 있으며 0 ~ 6 사이의 정수를 반환합니다. 각 수치는 다음과 같이 요일을 대표한다. 0:월요일, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일요일 오늘의 날짜를 나타내기 위해서는 today() 메소드를 사용합니다. import datetime import pandas as pd today=datetime.date.today() today datetime.date(2022, 3, 11) today.year 2022 today.month 3 today.day 11 today.weekday() 4 print(today) 2022-03-11 date.ctime() 은 날짜를 나타내는 문자열을 반환합니다 today.ctime() 'Fri Mar 11 00:00:00 2022' 날짜 문자(열)과 날짜 인덱스 다음과 같이 날짜 타입인 문자열인 경우 분석을 위해서는 date 형식으로 변환하여야 합니다. x="2010. 10. 11 오후 3:30:00" type(x) str x에서 '오후'를 제거하고 숫자 형식의 문자만을 date 형식으로 변환합니다. 이 변환은 str객체.replace() 메소드를 사용할 수 있습니다. 또한 문자열에서 특정부분만을 변환하기 위해서 str객체.split() 메소드를 사용할 수 있습니다. x="2010. 10. 11 오후 3:30:00" type(x) str x1=x.replace("오후", "") x1 '...

[matplotlib] plot()

plot() 함수 plt.plot(x, y) 함수에 x와 y 데이터를 입력하여 플롯을 작성합니다. 이 경우 y 값만을 제공하는 경우 y의 인덱스를 x값으로 인식합니다. 또한 함수에 의한 결과 역시 좌표의 값이 됩니다. import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import yfinance as yf import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns matplotlib하에서 작성된 플롯이지만 seaborn에서 제공하는 플롯의 스타일을 사용할 수 있습니다. 위 코드 sns.set_style() 함수에 의해 이루어집니다. np.random.RandomState(3) x=np.arange(20) y=np.random.standard_normal(20) plt.figure(figsize=(4,3)) plt.plot(x,y) plt.show() 다음 코드의 plt.subplots(rows, columns, figsize, gridspec_kw, …) 는 그림을 작성하는 프레임을 여러개의 하위그룹으로 구분하기 위한 함수입니다. 이 함수는 다양한 매개변수를 가질 수 있습니다. rows, columns는 전체 그림 프레임을 분리하기 위한 행과 열수를 지정, 다음 코드는 1행 2열로 2개의 하위 그림을 작성 전체 프레임의 이름 fig, 두 개의 하위 프레임은 각각 ax1, ax2로 지정 하위 그림 프레임은 인덱스를 사용하여 지정할 수도 있음 행 또는 열이 1개인 경우는 벡터로 고려되므로 인덱스는 [0], [1] 과 같이 1개로 표시 그러나 하위 프레...