1. A method performed at one or more servers, each having one or more processors and memory, the method comprising: retrieving a two-dimensional matrix of data points, a first dimension of the matrix corresponding to a group of users, a second dimension of the matrix corresponding to a group of identifiers, each data point representing a count of occurrences of a respective user selecting a respective item, wherein each user corresponds to a user identifier in a set of user identifiers and each item corresponds to an item identifier in a set of item identifiers; initializing a respective user vector for each user identifier in the set of user identifiers, wherein the respective user vector has n component values, n being a positive integer, and wherein initializing the respective user vector includes initializing the n component values of the respective user vector; initializing a respective item vector for each item identifier in the set of item identifiers, wherein the respective item vector has n component values, and wherein initializing the respective item vector includes initializing the n component values of the respective item vector; iteratively adjusting the user vectors and item vectors based on the data points in the two dimensional matrix, wherein the adjusting comprises, for each iteration: performing a first phase in which the component values of the item vectors are held constant, including: computing a plurality of first phase parameters for each user vector based on data in the two-dimensional matrix, the user vectors, and the item vectors, wherein the plurality of first phase parameters for each user vector u includes n component values of a gradient vector d u , wherein d u specifies the direction to modify u in order to optimize the user vector u; and replacing each user vector u with u+α(d u /|d u |), where α is a monotonically decreasing function of the iteration and |d u | is the length of the vector d u ; and performing a second phase in which the component values of the user vectors are held constant, including: computing a plurality of second phase parameters for each item vector based on data in the two-dimensional matrix, the user vectors, and the item vectors, wherein the plurality of second phase parameters for each item vector i includes n component values of a respective gradient vector h i , wherein h i specifies the direction to modify i in order to optimize the item vector i; and replacing each item vector i with i+β(h i /|h i |), where β is a monotonically decreasing function of the iteration and |h i | is the length of the vector h i ; receiving a request from a user for an item recommendation; selecting an item for the user based, at least in part, on the adjusted user vectors and item vectors; and recommending the selected item to the user.