수리물리 - 고유값 고유벡터
수리대기 수업 판서
참고문헌
Boas 수리물리
수리물리 - 고유값 고유벡터
수리대기 수업 판서
참고문헌
Boas 수리물리
본 수업은 수리대기과학 전자 판서 내용을 그대로 upload 한 것입니다. 강의를 듣지 않고 판서 내용만으로 충분히 이해하고 학습하기에는 부족할 수 있습니다.
전반부에 설명된 유체역학으로서의 대기과학을 이해하고 넘어가야 Boas 수리물리학의 각 장이 어떻게 대기과학(역학방정식)에 적용/응용되는지 이해할 수 있습니다.
유체역학 대기과학
차원
단위 (국제 단위 SI)
물리량의 유효숫자
질점운동
유체운동 (오일러리안, 라그랑지안 운동표현)
유체의 가속도
벡터 연산 (판서 일부 누락)
발산
회전
라플라시안
MS 가 윈도우에서 응용 앱끼리 데이터를 공유하고 제어할 수 있도록 개발한 기술인 OCX 방식으로 제공되는 API를 사용하려면, QAxWidget 클래스를 사용해야 하는데, 이 클래스는 파이썬 PyQt5 패키지에 포함되어 있습니다.
PyQt5는 윈도우 프로그램 개발 GUI 에 많이 사용하고 있습니다.
GUI를 구현하기 위해 PyQt5를 사용하지만, 윈도창을 생성하지 않고 API만을 사용하기 위해서도 PyQt5를 사용합니다. 즉, OCX 방식의 API를 제어하는 목적만으로 사용가능합니다.
PC 등에서 공개 데이터(기상, 대기질, 증권 등)를 수집하기 위해서는 각 서버의 API를 사용해야 합니다. 이때, API 개발 환경의 bit 수를 맞춰줘야 합니다. 즉, 윈도우 OS Anaconda 64bit 환경에서 32bit API를 다룰려고 하면 Error가 발생합니다. 따라서, 아래와 같이 32-bit 개발 환경으로 변경하여야 됩니다. 이 방법의 장점은 아래와 같습니다.
1. 32bit 윈도우를 재설치할 필요없이 64bit 윈도우에서 개발 환경 설정 가능
2. 32bit 아나콘다 재설치 필요없이 64bit 아나콘다에서 개발 환경 설정 가능
1. Anaconda Prompt 에서 아래 과정 수행
(base) C:\Users\chpark> conda --version
conda 4.12.0
(base) C:\Users\chpark> python --version
Python 3.9.12
(base) conda info
:
platform : win-64 로 확인됨.
:
2. 32bit 로 아나콘다 환경 변경
(base) C:\Users\chpark>set CONDA_FORCE_32BIT=1
위 명령을 수행하면 아무 반응이 없습니다. 주의할 점은 32BIT=1 사이에 공백이 없어야 합니다. set CONDA_FORCE_32BIT=0 를 입력하면 다시 64bit로 돌아옵니다. 아래와 같이 아나콘다 bit를 확인할 수 있습니다.
(base) conda info
:
platform : win-32 로 변경되었는지 확인
:
3. 32bit 개발을 위한 가상환경을 설정
(base) C:\Users\chpark>conda create -n py39_32 python=3.9.12 anaconda
(base) C:\Users\chpark>conda activate py38_32
(py39_32) C:\Users\chpark> conda info
아래 결과와 같이 platform : win-32 임이 확인되면 완성입니다.
32bit PyQt5를 설치하려면 위에서 생성된 가상환경 py39_32에서
(py39_32) C:\Users\chpark> pip install pyqt5
를 실행하면 됩니다.
PyCharm 등의 IDE에 위에서 생성한 가상환경을 연결하면 됩니다.
1. PyCharm 설치
2. 웹스크래핑과 판다스
import requests
from beautifulsoup4 import beautifulsoup
#url = "http://www.naver.com"
url = "https://finance.naver.com/item/main.nhm?code=000660"
html = requests.get(url).text # 웹페이지 주소를 requests 모듈의 get()메서드에 전달
soup = BeautifulSoup(html, "html5lib")
from bs4 import BeautifulSoup 실행시 오류나면, 아래와 같이 설치
(base) conda install bs4
11.1 개요 (1) 지면은 습하거나 건조한 정도에 따라 태양열을 받아들이는 정도가 다르므로 지면온도의 상승 등에 영향을 주어 상층대기 구조에도 영향을 미치게 된다. (2) 지면상태는 다음과 같이 WMO Code 0901과 0975에 의해 관측한다. 11.2 관측 (1) 지면이 눈 또는 측정 가능한 얼음으로 덮여 있지 않을 때 0. 지표면이 건조(지면에 균열이 없으며, 모래 먼지는 일어나지 않음) 1. 지표면이 습윤함 2. 지표면에 물이 고여 있음(지표면에 크고 작은 물웅덩이가 생김) 3. 지표면에 유수가 있음 4. 지표면이 얼어있음 5. 지표면이 빙막으로 덮여 있음 6. 지표면은 건조된 먼지 또는 모래로 덮여 있으나 완전히 덮여 있지는 않음 7. 지표면은 건조된 먼지 또는 모래로 얇게 완전히 덮여 있음 8. 지표면은 건조된 먼지 또는 모래로 보통 또는 두껍게 덮여 있음 9. 지표면이 대단히 건조하여 균열이 있음 ※ 숫자부호 0~2와 4는 대표적인 맨땅에 적용하고 3 또는 5~9는 광범위한 지역에 적용한다. (2) 지면이 눈 또는 측정 가능한 얼음으로 덮여 있을 때 10. 지표면이 얼음으로 거의 덮여 있음 11. 지표면의 1/2 미만이 다져진 눈 또는 습성눈(얼음의 유무에 관계없이) 으로 덮여 있음 12. 지표면의 1/2 이상이 다져진 눈 또는 습성눈(얼음의 유무에 관계없 이)으로 덮여 있으나 완전히 덮인 상태는 아님 13. 지표면은 다져진 눈 또는 습성눈으로 균일하게 완전히 덮인 상태 14. 지표면은 다져진 눈 또는 습성눈으로 불균일하게 완전히 덮인 상태 15. 지표면의 1/2 미만이 푸석푸석한 건성눈으로 덮인 상태 16. 지표면의 1/2 이상이 푸석푸석한 건성눈으로 불균일하게 덮인 상태 (완전히 덮인 상태는 아님)17. 지표면이 푸석푸석한 건성눈으로 균일하게 완전히 덮인 상태 18. 지표면이 푸석푸석한 건성눈으로 불균일하게 완전히 덮인 상태 19. 지표면이 눈으로 두껍게 완전히 덮인 상태 ※ 광범위한 지역에 적용한다. ※ 눈 이외의 고체상 강수를 포함한다
출처:
기상청 전자도서관 - 지상기상관측지침 - [33393_지상기상관측지침(2016.7).pdf] (kma.go.kr)
! File: solve_heat_diffusion_v1.f90
! Purpose: OOP implementation in Fortran of the ADE method of Barakat & Clark
! (1966), for solving the time-dependent heat-diffusion equation in 2D,
! with a linearly-varying temperature profile on the domain-boundaries.
!NOTES: - (for gfortran users): gfortran-4.8 still had no support for
! 'final'-methods, and an error will be raised by that version (or
! earlier) of that compiler; HOWEVER, the final-procedure can be safely
! removed in our case, since it is included for demonstration-purposes
! only (the arrays which it de-allocates are freed anyway by the runtime
! system, when the 'Solver'-instance goes out of scope). Comment
! corresponding line below, to disable use of this feature.
! - The file "config_file_formatted.in", containing the parameters for the
! solver, needs to be located in working directory.
! - Lines containing only comments with dots can be ignored (they just
! help with including code in TeX-files).
17 module NumericKinds
18 implicit none
! KINDs for different types of REALs
21 integer, parameter :: &
R_SP = selected_real_kind( 6, 37 ), &
R_DP = selected_real_kind( 15, 307 ), &
R_QP = selected_real_kind( 33, 4931 )
! Alias for precision that we use in the program (change this to any of the
! values 'R_SP', 'R_DP', or 'R_QP', to switch to another precision globally).
27 integer, parameter :: RK = R_DP ! if changing this, also change RK_FMT
! KINDs for different types of INTEGERs
30 integer, parameter :: &
I1B = selected_int_kind(2), & ! max = 127
I2B = selected_int_kind(4), & ! max ~ 3.28x10^4
I3B = selected_int_kind(9), & ! max ~ 2.15x10^9
I4B = selected_int_kind(18) ! max ~ 9.22x10^18
! Alias for integer-precision (analogue role to RK above).
36 integer, parameter :: IK = I3B
! Edit-descriptors for real-values
39 character(len=*), parameter :: R_SP_FMT = "f0.6", &
R_DP_FMT = "f0.15", R_QP_FMT = "f0.33"
! Alias for output-precision to use in the program (keep this in sync with RK)
42 character(len=*), parameter :: RK_FMT = R_DP_FMT
43 end module NumericKinds
45 module Config_class
46 use NumericKinds
47 implicit none
48 private
50 type, public :: Config
51 real(RK) :: mDiffusivity = 1.15E-6_RK, & ! sandstone
! NOTE: "physical" units here (Celsius)
mTempA = 100._RK, &
mTempB = 75._RK, &
mTempC = 50._RK, &
mTempD = 25._RK, &
mSideLength = 30._RK
58 integer(IK) :: mNx = 200 ! # of points for square side-length
59 end type Config
! Generic IFACE for user-defined CTOR
62 interface Config
63 module procedure createConfig
64 end interface Config
66 contains
67 type(Config) function createConfig( cfgFilePath )
68 character(len=*), intent(in) :: cfgFilePath
69 integer :: cfgFileID
70 open( newunit=cfgFileID, file=trim(cfgFilePath), status='old', action='read' )
! .....................................................
72 read(cfgFileID,*) createConfig%mTempA
73 read(cfgFileID,*) createConfig%mTempB
74 read(cfgFileID,*) createConfig%mTempC
75 read(cfgFileID,*) createConfig%mTempD
76 read(cfgFileID,*) createConfig%mNx
77 read(cfgFileID,*) createConfig%mDiffusivity
78 read(cfgFileID,*) createConfig%mSideLength
79 close(cfgFileID)
80 end function createConfig
81 end module Config_class
83 module Solver_class
84 use NumericKinds
85 use Config_class
86 implicit none
87 private
89 type, public :: Solver
90 private ! Hide internal-data from users.
91 type(Config) :: mConfig
92 real(RK) :: mNt, & ! # of iterations to simulate a characteristic time
mDx, mDt, mA, mB ! Configuration-dependent factors.
94 real(RK), allocatable, dimension(:,:) :: mU, mV ! main work-arrays
95 integer(IK) :: mNumItersMax, mCurrIter = 0
96 contains
97 private ! By default, hide methods (and expose as needed).
98 procedure, public :: init
99 procedure, public :: run
100 procedure, public :: writeAscii
101 procedure, public :: getTemp
! Internal methods (users don't need to know about these).
103 procedure :: advanceU
104 procedure :: advanceV
!final :: cleanup ! NOTE: may need to comment-out for gfortran!
106 end type Solver
108 contains
subroutine init( this, cfgFilePath, simTime ) ! initialization subroutine
110 class(Solver), intent(inout) :: this
111 character(len=*), intent(in) :: cfgFilePath
112 real(RK), intent(in) :: simTime
! .....................................................
114 integer(IK) :: nX, i, j
115 real(RK) :: lambda
117 this%mConfig = Config( cfgFilePath ) ! call component CTOR
118 nX = this%mConfig%mNx ! for making code below more compact
! conservative choice for N_t, to resolve transients -- see Barakat & Clark (1966)
120 this%mNt = nX**2
! evaluate derived parameter 'mLambda' in Solver, based on configuration
122 this%mNumItersMax = int( simTime*this%mNt )
123 this%mDx = 1. / nX
124 this%mDt = 1. / this%mNt
125 lambda = (2.*this%mDt) / (this%mDx**2)
126 this%mA = (1.-lambda)/(1.+lambda)
127 this%mB = lambda/(2.*(1.+lambda))
! allocate memory for internal arrays
129 allocate( this%mU(0:nX, 0:nX), this%mV(0:nX, 0:nX) )
! initialize mU-field:
! - set initial temperature everywhere...
132 this%mU = 1.
! - BUT re-write @ boundaries, for correct BCs
! -- North
135 this%mU(:, nX) = [ (1./3.*(i/real(nX, RK))+2./3., i=0,nX) ]
! -- West
137 this%mU(0, :) = [ (1./3.*(j/real(nX, RK))+1./3., j=0,nX) ]
! -- South
139 this%mU(:, 0) = [ (-1./3.*(i/real(nX, RK))+1./3., i=0,nX) ]
! -- East
141 this%mU(nX, :) = [ (j/real(nX, RK), j=0,nX) ]
! initialize mV-field (from mU-field)
143 this%mV = this%mU
144 end subroutine init
146 real(RK) function getTemp( this, i, j ) ! GETter for temperature
147 class(Solver), intent(in) :: this
148 integer(IK), intent(in) :: i, j
149 getTemp = 0.5*( this%mU(i,j) + this%mV(i,j) )
150 end function getTemp
subroutine run( this ) ! method for time-marching
153 class(Solver), intent(inout) :: this
154 integer(IK) :: k ! dummy index (time-marching)
156 do k=1, this%mNumItersMax ! MAIN loop
! simple progress-monitor
158 if( mod(k-1, (this%mNumItersMax-1)/10) == 0 ) then
159 write(*, '(i5,a)') nint((k*100.0)/this%mNumItersMax), "%"
160 end if
! defer work to private methods
162 call this%advanceU()
163 call this%advanceV()
164 this%mCurrIter = this%mCurrIter + 1 ! tracking time step
165 end do
166 end subroutine run
168 subroutine advanceU( this )
169 class(Solver), intent(inout) :: this
170 integer(IK) :: i, j ! local variables
! actual update for 'mU'-field (NE-ward)
172 do j=1, this%mConfig%mNx-1 ! do NOT update
173 do i=1, this%mConfig%mNx-1 ! boundaries
174 this%mU(i,j) = this%mA*this%mU(i,j) + this%mB*( &
this%mU(i-1,j) + this%mU(i+1,j) + this%mU(i,j-1) + this%mU(i,j+1) )
176 end do
177 end do
178 end subroutine advanceU
180 subroutine advanceV( this ) ! similar to 'advanceU'
181 class(Solver), intent(inout) :: this
! .....................................................
183 integer(IK) :: i, j ! local variables
! actual update for 'mV'-field (SW-ward)
185 do j=this%mConfig%mNx-1, 1, -1 ! do NOT update
186 do i=this%mConfig%mNx-1, 1, -1 ! boundaries
187 this%mV(i,j) = this%mA*this%mV(i,j) + this%mB*( &
this%mV(i-1,j) + this%mV(i+1,j) + this%mV(i,j-1) + this%mV(i,j+1) )
189 end do
190 end do
191 end subroutine advanceV
! method for producing a ASCII output file
194 subroutine writeAscii( this, outFilePath )
195 class(Solver), intent(in) :: this
196 character(len=*), intent(in) :: outFilePath
! .....................................................
198 integer(IK) :: x, y, outFileID ! local variables
200 open( newunit=outFileID, file=trim(outFilePath), status='replace', action='write' )
201 write(outFileID, '(a)') &
"# output file for program solve_heat_diffusion_v1.f90"
203 write(outFileID, '(a,2x,a)') '"s"', "# time unit"
204 write(outFileID, '(f0.8,2x,a)') &
(this%mCurrIter*this%mConfig%mSideLength**2)/ &
(this%mConfig%mDiffusivity*this%mNt), &
"# current time"
208 write(outFileID, '(a,2x,a)') '"m"', "# X unit"
209 write(outFileID, '(i0,2x,a)') this%mConfig%mNx, "# Nx"
210 write(outFileID, '(a,2x,a)') '"m"', "# Y unit"
211 write(outFileID, '(i0,2x,a)') this%mConfig%mNx, "# Ny"
212 write(outFileID, '(a,2x,a)') '"degree~C"', "# temperature unit"
! X-axis
214 do x=0, this%mConfig%mNx
215 write(outFileID, '(f0.8,2x)', advance='no') this%mDx*this%mConfig%mSideLength*x
216 end do
217 write(outFileID, '(a)') "# XVals"
! Y-axis
219 do y=0, this%mConfig%mNx
220 write(outFileID, '(f0.8,2x)', advance='no') this%mDx*this%mConfig%mSideLength*y
221 end do
222 write(outFileID, '(a)') "# YVals"
! simulation results
224 write(outFileID, '(a)') "# from next line to end: simulated temperature"
225 do y=0, this%mConfig%mNx
226 do x=0, this%mConfig%mNx
227 write(outFileID, '(f0.8,2x)', advance='no') &
this%mConfig%mTempD+this%getTemp(x,y)*(this%mConfig%mTempA-this%mConfig%mTempD)
229 end do
230 write(outFileID, *) ! newline to separate rows for R visualization script
231 end do
232 close(outFileID)
233 end subroutine writeAscii
! destructor method
236 subroutine cleanup( this )
! 'class' -> 'type' (dummy-arg cannot be polymorphic for final procedures)
238 type(Solver), intent(inout) :: this
! in this version, we only deallocate memory
240 deallocate( this%mU, this%mV )
241 end subroutine cleanup
242 end module Solver_class
program solve_heat_diffusion_v1
use NumericKinds
use Solver_class
247 implicit none
type(Solver) :: square
real(RK) :: simTime = 0.1 ! no. of characteristic time-intervals to simulate
252 character(len=200) :: configFile = "config_file_formatted.in", &
outputFile = "simulation_final_temp_field.dat"
255 call square%init( configFile, simTime ) ! call Initializer
256 call square%run()
258 call square%writeAscii( outputFile )
pause
259 end program solve_heat_diffusion_v1
10대 자녀가 반항을 하면
그건 아이가 거리에서 방황하지 않고 집에 잘 있다는 것이고...
지불해야할 세금이 있다면 그건 나에게 직장이 있다는 것이고...
파티를 하고나서 치워야 할게 너무 많다면
그건 친구들과 즐거운 시간을 보냈다는 것이고...
옷이 몸에 좀 낀다면
그건 잘먹고 잘살고 있다는 것이고...
깍아야할 잔디, 닦아야할 유리창, 고쳐야 할 하수구가 있다면 그건 나에게 집이 있다는 것이고..
정부에 대한 불평불만의 소리가 많이 들리면
그건 언론의 자유가 있다는 것이고...
주차장 맨끝 먼곳에 겨우 자리가 하나 있다면
그건 내가 걸을 수 있는데다 차두 있다는 것이고...
난방비가 너무 많이 나왔다면
그건 내가 따뜻하게 살고 있다는 것이고...
교회에서 뒷자리 아줌마의 엉터리 성가가 영 거슬린다면...
그건 내가 들을 수 있다는 것이고...
세탁하고 다림질해야 할 일이 산더미라면
그건 나에게 입을 옷이 많다는 것이고...
온몸이 뻐근하고 피로하다면
그건 내가 열심히 일했다는 것이고...
이른 새벽 시끄런운 자명종 소리에 깼다면
그건 내가 살아있다는 것이고..
그리고...,
마음속에 나도 모르게 일궈진 불평, 불만들
바꾸어 생각해 보면 또 감사한 일이라는 것을...
엄마는
그래도 되는 줄 알았습니다.
하루종일 밭에서 죽어라 힘들게 일해도
엄마는 그래도 되는 줄 알았습니다.
찬밥 한 덩이로 대충 부뚜막에 앉아 점심을 때워도
엄마는 그래도 되는 줄 알았습니다.
한겨울 냇물에 맨손으로 빨래를 방망이질해도
엄마는 그래도 되는 줄 알았습니다.
배부르다, 생각 없다, 식구들 다 먹이고 굶어도
엄마는 그래도 되는 줄 알았습니다.
발뒤꿈치 다 헤져 이불이 소리를 내도
엄마는 그래도 되는 줄 알았습니다.
손톱이 깎을 수조차 없이 닳고 문드러져도
엄마는 그래도 되는 줄 알았습니다.
아버지가 화내고 자식들이 속썩여도 끄떡없는
엄마는 그래도 되는 줄 알았습니다.
외할머니 보고싶다, 그것이 그냥 넋두리인 줄만알았던...
한밤중 자다 깨어 방구석에서 한없이 소리 죽여 울던
엄마를 본 후론
그
아! 엄마는 그러면 안 되는 것이었습니다.
어머니 ! 사랑합니다!....
아버지란 기분이 좋을 때 헛기침을 하고,
겁이 날 때 너털웃음을 웃는 사람이다.
아버지란 자기가 기대한 만큼 아들, 딸의
학교 성적이 좋지 않을 때 겉으로는,
'괜찮아, 괜찮아' 하지만
속으로는 몹시 화가 나는 사람이다.
아버지의 마음은 먹칠을 한 유리로 되어 있다.
그래서 잘 깨지기도 하지만,
속은 잘 보이지 않는다.
아버지란 울 장소가 없기에 슬픈 사람이다.
아버지가 아침 식탁에서 성급하게 일어나서 나가는
장소(그 곳을 직장이라고 한다)는,
즐거운 일만 기다리고 있는 곳은 아니다.
아버지는 머리가 셋 달린 龍과 싸우러 나간다.
그것은 피로와, 끝없는 일과, 직장 상사에게서 받는 스트레스다.
아버지란 '내가 아버지 노릇을 제대로 하고 있나?
내가 정말 아버지다운가?'하는 자책을 날마다 하는 사람이다.
아버지란 자식을 결혼시킬 때 한없이 울면서도
얼굴에는 웃음을 나타내는 사람이다.
아들, 딸이 밤늦게 돌아올 때에 어머니는 열 번
걱정하는 말을 하지만, 아버지는 열 번 현관을 쳐다본다.
아버지의 최고의 자랑은 자식들이 남의 칭찬을 받을 때이다.
아버지가 가장 꺼림칙하게 생각하는 속담이 있다.
그것은 "가장 좋은 교훈은 손수 모범을 보이는
것이다"라는 속담이다.
아버지는 늘 자식들에게 그럴 듯한 교훈을 하면서도,
실제 자신이 모범을 보이지 못하기 때문에,
이 점에 있어서는 미안하게 생각도 하고 남모르는 콤플렉스도 가지고 있다.
아버지는 이중적인 태도를 곧잘 취한다.
그 이유는 '아들, 딸들이 나를 닮아 주었으면'하고 생각하면서도,
'나를 닮지 않아 주었으면'하는 생각을 동시에 하기 때문이다.
아버지에 대한 인상은 나이에 따라 달라진다.
그러나 그대가 지금 몇 살이든지, 아버지에 대한
현재의 생각이 최종적이라고 생각하지 말라.
일반적으로 나이에 따라 변하는 아버지의 인상은,
4세때--아빠는 무엇이나 할 수 있다.
7세때--아빠는 아는 것이 정말 많다.
8세때--아빠와 선생님 중 누가 더 높을까?
12세때-아빠는 모르는 것이 많아.
14세때-우리 아버지요? 세대 차이가 나요.
25! 세때-아버지를 이해하지만, 기성세대
아버지란 돌아가신 뒤에도,
두고두고 그 말씀이 생각나는 사람이다.
아버지란 돌아가신 後에야 보고 싶은 사람이다.
아버지는 결코 무관심한 사람이 아니다.
아버지가 무관심한 것처럼 보이는 것은, 체면과
자존심과 미안함 같은 것이 어우러져서 그 마음을
쉽게 나타내지 못하기 때문이다.
아버지의 웃음은 어머니의 웃음의 2배쯤 농도가 진하다.
울음은 열 배쯤 될 것이다.
아들, 딸들은 아버지의 수입이 적은 것이나,
아버지의 지위가 높지 못한 것에 대해 불만이
있지만, 아버지는 그런 마음에 속으로만 운다.
아버지는 가정에서 어른인 체를 해야 하지만,
친한 친구나 맘이 통하는 사람을 만나면 소년이 된다.
아버지는 어머니 앞에서는 기도도 안 하지만,
혼자 車를 운전하면서는 큰소리로 기도도 하고
주문을 외기도 하는 사람이다.
어머니의 가슴은 봄과 여름을 왔다갔다하지만,
아버지의 가슴은 가을과 겨울을 오고간다.
아버지! 뒷동산의 바위 같은 이름이다.
시골마을의 느티나무 같은 크나 큰 이름이다..
1. 정확도
실제와 에측이 얼마나 일치하는가로 모델의 성능을 평가함
연속형 자료의 경우
예측값의 일치도를 의미.
정확도가 평가의 대부분임
범주형 자료의 경우
예측 범주의 일치정도를 의미.
정확도 뿐 아니라 그 이면을 세세하게 검토해야 함.
2. 오차행렬(confusion matrix)
오차 행렬은 이진 또는 다중 범주형 레이블의 하위 범주는 세부적으로 살펴보면서 실제 범주와 예측 범주의 일치 혹은 오류를 파악할 수 있는 결과임
0 | 1 | |
0 | 90 | 10 |
1 | 20 | 80 |
음성예측 | 양성예측 | |
음성 클래스 | TN | FP |
양성 클래스 | FN | TP |
정확도 = (90+80)/200 = 85%
이진 분류의 평가 지표
3. 정밀도
양성 예측의 정확도를 의미
4. 재현율
분류기가 정확하게 예측한 양성 샘플의 비율
민감도 또는 진짜 양성 비율이라고도 함.
암진단/범죄여부/불법영상 진단 등
5. f-score
정밀도와 재현율의 조화평균으로 두 지표를 종합적으로 파악
정밀도 = TP/(TP + FP)
재현율 = TP/(TP+FN)
f-score = 2/((1/정밀도) + (1/재현율))
다양한 의사결정 결로와 결과를 놓고 나무 구조를 이용하여 설명하는 것
질문을 던지면서 대상에 접근해 가는 스무고개 놀이와 유사
질문은 조건을 이분법적으로 제시하면서 진행한다.
지도학습 기법으로서 변수의 영역을 게속적으로 분할해 나가면서 집단을 몇개의 소집단으로 분류하거나 예측하는 기법
맨 위쪽에 뿌리 노드로 시작해서 아래로 가면서 가지를 치고 마지막까지 진행한다.
처음에 어떤 분류기준을 선택할 것인가를 결정하는 것은 여러 알고리즘이 있다.
예를 들어, 프로 야구선수중에서 자유게약 선수(Free Agaent: FA)의 연봉을 의사결정 나무로 간단히 그려보자.
의사결저과정에서 나무를 가지고 목표와상황과 상호 관련성을 나타내어 최종 결정을 내린다. 의사결정 규칙을 나물 구조로 도식화 하여 관심대상의 집단을 몇 개의 소집단으로 분류하거나 예측할 수 있다.
if-else 원리로 코딩할 수 있다.
일반적으로 기업에서 의사결정을 내릴때, 어떠한 위험(손실)과 기회(이익)가 있는지 판단하여 최적의 의사결정을 도와주는 프로그램으로 많이 활용한다.
나무 모형 구축: 분석 목적과 자료구조에 따라 적절한 분리기준과 정지규칙을 정하여 나무를 만들어 나간다.
가지치기 : 분류 오류를 크게 할 위험이 높거나 부적절한 추론규칙이 내재된 가지는 제거한다.
분리작업: 더 이상 유효하지 않거나 최소 노드수에 도달할 때까지 분리를 계속한다.
타당성 평가: 이익 또는 위험 도표나 검정자료를 이용하여 나무 모형의 교차 타당성을 평가한다.
해석과 예측: 결과를 해석하고 예측을 수행한다.
시각적인 효과는 행동의 결정 뿐만 아니라 미래의 계획을 세우는 데도 유용하게 사용될 수 있다.
그래서 의사결정나무를 적합성나무(relevance tree)라고도 부른다.
https://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/
Avoid Overfitting By Early Stopping With XGBoost In Python
Overfitting is a problem with sophisticated non-linear learning algorithms like gradient boosting. In this post you will discover how you can use early stopping to limit overfitting with XGBoost in Python. After reading this post, you will know: About earl
machinelearningmastery.com