2021년 11월 25일 목요일

자바에서 퍼센트율(나누기)을 구할 때 유의사항.

일부값 / 전체값 * 100   X 

100d * 일부값 / 전체값 O


long part = 1;
long total = 3;

double ok = 100d * part / total;
double no = part / total * 100;

System.out.println(ok);
System.out.println(no);

33.333333333333336
0.0

1 / 3 = 0.333333 이다.

'part / total' 은 항상 정수형을 반환한다. part과 total의 타입이 long 타입이기 때문에 묵시적 형변환을 통해 끝수를 버리고 long타입으로 변환 된다.

만약 part나 total이 double 타입이라면 정상적으로 0.33333을 반환한다.

그래서 처음 100d를 통해 double 타입으로 반환하라고 명시 하면 오류 없이 퍼센트 결과를 얻을 수 있다.

2021년 9월 15일 수요일

수식없는 Isolation Forest 분석

 이상 탐지는 '정상'이 아닌 데이터를 식별하는 것이다. 여기서 '정상'의 정의는 관찰되는 현상과 속성에 따라 다르다.

이상 탐지는 정상을 정의하고 그 안에 속하지 않는 모든 것을 비정상으로 판별한다.


기본적으로 정상을 정의 하는 방법은 통계적 방법(statistical methods), 분류(classification ) 또는 클러스터링(clustering)을 사용하지만 프로세스 자체는 동일하다. 

정상을 정의하고 다른 모든것은 비정상으로 판별하는 것이다.

이러한 방식은 비정상을 감지하는 데, 최적화 되어 있지 않고, 정상을 찾는 데에 최적화되어 있다. 그로 인해 너무 많은 오탐이나 너무 적은 비정상이 감지 될 수 있다.

또 계산의 복잡성으로 인해 저차원 이나 작은 크기의 데이터에 적합하다.


Isolation Forest 알고리즘은 위 두가지 문제를 해결하고 이상현상을 감지하는 데 효율적이고 정확한 방법을 제공한다.

Isolation Forest의 핵심원리는 의사 결정 트리(decision tree)를 생성하여 이상을 '격리'하는 것이다.

격리에 필요한 분할 수가 작은 값은 이상 데이터로 볼 수 있다.


여러번의 분할을 거친 데이터는 정상이라고 판별한다.

이상 데이터는 단 4번의 분할로 격리 되었다.


정상 데이터를 분리하기 위해서는 수많은 분할(depth)이 필요한 데 반해, 이상 데이터는 정상 데이터에 비해 훨씬 낮은 분할만을 필요로 한다.

분할은 무작위(random)으로 발생한다. 여기서 분할 수는 이상 점수(anomaly score)을 생성하는 데 사용된다.

이상 점수는 하나의 데이터를 격리하기 위해 사용된 분할 수의 평균이다. 이상 점수, 즉 분할 수의 평균보다 낮은 분할 수를 이상이라고 판별한다.




서브샘플링

정상 데이터가 이상 데이터에 가까울 수록 격리가 어려워 잘못 된 판별을 할 수 있다. 이 때 

서브샘플링을 이용하면 알고리즘을 효율을 높일 수 있다.

Isolation Forest 알고리즘은 전체 데이터 세트가 아닌 서브샘플링 된 데이터 세트에서 더 잘 작동한다. 


성능 향상

이상 탐지는 depth가 낮은 값을 판별하므로 하나의 데이터를 격리하기 위해 깊게 들어갈 필요가 없다. 그렇기에 일정한 깊이에 제한을 걸어 성능을 향상 시킬 수 있다.

이 값은 log2(nodes_count)을 사용한다. 이는 노드에서 생성할 수 있는 적절한 이진 트리의 평균 높이이다.



Isolation Forest 는 수직, 수평 방향으로만 분할 하기 때문에 잘못된 Scoring 이 발생할 가능성이 있다. 이를 해결하기 위해 Extended isolation forest 알고리즘을 사용한다. 다만 연산량은 더 많다.


참조

https://medium.com/@arpitbhayani/isolation-forest-algorithm-for-anomaly-detection-f88af2d5518d

https://en.wikipedia.org/wiki/Isolation_forest

2021년 8월 27일 금요일

AttributeError: 'Sequential' object has no attribute 'predict_classes'

 텐서플로우의 예제를 colab을 사용하지 않고 다운 받아서 돌리려고 할 때 문제 발생.

공식 문서의 예제에는 "!pip install -q tensorflow-gpu==2.0.0-rc1" 명령어로 텐서플로우 버전을 지정해서 다운로드 한다.

이걸 무시하고 최신버전(2.6.0)의 tensorflow를 설치해서 나는 오류. 

predict_classes 는 2021-01-01 이후에 제거됨.


https://androidkt.com/get-class-labels-from-predict-method-in-keras

Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found

컴퓨터에 그래픽 카드가 없어서 발생하는 에러. 혹은 그래픽 드라이버가 설치 되지 않았다.

tensorflow가 아닌 tensorflow-cpu를 설치한다.

2021년 7월 15일 목요일

ObjectMapper로 형변환이 안되는 문제. (대문자 스네이크 케이스)

 DTO 객체명이 대문자 스네이크 케이스 형태일 경우 ObjectMapper convertValue 메소드로 형변환시 값이 들어가지 않는다.


여기에서 대문자 스네이크 케이스 코드를 받아서 적용했더니 정상적으로 값이 들어간다.


아래와 같이 네이밍 전략을 선언해서 사용한다.

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(CustomUpperSnakeCaseStrategy.UPPER_SNAKE_CASE);

ObjectMapper로 List Map 타입을 List Dto 타입으로 변환 방법

 

ObjectMapper mapper = new ObjectMapper();
List<Map<String, Object>> listMap = new ArrayList<>();
...
List<MyDto> testDtoList =
mapper.convertValue(listMap, TypeFactory.defaultInstance().constructCollectionType(List.class, MyDto.class));


2021년 5월 4일 화요일

maven resource 파일 지정.

 legacy 프로젝트를 maven으로 바꾸면서 properties 파일이나 mybatis xml 파일을 찾지 못하는 현상이 있었다.


Caused by: java.io.FileNotFoundException: class path resource [applicationResources.properties] cannot be opened because it does not exist


기존 프로젝트는 resourse 디렉토리가 따로 있는 게 아니라, 여기 저기 중구난방으로 되어 있다.

maven에서 아래의 설정을 추가하면 된다.

        <resources>
            <resource>
                <directory>src</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>