2014-05-24 4 views
1

Encog를 사용하여 this dataset을 처리하려고합니다. 이렇게하기 위해서 나는 출력을 하나로 합쳤다. (예를 들어 4 개의 출력 뉴런으로 NN을 수동으로 훈련 시키는데 실패했다 할지라도 여러 예상 출력을 사용하는 방법을 알아낼 수 없다.) "disease1", " "disease2", "none"및 "both".Encog 쿼리 분류

거기에서 시작하여 CSV에서 분석 마법사를 사용하고 자동 프로세스에서 예상 출력을 사용하여 NN을 교육했습니다. 파일의 최고봉 :

"field:1","field:2","field:3","field:4","field:5","field:6","field:7","Output:field:7" 
40.5,yes,yes,yes,yes,no,both,both 
41.2,no,yes,yes,no,yes,second,second 

이제 내 문제는 어떻게 쿼리합니까? 나는 분류를 시도했지만, 내가 이해 한 한 결과는 {0,1,2}의 값만을 제공하므로, 구분할 수없는 두 개의 클래스 (둘 다 0 임)가 있습니다.

위와 동일한 문제는 위키에있는 아이리스 예제에도 적용됩니다. 또한, Encog는 출력 뉴런 값에서 0/1/2 결과까지 어떻게 추론합니까?

편집 : 내가 발견 한 해결책은 질병 1과 질병 2에 대해 별도의 네트워크를 사용하는 것이었지만 실제로 이들을 하나로 결합 할 수 있는지 알고 싶습니다.

답변

2

올바른 결과이므로 출력 열을 단일 값으로 결합해야합니다. Encog 분석가는 단일 출력 열로 만 분류합니다. 이 출력 열은 여러 가지 다른 값을 가질 수 있습니다. 따라서 두 출력 열을 none, first, second로 정규화하면 둘 다 작동합니다. 근본적인 신경망을 직접 사용한다면 실제로 각각 독립적 인 분류를하는 두 개의 산출물을 훈련 할 수 있습니다. 그러나이 토론을 위해 나는 우리가 분석가를 상대하고 있다고 가정 할 것이다.

워크 벤치 또는 코드를 사용하여 네트워크를 조회하고 있습니까? 기본적으로 Encog 분석가는 등 엔코딩을 사용하여 신경망으로 인코딩합니다. 결과적으로 n-1에 해당하는 많은 출력 뉴런이 생성됩니다. 여기서 n은 클래스의 수입니다. 분석가 마법사에서 one-of-n 인코딩을 선택하면 BasicNetwork의 일반적인 분류 방법이 작동합니다. 이는 one-of-n 전용으로 설계 되었기 때문입니다.

등호를 사용하여 (코드로) 쿼리하려는 경우 다음과 비슷한 방법을 사용할 수 있습니다. 이것을 Encog의 다음 버전에 추가 할 예정입니다.

/** 
* Used to classify a neural network that has been encoded using equilateral encoding. 
* This is the default for the Encog analyst. Equilateral encoding uses an output count 
* equal to the number of classes minus one. 
* @param input The input to the neural network. 
* @param high The high value of the activation range, usually 1. 
* @param low The low end of the normalization range, usually -1 or 0. 
* @return The class that the input belongs to. 
*/ 
public int classifyEquilateral(final MLData input,double high, double low) { 
    MLData result = this.compute(input); 
    Equilateral eq = new Equilateral(getOutputCount()+1,high,low); 
    return eq.decode(result.getData()); 
}