refactored em algorithm