Superb strikes from Nadir Belhadj and Frederic Piquionne either side of half-time earned the hosts victory and Liverpool midfielder Javier Mascherano was sent off before the break for a messy challenge on defender Tal Ben Haim.
Liverpool, who included Spanish international Fernando Torres in attack, created few opportunities and captain Steven Gerrard went closest to scoring with a deflected effort well saved by Asmir Begovic.
The defeat was the seventh in the league this season for Liverpool, while Avram Grant's Portsmouth drew level on 14 points with 19th-placed West Ham United having played a game more.