SyntaxHighlighter.all();

1. 최댓값 찾기

최댓값 구하기 알고리즘 : 리스트 a에서 가장 큰 값 구하기

1) 리스트

    리스트 : 정보 여러 개를 하나로 묶어 저장하고 관리할 수 있는 기능

a = [1,2,3]
함수 설명
len(a) 리스트 길이 구하기 len(a)             #3
append(x) x를 맨 뒤에 삽입 a.append(4)       # a = [1,2,3,4]
insert(i,x) i위치에 x추가 a.insert(0,0)       # a = [0,1,2,3]
pop(i) i번째 빼기, 빈칸시 마지막값 빼기 a.pop()             # a = [1,2]
clear() 모두 지우기  a.clear()            # a = []
x in a x가 리스트 a에 존재하는지 확인 2 in a            # True

 

2) 최댓값 구하기 알고리즘

1
2
3
4
5
6
7
8
9
10
11
12
13
#첫번째 값 기억
#두번째 값과 비교하여 큰 수 저장
 
def find_max(a):
    max = a[0]
    for i in range(1,len(a)):
        if a[i] > max:
            max=a[i]
    return max
 
= [17,92,18,33,58]
print(find_max(a))
 
cs

 

3) 알고리즘 분석

    시간복잡도 = O(n)

 

 

2. 동명이인 찾기

동명이인 찾기 알고리즘 : n명의 사람 중 같은 이름 찾아 집합으로 만들기

1) 집합

    집합 : 정보를 여러 개 넣어서 보관가능, 리스트와 다르게 중복허용하지 않고 순서가 없음

s = set()
s = {1,2,3}
함수 설명
len(s) 집합의 길이 구하기 len(s)             #3
add(x) 집합에 x 추가 s.add(4)          # s= {1,2,3,4}
discard(x) x가 있으면 x 삭제 s.discard(2)     # s = {1,3}
clear() 모두 지우기 s.clear()          # s = {}
x in s x가 집합 s에 존재하는지 확인 3 in s            #True

 

2) 동명이인 찾는 알고리즘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#첫번째 for문은 0~ n-1까지(마지막꺼는 안보기)
#두번째 for문은 끝까지 보기
#중복된 이름은 result에 넣기
 
def find_samename(a):
    result = set()
    for i in range(0,len(a)-1):
        for j in range(i+1,len(a)):
            if a[i]==a[j]:
                result.add(a[i])
    
    return result
 
= ["A","B","C","A","B"]
print(find_samename(a))
cs

 

3) 알고리즘 분석

    시간복잡도 = O(n^2)

 

 


연습문제

3-1. 두 명씩 짝

1
2
3
4
5
6
7
8
9
10
def test_3_1(a):
    result = set()
    for i in range(0,len(a)-1):
        for j in range(i+1,len(a)):
            print(a[i],"-",a[j])
    
    return result
 
= ["A","B","C"]
print(test_3_1(a))
cs

 

3-2. 시간복잡도 문제

A. 1

B. n

C. n^2

D. n^4

 

 

'컴퓨터 과학 > 알고리즘' 카테고리의 다른 글

[알고리즘] 5. 정렬  (1) 2020.06.22
[알고리즘] 4. 탐색  (0) 2020.06.22
[알고리즘] 3. 재귀 호출  (0) 2020.06.22
[알고리즘] 1. 알고리즘이란  (0) 2020.06.09

1. 파일 읽기

HDFS로부터 데이터를 읽고 있는 클라이언트, 하둡완벽가이드

위의 그림은 클라이언트가 HDFS, 네임노드, 데이터노드와 상호작용하는 것을 보여준 것이다.

                                                     FSDataInputStream - 파일 탐색을 지원하는 입력 스트림

1. 열기

     클라이언트는 HDFS가 DistributedFileSystem 인스턴스인 FileSystem 객체의 open() 메서드를 호출하여 파일을 연다

 

2. 블록 위치 얻기

      DistributedFileSystem은 파일의 첫 번째 블록 위치를 파악하기 위해 RPC를 사용하여 네임노드를 호출

      이때, 클러스터의 네트워크 위상에 따라 클라이언트와 가까운 순으로 데이터 정렬됨

            (클라이언트 자체가 데이터노드고 해당 블록의 복제본 소유시 클라이언트는 로컬 데이터노드에서 데이터 읽음)

      DistributedFileSystem은 클라이언트가 데이터를 읽을 수 있도록 FSDataInputStream을 반환

 

3. 읽기

      FSDataInputStream은 데이터노드와 네임노드의 I/O를 관리하는 DFSInputStream을 래핑

      클라이언트는 스트림을 읽기위해 read() 메서드 호출

 

4~5. 블록 읽기

    파일의 첫번째 블록의 데이터노드 주소를 저장하고 있는 DFSInputStream은 가장 가까운 데이터노드와 연결

    해당 스트림에 대해 read() 메서드를 반복적으로 호출하면 데이터노드에서 클라이언트로 모든 데이터 전송됨

    블록의 끝에 도달하면 DFSInputStream은 데이터노드의 연결을 닫고 다음 블록의 데이터노드를 찾음

 

-> 새로운 블록 읽을 때 마다 DFSInputStream은 데이터노드와 새로 연결함

    클라이언트는 다음 블록의 데이터노드 위치를 얻기 위해 네임노드를 호출 => 2~(4,5) 반복

 

6. 닫기

    모든 블록을 읽었으면 FSDataInputStream의 close() 메서드 호출

 

* 장애 발생시!!!!

  DFSInputStream은 해당 블록을 저장하고 있는 다른 데이터노드와 연결 시도
  이후 블록에 대한 블필요한 재시도 방지하기위해 장애 발생한 데이터 노드 기억
          -> DFSInputStream은 데이터노드로부터 전송된 데이터의 체크섬 검증,
              블록 손상시 다른 데이터노드에 있는 블록 복제본 읽으려함, 손상된 블록정보는 네임노드에 보고됨

 

=> 핵심! 클라이언트는 데이터를 얻기위해 데이터노드에 직접적으로 접촉,

            네임노드는 각 블록의 적합한 데이터노드를 안내

 

 

 

 

 

2. 파일 쓰기

데이터를 HDFS로 쓰고 있는 클라이언트

파일생성 -> 데이터입력 -> 파일닫기

1. 생성

    클라이언트는 DistributedFileSystem의 create()를 호출하여 파일 생성

 

2. 생성

    DistributedFileSystem은 파일시스템의 네임스페이스에 새로운 파일 생성하기 위해 네임노드에 RPC요청을 보냄

    블록에 대한 정보 보내지 않음

   네임노드는 요청한 파일과 동일한 파일이 존재하는지, 클라이언트가 파일을 생성할 권한이 있는지 등 검사를 수행

             -> 검사통과시 네임노드는 새로운 파일의 레코드 생성,

                 검사실패시 파일 생성 실패, 클라이언트의 IOException이 발생

  DistributedFileSystem은 클라이언트가 데이터를 읽을 수 있도록 FSDataOutputStream을 반환

 

3. 쓰기

    FSDataOutputStream은 데이터노드와 네임노드의 I/O를 관리하는 DFSOutputStream을 래핑

    클라이언트가 데이터를 쓰면 DFSOutputStream이 일함!

 

4. 패킷쓰기

    (1) 클라이언트가 데이터를 쓰면(3단계) DFSOutputStream은 데이터를 패킷으로 분리하고,

       데이터 큐(내부 큐)로 패킷을 보냄

    (2) DataStreamer는 데이터 큐에 있는 패킷을 처리

    (3) 네임노드에 복제본을 저장할 데이터노드의 목록 요청

          -> 데이터노드 목록에 포함된 노드는 파이프라인 형성 (목록의 개수 = 파이프라인 속 노드 개수)

    (4) DataStreamer는 파이프라인의 첫 번째 데이터노드로 패킷전송

    (5) 첫 번째 데이터노드는 각 패킷을 저장한 후 파이프라인의 두 번째 데이터노드로 보냄

    (6) 쭉쭉쭉 마지막노드까지 보냄

 

5. ack패킷

    DFSOutputStream은 데이터노드의 승인 여부를 기다리는 ack 큐(내부 패킷 큐)를 유지함

    ack 큐에 있는 패킷은 파이프라인의 모든 데이터노드로부터 ack 응답을 받아야 제거됨

 

6. 닫기

    데이터 쓰기를 완료할 때 클라이언트는 스트임에 close() 메서드를 호출

    close()메서드 : 데이터노드 파이프라인에 남아 있는 모든 패킷을 플러시하고 승인이 나기를 기다림

 

7. 완료

    모든 패킷이 완전히 전송되면 네임노드에 '파일완료' 신호를 보냄

        (네임노드는 DataStreamer를 통해 블록 할당 요청을 받았기 때문에

          파일의 블록 구성을 알고있으며, 최소한의 블록 복제가 완료되면 최종적으로 성공 신호 반환)

 

* 장애 발생시!!!!   => 장애복구작업
    
     (1) 파이프라인이 닫힘
     (2) ack 큐에 있는 모든 패킷은 데이터 큐 앞 쪽에 다시 추가
              -> 다운스트림노드가 실패해도 패킷 유실 안됨
     (3) 정상 데이터노드는 네임노드로부터 새로운 ID 다시 받음
     (4) 장애 데이터노드는 파이프라인에서 제거, 정상인 나머지 데이터노드로 새로운 파이프라인 구성
               -> 네임노드는 해당 블록이 불완전 복제라는 것을 인식하고 있으므로
                   나중에 다른 노드에 복제본이 생성되도록 조치

    

    - 장애 발생 데이터노드가 나중에 다시 복구되면 불완전한 블록은 삭제됨

 

 

3. 병렬복사 (distcp)

위의 내용은 단일-스레드 접근

distcp : 병렬로 다량의 데이터를 하둡파일시스템으로 복사하기 위한 프로그램

          hadoop fs -cp 대체..

 

1) HDFS 클러스터 균형 유지

   - 데이터를 HDFS로 복사할 때는 클러스터의 균형을 고려

           -> HDFS는 클러스터 전반에 걸쳐 파일 블록이 고르게 분산되었을 때 가장 잘 동작하기 때문에 

 

'빅데이터 > 하둡' 카테고리의 다른 글

[하둡] 7. YARN- 맵리듀스 1과의 차이  (0) 2020.07.01
[하둡] 6. YARN  (0) 2020.06.29
[하둡] 3. HDFS (하둡 분산 파일시스템) - 설계 및 개념  (0) 2020.06.19
[하둡] 2. 맵리듀스  (1) 2020.06.18
[하둡] 1. 하둡  (1) 2020.05.25

HDFS : 범용 하드웨어로 구성된 클러스터에서 실행되고

         스트리밍 방식의 데이터 접근 패턴으로 대용량 파일을 다룰 수 있도록 설계된 파일 시스템

         특징 - 매우 큰 파일

                - 스트리밍 방식의 데이터 접근

                - 범용 하드웨어

 

1. HDFS 개념 - 블록

1) HDFS의 블록   

   - 블록 크기 : 한번에 읽고 쓸 수 있는 데이터의 최대량 (HDFS의 블록의 크기 = 128MB)

   - HDFS의 파일은 특정 블록 크기의 청크로 쪼개지고, 각 청크는 독립적으로 저장됨

 

2) HDFS 블록의 특징

   - HDFS의 블록은 데이터가 블록크기보다 작은 데이터일 경우 전체 블록크기에 해당하는 하위 디스크 모두 점유X

                     (보통은 모두 점유)

          -> ex) 블록 128MB, 데이터 1MB인 경우 1MB의 디스크만 사용

   - 블록은 내고장성, 가용성을 제공하는 데 필요한 복제 구현시 편함

   - 블록 추상화의 장점 : > 파일 하나의 크기가 단일 디스크의 용량보다 더 커질 수 있음

                                > 파일단위보다는 블록단위로 추상화를 하면 스토리지의 서브시스템을 단순하게 만들 수 있음

 

1. HDFS 개념 - 네임노드와 데이터노드

HDFS 클러스터는 네임노드-데이터노드로 구성되어 있음

1) 네임노드

   - 파일시스템의 네임스페이스를 관리

   - 파일시스템 트리와 그 트리에 포함된 모든 파일과 디렉터리에 대한 메타데이터 유지

   - 파일에 속한 모든 블록이 어느 데이터노드에 있는지 파악

   - 파일시스템의 모든 파일과 각 블록에 대한 참조 정보를 메모리에서 관리

 

2) HDFS 클라이언트

   - 사용자를 대신해서 네임노드와 데이터노드 사이에서 통신하고 파일시스템에 접근

 

3) 데이터노드 (실질적 일꾼)

    - 디스크에 저장된 블록을 읽음

    - 클라이언트나 네임노드의 요청이 있을 때 블록을 저장하고 탐색하며,

      저장하고 있는 블록의 목록을 주기적으로 네임노드에 보고함

 

4) 네임노드의 장애복구 기능 (두가지 방법)

    첫번째, 파일 시스템의 메타데이터를 지속적인 상태로 보존하기 위해 파일로 백업

    두번째, 보조 네임노드 운영 ( 보조 네임노드는 주 네임노드와 조금 다르게 동작함 )

   

* 보조 네임노드

   역할  - 에디트 로그가 너무 커지지 않도록 주기적으로 네임스페이스 이미지를 에디트 로그와 병합하여

                새로운 네임스페이스 이미지를 만드는 것

           - 주 네임노드에 장애가 발생할 것을 대비하여 네임스페이스 이미지의 복제본을 보관함

             ( 복제본에 대한 시간차 문제는 추후에 다룰 예정)

   필요 스펙 : 병합작업 수행을 위해 보조네임노드는 충분한 CPU, 큰 메모리(네임노드와 비슷한 용량)

 

 

2. HDFS 개념 - 블록캐싱

   블록캐시 : 빈번하게 접근하는 블록파일을 '오프-힙 블록캐시'라는 데이터 노드 메모리에 캐싱할 수 있음 

   캐시 풀- 캐시지시자 : 이것을 추가하면 특정파일을 캐싱하도록 명령할 수 있음

                               캐시풀 - 캐시 권한이나 자원의 용도를 관리하는 관리 그룹의 역할을 함

 

 

3. HDFS 개념 - HDFS 페더레이션(연합체)

  - 네임노드의 메모리 확장성을 위해 HDFS 페더레이션을 활용

  - 각각의 네임노드가 파일시스템의 네임스페이스 일부를 나누어 관리하는 방식, 새로운 네임노드 추가 가능

          ex) A네임노드는 '/user' 하위 디렉터리 관리, B네임노드는 '/share' 하위 디렉터리 관리

  - 각 네임노드는 네임스페이스 불륨블록 풀을 관리

  네임스페이스 볼륨 블록 풀
역할 네임스페이스의 메타데이터 구성  네임스페이스에 포함된 파일의 전체 블록을 보관
특징 서로 독립적
-> 네임노드는 서로 통신할 필요 X
-> 특정 네임노드에 장애 발생시
다른 네임노드의 다른 네임스페이스 가용성에 영향X 
저장소 독립적이지 않음
-> 모든 데이터노드는 클러스터의
    각 네임노드마다 등록됨
-> 여러 블록 풀로부터 블록을 저장

 

 

4. HDFS 개념 - HDFS 고가용성

1) 고가용성

활성대기 상태로 설정된 한 쌍의 네임노드로 구현됨, 활성 네임노드에 장애 발생시 대기 네임노드가 역할을 대신함

고가용성을 위한 HDFS 변경 사항
1. 네임노드는 에디트 로그를 공유하기 위해 고가용성 공유 스토리지를 반드시 사용해야 함
      - 대기 네임노드가 활성화 시 1) 기존활성 네임노드의 상태를 동기화하기 위해 공유 에디트 로그를 읽음
                                            2) 활성 네임 노드에 새로 추가된 항목을 읽음
2. 데이터노드는 블록 리포트를 두 개의 네임노드에 보내야됨
      - 블록 매핑 정보는 디스크가 아닌 네임노드의 메모리에 보관되기 때문
3. 클라이언트는 네임노드 장애를 사용자에게 투명한 방식으로 처리할 수 있도록 구성해야함
4. 대기 네임노드는 보조 네임노드의 역할을 포함, 활성 네임노드 네임스페이스의 체크포인트 작업을 주기적으로 수행

 

2) 고가용성이 필요한 이유

   '1-4 네임노드의 장애복구 기능'에서 말한 두 가지 방법에도 문제점이 있음

   새로운 네임노드 재구동까지는 총 3단계를 거쳐야함

                                      (1) 네임스페이스 이미지 메모리에 로드

                                      (2) 에디트 로그 갱신

                                      (3) 전체 데이터노드에서 충분한 블록 리포트를 받아 안전모드 벗어나기

              위의 3단계는 시간이 30분 이상 걸릴 수 있음 -> 그동안은 시스템 먹통됨 -> 큰일!!!!!!!!

   추가) 고가용성을 사용한다해도 1분정도 걸림

          -> 이유 ? 시스템이 활성 네임노드에 장애가 발생했다고 판단하는 시간 ( 매우 신중해야됨) 

 

3) NFS, QJM 

   고가용성 공유 스토리지를 위해 NFS필러 or QJM 을 선택

   - QJM : HDFS 전용 구현체, 고가용성 에디트 로그를 지원하기 위한 목적으로 설계 (HDFS의 권장 옵션)

              저널노드 그룹에서 동작, 각 에디트 로그는 전체 저널 노드에 동시에 쓰여짐

              (일반적으로 저널노드는 3개)

             주키퍼와 유사

 

 4) 장애복구와 펜싱

   장애복구 컨트롤러 : 대기 네임노드를 활성화시키는 전환 작업을 관리 

    - 우아한 장애복구 vs 우아하지 못한 장애복구

       우아한 장애복구 : 정기적인 유지관리를 위해 관리자가 수동으로 초기화 (두개의 네임노드가 서로 역할을 바꿈)

       우아하지 못한 장애복구 : 장애가 발생한 네임노드가 자신이 아직도 활성 네임노드라고 착각함

                                        -> 이때 펜싱을 사용하여 활성 네임노드 죽임! (시스템 손상시키면 안되니까..) 

 

'빅데이터 > 하둡' 카테고리의 다른 글

[하둡] 7. YARN- 맵리듀스 1과의 차이  (0) 2020.07.01
[하둡] 6. YARN  (0) 2020.06.29
[하둡] 5. HDFS (하둡 분산 파일시스템) - 데이터 흐름  (1) 2020.06.19
[하둡] 2. 맵리듀스  (1) 2020.06.18
[하둡] 1. 하둡  (1) 2020.05.25

맵리듀스 : 여러 노드에 태스크를 분배하는 방법

              맵단계와 리듀스단계가 있음 (각 단계는 입력과 출력으로 키-값의 쌍을 가짐)

 

1. 맵단계, 리듀스단계

 데이터는 키-값 쌍으로 변환괴어 맵함수에 입력됨

  맵 함수의 출력 = 리듀스 함수의 입력

맵리듀스의 논리적 데이터 흐름 (하둡 완벽가이드)

 

2. 맵리듀스 소스코드!

  1) 맵 함수

      맵 함수는 추상map() 메서드를 정의하는 Mappper클래스로 구현됨

      Mapper 클래스는 제네릭 타입, 네개의 정규타입 매개변수를 가짐 ( 입력키, 입력값, 출력키, 출력값)

 

2) 리듀스 함수

     리듀스 함수는 Reducer를 사용하여 정의 (맵 함수와 비슷)

 

3) 잡

    job 객체는 잡 명세서(잡 수행하는 방법 정의한 것)를 작성함

   하둡 클러스터에서 잡을 실행하는 단계:

                   1. 코드를 JAR파일로 묶기

                               - 하둡은 클러스터의 해당 머신에 JAR파일을 배포

                   2. Job 객체 생성시 입력과 출력 경로를 지정

                               - 입력경로 지정시 FileInputFormat-addInputPath()호출하여 지정

                               - 출력경로 지정시 FileInputFormat-setOutputPath()호출하여 지정

                                 (리듀스 함수가 출력파일 저장할 디렉터리)

                  3. 입출력 데이터 타입 지정

                              - setMapperclass(), setReducerClass() 메서드 사용

                  4. 맵리듀스 함수를 정의한 클래스 지정

                             - waitForCompletion() 메서드 : 잡 제출 후 잡이 모두 끝날 때까지 기다림

 

3. 시스템 속 맵리듀스

    1) 맵리듀스 잡

       정의 : 맵리듀스 잡은 클라이어트가 수행하는 작업의 기본 단위

               입력데이터, 맵리듀스 프로그램, 설정 정보로 구성되어 있음

               하둡은 잡을 맵 태스크, 리듀스 태스크로 나누어 실행

                (각 태스크는 YARN을 이용하여 스케줄링, 여러노드에서 실행됨, 실패시 재할당&실행)

 

  2) 입력 스플릿(스플릿)

       하둡에서 잡을 입력하기위해 스플릿이라는 고정크기 조각으로 분리 (보통 스플릿 기본크기는 128 MB)

       각 스플릿마다 하나의 맵태스크를 생성, 스플릿의 각 레코드를 사용자 정의 맵 함수로 처리함

 

3) 데이터 흐름 - 맵

데이터로컬(a), 랙로컬(b), 외부랙(c) 맥 태스크, 하둡완벽가이드

      - a :  동일 노드에 가용슬록이 있는 경우

             HDFS내의 입력 데이터가 있는 노드에서 맵태스크를 실행 (데이터 지역성 최적화)

      - b :  동일 노드에 가용슬롯이 없는 경우

             잡 스케줄러는 동일 랙에 속한 다른 노드에서 가용 슬롯을 찾음

     - c :  동일 랙에 가용슬롯이 없는 경우

             외부 랙의 노드 선택 (랙 사이 네트워크 전송 불가피)

 

4) 데이터 흐름 - 리듀스

    맵 태스크의 결과는 로컬디스크에 저장, 리듀스 태스크의 결과는 HDFS에 저장 (다른 복제본은 로컬, 외부 랙에 저장)

단일 vs 다수 리듀스 태스크, 하둡완벽가이드

 

   위의 그림과 같이 다수의 리듀스 태스크가 있는 경우 리듀스 수만큼 파티션을 생성, 맵의 결과를 각 파티션에 분배함

 

 

5) 컴바이너 함수 

컴바이너 함수 : 맵과 리듀스 테스크 사이의 데이터 전송을 최소화 하기위한 맵의 결과를 처리하는 함수

                      컴바이너 함수의 출력 = 리듀스 함수의 입력

(주의! 컴바이너 함수가 리듀스 함수를 완전히 대체할 수 없음! 적용 여부를 검토한 후에 사용해야됨)

 

 

  • 이 블로그 내의 알고리즘 내용은 모두의 파이썬 with 파이썬, 알고리즘 문제 해결전략 내용을 요약및 참고한 것입니다. 
  • 제가 이해한 대로 정리한 내용이기에 본문의 내용과 상이할 수 있습니다. 

1. 알고리즘

    알고리즘 : ‘어떤 문제를 풀기 위한 절차나 방법

    알고리즘 분석 : 알고리즘의 성능이나 특징을 분석하는 것

   알고리즘의 특징 : 알고리즘의 각 단계는 구체적이고 명료해야됨

 

2. 계산 복잡도 표현

  계산 복잡도: 알고리즘의 계산이 얼마나 복잡한지 나타낸 정도

  O(1) : 입력 크기 n과 필요한 계산의 횟수가 무관( 입력 크기 커져도 계산 시간 늘어나지 않음)

출처 : https://heekim0719.tistory.com/266

'컴퓨터 과학 > 알고리즘' 카테고리의 다른 글

[알고리즘] 5. 정렬  (1) 2020.06.22
[알고리즘] 4. 탐색  (0) 2020.06.22
[알고리즘] 3. 재귀 호출  (0) 2020.06.22
[알고리즘] 2. 알고리즘 기초  (0) 2020.06.22

회귀 분석 : 두 변수 사이의 관계를 통계적 분석을 통해 방정식을 구하는 것

 

5.1 변수의 종류

X : 원인 Y : 결과
독립변수 종속변수
설명변수 목적변수

독립변수 : 종속변수를 움직일 수 있는 변수 (독립변수가 변하면서 종속변수가 어떻게 변하는지..)

 

5.2 회귀분석의 종류

- 단순회귀 : 독립변수가 하나

- 다중 회귀 : 독립변수가 여러개

=> 독립변수들의 가중치(회귀계수) 하나하나를 구하는 것이 회귀 분석의 목적.

 

* 데이터 분석을 하기위한 최소한의 데이터 개수는 변수의 개수보다 두개 많아야 함

 

 

5.3 선형회귀분석

     1) 단순 선형 회귀 : 최소제곱법으로 잔차(실제값과 회귀식으로 예측한 값의 차이)를 최소화 한다.

     2) 다중공선성문제 : 

             독립변수들이 많을수록 회귀식의 성능이 좋아지므로, 최대한 많은 독립변수를 수집한다

                    -> 이때 생기는 문제 : 다중공선성문제(독립변수 간에 독립성 유지가 안되면 회귀계수가 불안정하게 됨)

                    -> 해결방법 :  1. 상관관계가 높은 독립변수들 중에서

                                          종속변수(Y)와 가장 상관성이 높은 변수 하나만 남기고 나머지를 삭제하는것

                                        2.  주성분회귀, 부분최소제곱 사용

 

5.4 주성분회귀분석

  주성분분석을 이용해 독립변수를 새로운 좌표축으로 이동-> 압축된 독립변수를 이용 -> 다중회귀로 분석

  (상관관계가 높은 변수끼리는 동일한 주성분으로 뭉치는 효과)

 

 

5.5 부분최소제곱법 분석

독립변수와 종속변수의 상관관계를 고려해 분산이 최대가 되도록 새로운 변수를 만듦

(종속변수(Y) 포함X : 주성분 회귀  VS  종속변수(Y) 포함 : 부분최소제곱법) 

X,Y의 공분산 최대화를 거쳐 새로운 잠재변수로 변환  -> 잠재변수 선정 -> 다중 회귀

 

 

5.6 회귀식 평가방법

    1) 제곱근평균제곱오차(RMSE, RMS) : 오차를 제곱 -> sum -> 평균 -> 제곱근 (작을 수록 좋다)

    2) 결정계수 : 회귀식에 의해 실제 데이터를 어느 정도 설명하는가를 알려줌

출처 : https://m.blog.naver.com/PostView.nhn?blogId=lchry&logNo=220511983820&proxyReferer=https:%2F%2Fwww.google.com%2F

 SST : 평균에서 각 데이터의 잔차

SSR : 평균과 회귀식에 의해 예측된 값의 잔차

SSE : 실제 값과 회귀직선으로 예측한 값의 잔차

 

 

분류 알고리즘: 데이터를 특정 목적에 맞게 분류하는 알고리즘

 

4.1 분류알고리즘의 종류

이진분류 : 두 가지 중에 하나를 학습해야 하는 것

다중클래스 분류 : 여러 가지 클래스를 학습해야 하는 것    - 신경망, 결정트리      ex) 개, 고양이, 토끼..

 

4.2 마할라노비스 거리

두 점 사이의 거리 계산 방법 (유클리드 거리, 마할라노비스 거리)

=> 마할라노비스 거리 : 데이터가 가지고 있는 확률분포, 상관관계를 고려한 거리재기

 

4.3 마할라노비스-다구찌(MTS)

일본의 공학자가 4.2 알고리즘을 약간 수정하여 도입한 기법

 

1) 마할라노비스 다구찌의 원리

정상 집단에 대하여 다차원의 단위공간으로 마할라노비스 공간을 정의하고

임의의 대상이 그 공간으로부터 얼마나 떨어져 있는가를 거리로 산정

-> 거리가 멀어질수록 정상에서 멀리 떨어진 것으로 진단

 

2) 모델 구축 순서

                 순서 : 1. 기준데이터 결정

                                 1-1. 초기 데이터로부터 이상치 제거

                          2. 기준 데이터를 이용하여 정상 모델 작성

                                 2-1. 데이터 표준화

                                 2-2. 상관행렬 구하기

                                 2-3. 상관행렬에 대한 고윳값, 고유벡터 구하기

                                 2-4. 고유벡터를 표준화

                                 2-5. 표준화된 고유벡터를 이용하여 표준화된 데이터의 좌표 이동

                         3. 기준 데이터를 이용하여 검출 기준 결정                               

                           ===================모델활용=======================

                        1. 구축된 모델을 이용하여 실제 데이터의 MD^2 계산

                        2. 정상/비정상 판단

 

출처 : 마할라노비스-다구치 시스템과 로지스틱 회귀의 성능비교 : 사례연구 (이승훈, 임근)

주성분 분석 : 데이터 압축!

 

3.1 주성분분석 개요

차원의 저주 : 데이터의 차원 증가 -> 분석에 필요한 데이터 증가 -> 필요한 데이터 충족 못함

                   -> 적당히분석(데이터 없어서) -> 데이터 없어서 모델 구축이 어려움

주성분분석 : 다차원 데이터의 정보를 가능한 손실 없이 저차원 공간에 압축하는 것

                 순서 : 1. 데이터 표준화

                          2. 주성분 축 생성 

                                 2-1. 분산이 가장 큰(데이터가 가장 많이 퍼져있는) 방향을 찾아서 첫번째 축(주성분)을 만든다

                                 2-2.  첫번째 축과 90도로 직교하며 분산이 큰 방향으로 구하여 두번째 축으로 만든다. (쭉~~)

                         3. 구해진 새로운 공간으로 원래 데이터의 좌표를 이동                               

                           ===================위에 순서를 쉽게한것이 아래=======================

                        0. 데이터 표준화

                        1. 상관행렬 구하기

                        2. 상관행렬의 고윳값, 고유벡터 구하기

                        3. 고유벡터를 이용하여 표준화된 데이터를 주성분 공간으로 이동

 

*특징:  - 각 주성분의 분산과 고윳값은 일치함

         - 좌표변환 전후의 정보량은 같음

         - 고윳값은 크기 순으로 정렬됨

         - 고윳값은 포함하고 있는 정보량을 보여줌

 

 

3.2 주성분분석 활용 (차원축소)

3.2.1 차원 축소

    1) 고윳값을 이용해 축소하는 방법 : 고윳값이 1보다 작으면 의미 없는걸로 생각하고 삭제

    2)누적 기여율을 이용하는 방법: 누적 기여율을 보고 데이터를 선택

 

+ Recent posts