   Ignoring the privacy considerations. . .
  We need to build a huge effing matrix, filled with every bit of media ever created on one side, and every single person in the world on the other. Filled in with how much they liked or disliked it, with the missing entries filled in using the opinions of other people, weighted by the inverse of distance between their vectors, and then iterating the whole thing repeatedly. Seriously. We should ask Google if they'd be willing to set aside a few thousand terabytes for such an awesome project.   
  To the point of what?We have other things we can waste time and resources on, such as space programs. And those pump out useful things now and then.   ;  To find rare obscure things that a specific person might enjoy but wouldn't know to look for, not knowing it existed. Duh!Keeping me entertained is much more important that building huge particle accelerators that may or may not create strange exotic things that could swallow up the planet.[Edited by - smart_idiot on January 21, 2008 11:46:07 PM];  It doesn't really matter "who" likes what, at least not as much as "how many". Thing that google already knows. Besides having such a database up to date would always be harder than creating it.   ;  I don't care about other people and what they might be interested in, I just care about my little slice of the matrix and what I might be interested in looking at.I don't care about keeping it up to date, the opinions of someone from 5 centuries ago would be just as useful as anyone elses. Their vectors might be too far away from most people to have much effect, but should the fabric of spacetime rip open and strand a bunch of people here outside of their original time, the service would be just as useful to them as it would be anyone else.I definitely don't care about how many like a specific thing. That's exactly the kind of thing I'd want to get away from. The first thing to become semi-popular, everyone starts looking at, displacing everything else. I'm looking for rare overlooked gems that the majority of people wouldn't be interested in. Think QWERTY versus Dvorak keyboards. Dvorak is most likely superior, but we use QWERTY because it appeared first, and the majority of people use it.   ;  I don't understand yet - can you give a small-scale example?   ;  Really crappy program:#include <vector>#include <map>#include <string>#include <iostream>#include <cmath>struct element {  double opinion;  bool set;    element(): opinion(0.0f), set(false)   {} };struct person {  std::vector<element> opinion; };std::vector<std::string> media;std::map<std::string, person> people;struct person &getPerson(const std::string &string) {  struct person &result = people[string];  result.opinion.resize(media.size());  return result; }int getMedia(const std::string &string) {  std::vector<std::string>::iterator result = std::find(media.begin(), media.end(), string);    if(result != media.end())   return result-media.begin();    media.push_back(string);    for(std::map<std::string, person>::iterator i(people.begin()); i != people.end(); ++i)   i->second.opinion.push_back(element());    return media.size()-1; }void setOpinion(const std::string &who, const std::string &what, double value) {  person &p = getPerson(who);  int m = getMedia(what);  element &e = p.opinion[m];  e.set = true;  e.opinion = value; }double vecDist(const std::vector<element> &a, const std::vector<element> &b) {  double dist = 0.0;    for(std::vector<element>::const_iterator i1=a.begin(), e1=a.end(), i2=b.begin(); i1 != e1; ++i1, ++i2)   dist += (i1->opinion-i2->opinion)*(i1->opinion-i2->opinion);    return std::sqrt(dist); }void propValues() {  for(std::map<std::string, person>::iterator i(people.begin()); i != people.end(); ++i)   {    double weight = 0.0;    std::vector<double> values(media.size(), 0.0);   for(std::map<std::string, person>::iterator j(people.begin()); j != people.end(); ++j)if(i != j) {  double dist = vecDist(i->second.opinion, j->second.opinion);  if(dist < 0.0001) dist = 0.0001;  dist = 1.0/dist;    std::vector<element>::iterator k = j->second.opinion.begin(), e = j->second.opinion.end();  std::vector<double>::iterator out = values.begin();    for(; k != e; ++k, ++out)   *out += k->opinion*dist;    weight += dist; }   std::vector<element>::iterator k = i->second.opinion.begin(), e = i->second.opinion.end();    std::vector<double>::iterator in = values.begin();   for(; k != e; ++k, ++in)if(!k->set) k->opinion = (k->opinion*0.001+*in)/(0.001+weight);   } }int main() {  setOpinion("Alice", "Spiderman", 0.5);  setOpinion("Bob", "Spiderman", 1.0);  setOpinion("Dan", "Spiderman", 0.8);    setOpinion("Alice", "Sound 'o Music", 1.0);  setOpinion("Charlie", "Sound 'o Music", -1.0);    setOpinion("Bob", "Football", 0.5);  setOpinion("Charlie", "Football", 1.0);  setOpinion("Dan", "Football", -1.0);    setOpinion("Alice", "Golf", 0.5);  setOpinion("Bob", "Golf", -0.5);  setOpinion("Dan", "Golf", 1.0);    for(int i = 0; i < 100; ++i)   propValues();    for(std::map<std::string, person>::iterator i=people.begin(); i != people.end(); ++i)   {    std::cout << i->first << "'s inferred opinions of. . ." << std::endl;    for(unsigned int m = 0; m < media.size(); ++m)if(!i->second.opinion[m].set) {  std::cout << "  " << media[m] << ": " << i->second.opinion[m].opinion << std::endl; }   } }Output:Alice's inferred opinions of. . .  Football: 0.0363325Bob's inferred opinions of. . .  Sound 'o Music: -0.0450114Charlie's inferred opinions of. . .  Spiderman: 0.815709  Golf: 0.141064Dan's inferred opinions of. . .  Sound 'o Music: 0.168799So, basically create a huge list of things people might like, so they can go try them if they haven't, and give their opinions if/when they have.   ;  You know, between Polypaint and this thread, I'm thinking that Smidiot looks something along the lines of this:;  Ah, yes, polypaint. . . my mind's been wandering all over that, too. It ended up somewhere crazy like peer to peer distributed hash tables representing a tree of brush strokes, with the root node being the blank canvas, and the leaves being completed images, along with some code for combining branches, which would collect the stokes that differ between the two trees, group the similar ones, create bounding boxes for the regions they affect, and create a new image using the common strokes, and then adding the new strokes, sorted from highest to lowest from the lowest part of each box, rational being far away things will be drawing higher in the image, and drawing the farther away things first will be less likely to make strange things happen when combining two variations of the same image. Then, each person effectively draws on their own, independent of everyone else. Other people that they like they can have the program automatically merge their contributions with their own, but it doesn't have to be mutual. Asshats can draw penises all they want, which is fine, everyone will just say they don't want any strokes from this user and he'll be the only one that will see his 'contributions'. Additionally, people can then draw pictures independently, and go back and forth between images if they want, or go back up the tree and create a new branch and try something else if they don't like what they have, effectively giving them a type of undo. But it's not really an undo, because both new and old versions will exist.But that's really complicated and I haven't figured out all the implications yet.   ;  yes, but I have this issue where I *try to hate something that someone else tells me I will like*. I hate it when people say things like, "oh yeah, you'll totally love that movie." I specifically nitpick it on every detail just so I can tell that person, "you know what, I thought it sucked."   