Archive for category Taste

Recommendation Engine Achieves 85% Success

As we’ve been able to gather more rating data from our site, MyFriendSuggests.com we’ve been able to run more tests on our unique recommendation algorithm. Our algorithm uniques combines both user based and item based collaborative filtering. Our recent tweaks to the algorithm have shown improvements and we are now able to achieve better than 85% accuracy on our predictions*. We still believe the algorithm can be improved further as we gain more data.

We believe our algorithm is unique in that it combines both user and item based filtering allowing us to build correlations between how similar two places are (in terms of the people who rate them) and how similar people are to each other. We use both of these factors together (in our unique algorithm) to make our recommendations.

Another great side effect of our approach is the ability for us to use our user correlations to help indicate to our members which other members share similar tastes. This allows them to find out which reviews they should consider when reviewing a location. This is a unique distinguisher for MyFriendSuggests.com because unlike the many other local search sites we can help you find the reviews that will help our users most instead of them reading 100’s of contradicting reviews from people who may not share their tastes.

We hope to continue to improve our recommendation algorithm and we’ll keep updating our blog with any other advancements.

* Our testing methodology was done using root mean squared analysis of our predictions versus actual ratings using the Taste API’s evaluator infrastructure.

collaborative filtering MyFriendSuggests.com Recommendation Engine suggestions

Tags: , , ,

Creating a custom recommender using taste

Taste is a great framework for collaborative filtering.  We are going to be launching a new recommendation algorithm on our site (MyFriendSuggests.com) in the coming weeks (Stay Tuned!) based on the Taste framework.  Taste provides a User-based and Item-based recommender.  User based recommenders find users that have similiar tastes to you and then use their ratings to predict how you might rate a given item.  Item based recommenders find items that are similar to each others and use those similar items to predict how you might rate a given item.  In our testing we found that a recommender that uses both types of recommenders would be most effective.  Basically we use the following formulat to predict user u’s rating of object x.

P(u,x) = alpha*uRec(u,x) + (1-alpha) * iRec(u,x)

Where alpha is a constant between 0 and 1 (basically weighting the two recommenders) and uRec and iRec are the Taste User and Item based recommenders.

Using the Taste evaluators you can build a simple program to find the bast value of alpha for your application.  Since we still have very sparse data we are leaving the value 0.50 until we have more data to work with.  In the next few days I’ll be posting some more on how I used taste to build our recommender.

collaborative filtering java Programming recommender taste Web 2.0

Improving performance of Taste using DBCP

For the past few weeks I’ve been playing with Taste, a Java based framework for collaborative filtering (basically the recommendation feature found on sites like Amazon and Netflix).    Hopefully in the near feature this tool will be incorporated in our site, MyFriendSuggests.com to improve our suggestion algorithms. 

What I found was the initial description of using a MySQL DataSource sounded fine, but do to the heavy access to the database performance was bad.  Actually it would stop being able to find new connections since the connections were being grabbed faster than windows was cleaning up open sockets.  Simple solution to this was to use the Apache DBCP for db connection pooling.  All I needed to do was add commons-dbcp and commons-pool to my class path and then create a simple function:

public static DataSource getDataSource()
{
  BasicDataSource md =
new BasicDataSource();
  md.setDriverClassName(
“com.mysql.jdbc.Driver”); 
  md.setUrl(
“jdbc:mysql://localhost:3306/dbname”);
  md.setUsername(
“user”);
  md.setPassword(
“pass”);
  return md;
}

I call this method in the constructor of the MySQLJDBCDataModel class.  After doing that things started performing much better.

java MyFriendSuggests taste Technorati Web 2.0
Close
E-mail It