Visar inlägg med etikett www. Visa alla inlägg
Visar inlägg med etikett www. Visa alla inlägg

06 januari 2010

Några problem med rekommendationssystem

I den nära framtidens överflöd av musik, där praktiskt taget all musik som någonsin spelats in är tillgänglig att lyssna på var som helst och när som helst, får automatiska rekommendationssystem en avgörande roll i att hjälpa oss välja. Rasmus Fleischer ger i Det postdigitala manifestets §15–§18 en tankeväckande beskrivning av möjligheterna med rekommendationssystem, och några av dess möjliga sociala konsekvenser. Men han diskuterar inte frågan om hur systemen egentligen ska fungera – det förutsätts antagligen några medlemmar av vad som kan uppfattas som ett modernt prästerskap, datateknikerna, ta hand om.

Ganska naturligt kanske, men eftersom jag är en av medlemmarna i det där prästerskapet som förutsätts kunna leverera underverk till att ge rekommendationer, på ett sätt som förutsätts vara alltför komplext för att den genomsnittlige användaren ens ska börja försöka begripa sig på det, så börjar jag förstås omedelbart fundera över hur man egentligen ska få fram de där rekommendationerna.

Själva de algoritmiska problemen med att behandla tillräckligt mycket data på tillräckligt kort tid bekymrar mig inte nämnvärt. Det är sekundära och angenäma problem som vi löser på ett eller annat sätt med smarta beräkningar, kraftfull hårdvara eller väl valda approximationer. Nej, det svåra här är framför allt att det är så ytterligt svårt att avgöra vilket problem det egentligen är som ska lösas.

Den vetenskapliga litteraturen flödar redan över av matematiska och statistiska metoder för rekommendationer. Utan tvekan lever många av metoderna upp till förväntningarna vad gäller komplex obegriplighet. Men när man tittar på hur själva problemet egentligen beskrivs, problemet som metoden löser, matematiskt formulerat som något sorts optimeringsproblem, då blir i alla fall jag väldigt snabbt tveksam. Är det verkligen det där som är rekommendationsproblemet, och i så fall varför?

I själva verket finns ingen bra matematisk formulering av vad ett rekommendationssystem ska göra. Eller med andra ord, inget objektivt mått på om en viss rekommendation är bättre än en annan. När man visar upp en rekommendation kan nog de flesta människor säga om de tycker att den är »rätt« eller inte, och om man pressar dem kan de eventuellt ad hoc komma fram till någon sorts abstraktion av varför. Men tar man den abstraktionen och applicerar blint på tillgänglig data så vågar jag påstå att man kommer att få resultat som innehåller en hel del »fel« som många kommer att irritera sig på.

Till syvende och sist är det en smaksak vad som är rätt och fel. Detta är en mardrömssituation för en algoritmiker som vant sig vid att allt kan reduceras till binära beslutsproblem. Ett sätt att objektivifiera problemet är att säga att det gäller att förutsäga rekommendationer som man redan har empiriska data för (som i Netflix filmrekommendationstävling) men det är en forumlering som kräver ganska begränsade förutsättningar. Det enda uppenbart objektivt korrekta sättet att närma sig problemet skulle vara att försöka simulera de relevanta delarna av användarens hjärna.

Det är det ena som gör rekommenderandet svårt. Det andra är brist på data.

Visst, över tid kan man samla på sig hur mycket data som helst, men man stöter ändå alltid på situationer där de är sparsamma. Brist på data ger osäkerhet, men i många statistiska metoder ger det en illusion av säkerhet. Det kan man observera om man tittar i till exempel en nätbokhandel på en hyfsat ovanlig bok man redan köpt. Bland rekommendationerna radas då ibland upp en misstänkt stor del av ens egen bokhylla. I mitt fall kan det exempelvis vara tecknade serier av Chris Ware som påstås ha samband med böcker om databasteori. Ett illusoriskt samband, eller? Om det nu är så att den enda som köpt databasteoriboken också köpt den tecknade serien, finns det då inte ett starkt statistiskt belägg för att det faktiskt finns ett samband? Här är det ont om bra objektiva argument. Motsvarande koppling mellan två databasböcker är betydligt svårare att kritisera.

Lyckligtvis kommer man dock en bra bit på väg med ganska enkla metoder. Men det är inte självklart att framtidens system blir så fruktansvärt mycket mer sofistikerade än dagens, annat än genom att de kommer att kunna använda sig av mer data (och mycket data slår ofta sofistikerade algoritmer).

En löjligt enkel metod i musikfallet är förstås att rekommendera annan musik av samma artist. Men till och med ett så enkelt kriterium kan slå brutalt fel. För vad är egentligen samma artist?

Söker man på Spotify efter Aphex Twin, vilket är den mest kända pseudonymen som den (i brist på bättre term) elektroniske musikern Richard D. James har använt sig av, då får man bland annat träff på plattan Reverse the Trend som James förefaller ha gett ut 2003 under den alternativa pseudonymen AFX. Men det har han inte alls. AFX är i detta fall ett kaliforniskt gitarrband med kristna texter, ljusår från Aphex Twins genialiskt respektlösa synthexperiment.

Uppenbarligen använder Spotify data som anger att Aphex Twin och AFX är synonymer, och det är svårt att säga att det är fel. Det är också svårt att säga vad man skulle kunna göra åt det – annat än att gå in och handeditera när man upptäcker problem. Visst skulle man kunna ha till exempel kollat skivbolagsetiketter, men det skulle precis lika gärna ha kunnat bli fel åt andra hållet, eftersom James inte bara använt sig av ett otal artistalias utan också gett ut skivor på en mängd olika bolag.

Än intressantare blir det när man söker upp Reverse The Trend på Amazon och kollar rekommendationerna. Det är idel Aphex Twin-relaterade titlar bland »customers also bought«, vilket lätt ger det felaktiga intrycket att det handlar om samma artist. Men – och detta är det riktigt intressanta – vad Amazon faktiskt säger är förmodligen helt sant!

Kundrecensionerna är underhållande; det finns 14 stycken och samtliga handlar om en enda sak: detta är ju inte Aphex Twin! Alla har lägsta betyg utom en som har högsta, och den sammanfattar fenomenet väl:

this is by far the funniest thing on amazon.com. i cant believe poeple accually bought this thinking it was aphex twin.

"Customers who bought this item also bought

* Hangable Auto Bulb ~ AFX
* Analogue Bubblebath ~ AFX Featuring Schizophrenia
* Analogue Bubblebath, Vol. 3 ~ AFX
* Surfing on Sine Waves ~ Polygon Window"

hahaha you silly people.

Amazon använder sig av användardrivna kopplingar, vilket borde vara idiotsäkert. Kunder som köpt det här har också köpt det där. Det är en koppling som är obestridligt sann i all sin objektivitet. Men det kan, som i detta fall, bli till en självförstärkande felaktig rekommendation. Varje kund som blir lurad av den synbara kopplingen, och köper skivan i tron att det är Aphex Twin, bidrar till att förstärka den.


07 januari 2008

Icke-reflexiva relationer på Jaiku

Jag har nu förstått något om Jaiku som jag inte förstått när jag skrev förra inlägget. Tydligen funkar inte Jaiku som de sociala nätnätverk som jag tidigare varit i kontakt med där kontakter är någonting ömsesidigt. På Jaiku kan Jonas vara min kontakt utan att jag behöver vara Jonas kontakt. Jonas behöver inte ens ha en aning om vem jag är. Att jag lägger till Jonas som min kontakt innebär i själva verket bara att jag prenumererar på hans Jaikuflöde, utan att han kan göra någoning för att hindra det. Gott så, men är det inte en gravt missvisande användning av ordet »kontakt«?

En skillnad mellan ett Jaikuflöde och en vanlig blogg är att man, om man vill, kan markera att endast kontakter ska få se vad som händer. Då tvingar man alla som vill läsa att lägga till en som kontakt, så att man får en förvarning och kan se till att inte jaika någonting olämpligt ifall blogginspektör Bodström börjar läsa. Men mina jaikur är tills vidare öppna för allmänheten. Jag har ingenting att dölja! Jag har rent mjöl i påsen!

Bloggar om Jaiku, sociala nätverk.


Finns ni på Jaiku?

Jag har fixat ett Jaiku-konto, men jag hittar knappt någon att lägga till som kontakt. Kanske har jag inga bekanta på Jaiku, eller så är de där under hemlig identitet precis som jag, eller så kommer jag inte på att söka efter dem. Om du finns på Jaiku och tycker att jag är kvalificerad att vara din kontakt så kan du väl lägga till mig.


03 maj 2007

Bloggping i Javakod

Ping server När jag hade lagt ut mina första blogginlägg undrade jag hur i all världen någon skulle kunna hitta min blogg. Jag frågade min bekant Håkan Kjellerstrand, som tog på sig rollen som min bloggningsmentor och gav mig ett antal länkar, bland annat till några servrar som han själv brukade »pinga« för att sprida kunskapen om sin blogg. Jag hade inget problem att förstå vad detta innebar i teorin, men hur jag rent praktiskt skulle göra för att pinga var inte uppenbart. Efter en stunds jagande efter pingverktyg konstaterade jag att det enklaste för mig nog var att själv skriva ett litet Javaprogram för att ta hand om det.

Blog Ping

Att pinga innebär i bloggsammanhang att man skickar ett litet meddelande som upplyser en pingserver om att man skrivit något på sin blogg, samt om bloggens adress. Servern kan då så snart den får tid hämta ner inlägg från bloggen och lagra data om den, indexera innehållet etc., för att göra informationen tillgänglig för dem som utnyttjar servern till att bevaka bloggosfären.

Googles Blogger som jag numera använder låter en välja att pinga Weblogs.com automatiskt, och informationen går därifrån vidare till en del andra tjänster. Men vill man pinga fler servrar, Nyligen.se till exempel, får man ingen hjälp av Blogger.

Tekniskt

Ping görs med ett XML-RPC-anrop, vilket som namnet antyder är ett remote procedure call-protokoll uppbyggt som XML, ovanpå HTTP. Metoden man anropar är antingen weblogUpdates.ping eller den utvidgade versionen weblogUpdates.extendedPing.

Parametrarna till den ursprungliga pingmetoden är bloggens namn, dess adress och eventuellt ett kategorinamn. Den utvidgade versionen tillåter tre adresser: en basadress, en direktadress till en sida som ska kollas för uppdateringar (i många fall densamma som basadressen), och en för flödet i RSS- eller Atom-format. Den bästa beskrivningen av parametrarna jag har hittat är den hos Weblogs.com. Exakt vilka parametrar som krävs och hur de tolkas verkar dock tyvärr variera lite mellan implementationerna på olika servrar.

Det vore inte särskilt svårt att skriva ett program i Java som satte ihop XML för anropet och matade ut den på en socket. Men ännu lättare är förstås att använda ett bibliotek med färdiga klasser för XML-RPC-anrop, exempelvis Apache XML-RPC.

Om man laddat ner Apache XML-RPC 3.0, exempelvis från Sunet, packat upp, och lagt JAR-filerna som finns i lib-katalogen på sin classpath kan man kompilera och köra följande program. Den första parametern till programmet är pingserverns adress, och de följande 2–5 är parametrarna till pingmetoden. Har man minst fyra pingparametrar antar programmet att man ska köra den utvidgade pingmetoden, annars den enkla.

import java.net.*;
import java.util.*;
import org.apache.xmlrpc.client.*;
import org.apache.xmlrpc.XmlRpcException;

public class PingBlog {
    public static void main(String[] args)
        throws MalformedURLException, XmlRpcException
    {
        XmlRpcClientConfigImpl conf = new XmlRpcClientConfigImpl();
        conf.setServerURL(new URL(args[0]));
        XmlRpcClient client = new XmlRpcClient();
        client.setConfig(conf);
        Object[] param = new Object[args.length - 1];
        for (int i = 1; i < args.length; ++i)
            param[i - 1] = args[i];
        Map result = (Map) client.execute(
            (param.length < 4 ?
             "weblogUpdates.ping" :
             "weblogUpdates.extendedPing"),
            param);
        Iterator it = result.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println(e.getKey() + ": " + e.getValue());
        }
    }
}

Exempelvis kan det se ut så här om man har en blogg av den nyare typen hos Blogger och vill pinga Nyligen.se med den enkla pingen:
java PingBlog http://nyligen.se/ping/                                \
              'Tjoff?'                                               \
              http://gashplutzga.blogspot.com/

Eller med den utvidgade pingvarianten:
java PingBlog http://nyligen.se/ping/                                \
              'Tjoff?'                                               \
              http://gashplutzga.blogspot.com/                       \
              http://gashplutzga.blogspot.com/                       \
              http://gashplutzga.blogspot.com/feeds/posts/default    \
              ''

Den tomma strängen på slutet finns där på grund av att vissa pingservrar kräver att man har med en kategoriparameter till extendedPing, även om de tillåter att den är tom.

Om allt går bra med pingen skriver programmet ut flerror: false och eventuellt ett trevligt meddelande från pingservern. Blir det något fel på servern får man flerror: true och ett felmeddelande.

Uppdatering 2015: Det här med bloggpingande är nu en historisk kuriositet, men jag låter både detta inlägg och länkarna till Nyligen.se och Bloggar.se längst ner i gamla inlägg ligga kvar, för det historiska intressets skull, och länkarna verkar häpnadsväckande nog fortfarande fungera.

intressant? om pinga, Java bloggande