2013-04-13 2 views
3

마르코프 체인을 나타내는 클래스를 작성하고 싶습니다 (이름은 MC). 그것은 상태 천이 행렬 (즉, vector<vector<double>>)을 취하는 생성자를 가지고 있습니다. 실제로는 행렬 (행과 열의 수가 동일 함)을 확인하는 것이 좋습니다. 실제로는 전환 행렬입니다. 모두 그 안의 수는 0.0 이상이고 1.0보다 크지 않을 확률이며, 모든 행에 대해 그 요소의 합은 1.0이지만, 부동 소수점 제한으로 인해 발생하는 문제가 있습니다. 예를 들어, 0.3 + 0.3 + 0.3 + 0.11.0에 동일하지 않으므로 검사가 그렇게 쉽게되지 않습니다 그래서이 두 가지 가능한 그 문제의 해결을 참조하십시오..부동 소수점 인수가 올바른지 확인

  1. 일부 엡실론을 선택하고 엡실론 오류와 비교를 물론 지금은 약간의 행렬을 수락 전환 행렬 속성을 위반하지만 일반적으로 누군가가 때때로 잘못된 데이터를 생성자에 전달하면 예외가 발생합니다.
  2. 아무것도 확인하지 말고, 클래스 사용자에게 의지하십시오. 만약 그가 뭔가 나쁜 것을 전달한다면, 그것은 완전히 그의 잘못이고, 클래스의 행동은 예상치 못한 것입니다.

어떤 접근 방식이 더 좋고 "실제"더 좋은가? 나는 처음을 좋아하지만 다시 어떻게 엡실론을 선택해야하는지 확신 할 수 없다.

+1

1 번째로 좋습니다. 제 2 세계는 실세계입니다. 따라서 저는 전세계에 많은 코드가 있다는 것을 의미합니다. 당신이 신경 쓰면 방어 적으로 행동하십시오. 그러지 마. –

+1

분명히 첫 번째 옵션이 더 좋습니다. 그러나 기준에서 작은 편차가 문제가 될 수 있다면 미묘한 점을 추가하는 것이 좋습니다. 생성자는 하나 이상의 수정 된 전환 행렬을 저장할 수있는 옵션을 가질 수 있습니다 원소들의 합이 가능한 한 '1.0'에 가깝도록 각 행의 원소들의 수를 수정한다. 인기있는 라이브러리에서이를위한 선례가 있습니다 (예 :'a'의 원소가'1.0'에 더해지지 않는 경우를 다루기 위해'a [i]/sum (a) '와 같아 지도록 배열의 각 원소를 정규화합니다. – Simon

+0

@ 사이먼을 분명히 알았습니까? 내 눈을 멀게하는 것처럼 보입니다. –

답변

3

두 번째 작업을 수행하십시오.

당신의 클래스는 부동 소수점리스트를 요약하고 "충분히 가깝다"를 1로 결정하고 그렇지 않은 것은 결정하지 않습니다. 귀하의 사용자는입니다. 귀하의 클래스는 마르코프 체인을 나타냅니다. 당신은 클래스가 마르코프 체인을 유용한 방식으로 나타내도록 엡실론 값을 선택할 수 없습니다.

구현할 작업에 대해 생각해보십시오. 체인의 전이 행렬을 사용하여 체인의 상태에 확률 분포를 적용하는 함수가있을 수 있습니다. 이 함수는 입력 확률 분포가 일부 ε 이내의 확률 분포인지 확인해야합니까?

함수는 거의 확실하게 "확률 분포입니다"속성을 유지하지 않습니다. 마르코프 체인에 의한 확률 분포에 반복적으로 타격을 가할 때 확률 분포의 공간에서 반올림 오차로 인해 약간의 드리프트가 발생합니다. 이후에 정규화하여이를 수정할 수는 있지만 더 많은 부정확성이 발생합니다.

이제 "주어진 마르코프 체인과 정수 k, 입력 체인 k 번 반복"으로 구성된 마르코프 체인을 반환합니다. 이것은 라운드 오프를 누적 시키며 "마르코프 체인에 대한 히트 확률 분포"와 같은 문제로 고통 받음을 알 수 있습니다.

12 시간 사용한 후에 끊는 재료와 불필요하게 부정확 한 재료 중 하나만 선택할 수 있다면 좋지 않겠습니까?

(사각형 행렬 인수의 직각도 및 행렬을 확인하는 것은 물론 합리적입니다.)

+0

+1 가짜 입력을 보내면 코드를 사용하는 사용자가 어디서나 접근 할 수 없으므로 코드를 올바르게 처리 할 수 ​​있습니다. –

+0

"check()"또는 "score"를주는 클래스에서 도우미 함수를 사용할 수 있습니다. (또는 "true"/ "false") 결과는 그것이 "좋은"행렬인지 아닌지에 따라 결정됩니다. –