A similarity measure is like an inverse distance function. In fact, if d(y, z) is a distance function on the set of all items, we could use this:
as a similarity measure. You can check that this would satisfy the six properties for a similarity measure, enumerated previously.
Without a predefined distance function to use, we instead will want to define the similarity measure in terms of the contents of the given utility matrix. There are several ways to do this.
If the utility matrix is Boolean (that is, every entry uij is either 1 or 0, indicating whether user i has bought an item), then we could adapt the Hamming metric. In this case, each column of the utility matrix is a Boolean vector, indicating which users have bought that item. The Hamming distance between two Boolean vectors is the number of vector slots where they differ. For example, if y = (1, 1, 1, 0, 0, 1, 0, 0) and z = (1, 0, 1, 1, 1, 0, 0, 1), then the Hamming distance between y and z is dH(y, z) = 5, because the two vectors disagree in the second, fourth, fifth, sixth, and eighth positions.
The Hamming distance has the special property that dH(y, z) ≤ n, where n is the length of the vectors. Consequently, the preceding formula for the derived distance function doesn't quite satisfy property five. However, this alternative formula for the derived distance does work, as the reader may verify:
This version satisfies all six of the requirements for a similarity measure.
Hamming similarity does not work very well when the utility matrix entries are more general decimal values. The problem in that case is that equality of real numbers is highly unlikely. To see that, run this test program:
Listing 9.1: Testing equality of real numbers
This shows that billions of random Double
values, even restricted to the interval 0
to 1
and then converted to type long
integer, will not be equal. So, the Hamming distance between random vectors of real numbers will almost always be n, the length of the vectors.