Klustering är en grundläggande teknik inom maskininlärning och dataanalys, som syftar till att dela upp en dataset i olika grupper, så att objekt inom varje grupp är så lika varandra som möjligt, medan objekten mellan grupperna skiljer sig åt. Den här processen kan tillämpas på många olika sätt beroende på vilken metod som används. Bland de mest populära metoderna för partionering av data är K-Means och K-Medoids, två algoritmer som både försöker minimera avståndet mellan punkter som tillhör samma grupp och en gemensam representant för gruppen.

K-Means-klustring är en av de mest använda algoritmerna för att dela upp data i K-kluster. För att tillämpa denna metod behövs två huvudkomponenter: en dataset bestående av N objekt och en förutbestämd parameter K, som anger antalet kluster som ska bildas. Algoritmen strävar efter att optimera en objektiv partitioneringskriterium, vilket innebär att objekten inom ett kluster ska vara lika varandra medan objekten mellan kluster ska vara olika.

Den grundläggande K-Means-algoritmen fungerar genom att först välja K slumpmässiga centroids (eller medelvärden) som initiala representanter för varje kluster. Sedan itererar algoritmen mellan att tilldela varje datapunkt till det närmaste centroids och beräkna ett nytt medelvärde för varje kluster, tills inga större förändringar sker. Denna process beskrivs i Lloyds algoritm, och den har visat sig vara effektiv i många praktiska tillämpningar.

Trots sin enkelhet finns det flera problem med K-Means. Ett av de största problemen är val av initiala centroids. Eftersom dessa ofta väljs slumpmässigt, kan resultatet variera mellan körningar, vilket leder till att algoritmen ibland konvergerar till suboptimala lösningar. Ett sätt att motverka detta problem är att köra algoritmen flera gånger och välja den lösning som ger lägst fel (sum of squared errors, SSE). En annan strategi är att använda hierarkisk klustring för att hjälpa till att välja initiala centroids eller att använda bisekterande K-Means, som är mindre känslig för val av initiala punkter.

En annan fördel med K-Means är att det är mycket effektivt ur ett beräkningsperspektiv och kan snabbt konvergera, vilket gör det användbart för stora dataset. Trots detta har det sina begränsningar. K-Means fungerar dåligt när klustren har olika storlekar, densiteter eller icke-sfäriska former. Algoritmen är också känslig för utvärderingsfel som orsakas av outliers, det vill säga data som avviker markant från de andra datapunkterna.

För att hantera dessa problem finns alternativa metoder som K-Medoids. K-Medoids, även känd som PAM (Partitioning Around Medoids), liknar K-Means, men här väljs de centrala punkterna, eller medoid, inte som medelvärden utan som faktiska datapunkter från datasetet. Detta gör K-Medoids mer robust mot outliers, eftersom det inte påverkas av extrema värden på samma sätt som K-Means. Eftersom K-Medoids arbetar med faktiska objekt som medelvärden, kan den användas för att klustra data med vilken typ av avståndsfunktion som helst, till skillnad från K-Means som bara fungerar med euklidiska avstånd.

En nackdel med K-Medoids är att den inte skalar lika bra för stora dataset som K-Means gör. För att hantera större dataset har varianter som CLARA (Clustering Large Applications) och CLARANS utvecklats, som använder sig av sampling och slumpmässiga sökstrategier för att förbättra effektiviteten.

K-Means och K-Medoids har sina styrkor och svagheter, men tillsammans ger de ett brett spektrum av verktyg för klustring. För den som arbetar med verkliga data är det viktigt att förstå både fördelarna och begränsningarna med dessa algoritmer. K-Means är snabb och effektiv för stora dataset, men kan vara känslig för val av initiala centroids och för kluster med olika storlekar eller densiteter. K-Medoids, å andra sidan, är mer robust mot outliers och kan hantera arbiträra avstånd, men är mindre effektiv på stora dataset.

För att förbättra resultaten ytterligare bör man alltid överväga att förbehandla sina data noggrant, till exempel genom att normalisera värdena och ta bort outliers innan klustring. Efter själva klustringsprocessen kan det vara fördelaktigt att använda post-processningstekniker som att eliminera små kluster eller slå samman nära kluster för att förbättra resultaten.

Vidare är det ofta en god idé att experimentera med olika värden för K, det vill säga antalet kluster, för att se vilket värde som ger de mest meningsfulla och användbara resultaten. Ibland kan det vara mer informativt att använda ett mindre antal kluster med bra sammanhållning, än ett större antal kluster som inte ger meningsfulla grupperingar.

Hur kan man använda Gaussisk filtrering och gradientnedstigning för att hitta globala minimum?

I optimering används olika metoder för att hitta minimivärden på funktioner. En grundläggande teknik är att använda konvolution för att filtrera och jämna ut en funktion, vilket gör den enklare att analysera och bearbeta. I detta sammanhang kan en Gaussisk filterfunktion tillämpas för att smidigt approximera funktionens egenskaper. Detta kan exempelvis göras med hjälp av den inbyggda funktionen scipy.ndimage.filters.gaussian_filter i Python, som kräver ett parametervärde för standardavvikelsen σ, vilket styr bredden på den Gaussiska fördelningen.

Genom att lagra en funktion i en 2D-array A, där varje punkt representerar ett värde i ett multidimensionellt rum, kan man tillämpa denna Gaussiska filtrering på olika sätt. Filtreringen kan göras genom att använda en upprepad konvolution med en specifik operator S, som appliceras över flera iterationer. Denna operator kan definieras som ett symmetriskt filter, vilket gör att en jämnare och mer exakt approximation av den ursprungliga funktionen skapas. Efter att ha genomfört konvolutionen kan man använda detta filtrerade resultat för att bättre förstå och uppskatta funktionen samt dess derivator på en given punkt.

I praktiken är en sådan approximation användbar när det gäller att beräkna gradienter och bestämma den bästa riktningen för optimering. Detta leder oss till nästa steg, nämligen att använda metoder som gradientnedstigning för att hitta den globala minimum i ett rum med flera lokala minima. Genom att använda en metod som kallas "Gaussian homotopy continuation" kan vi successivt minska σ-värdet i den Gaussiska filterfunktionen och på så sätt undvika att fastna i lokala minima, medan den traditionella gradientnedstigningen ofta bara leder oss till ett lokalt minimum.

För att verkligen förstå och tillämpa dessa tekniker måste man också beakta den komplexitet som uppstår när det gäller att implementera sådana metoder för verkliga funktioner, som de som finns i maskininlärning och statistik. Här kan det vara användbart att experimentera med olika funktioner som har många lokala minima, såsom Ackley-funktionen eller Griewank-funktionen, och lagra dessa funktioner i en 2D-array som kan användas för vidare beräkningar.

En viktig aspekt att förstå i denna process är att gradientnedstigning, trots att den är effektiv i många fall, inte alltid ger den bästa lösningen när vi arbetar med komplexa funktioner. I sådana fall kan vi vända oss till mer avancerade metoder som Newtons metod, som konvergerar snabbare än gradientnedstigning om Hessian-matrisen är tillräckligt bra. Dock är beräkningen av Hessian för stora funktioner ofta opraktisk, vilket gör att man ofta föredrar metoder som approximera Hessian istället, så kallade quasi-Newton metoder.

När det gäller att använda quasi-Newton metoder, kan man selektera en uppsättning av de mest inflytelserika komponenterna i gradienten och använda dessa för att approximera Hessian och därmed finna en sökriktning som leder till snabbare konvergens. Metoder som BFGS är exempel på sådana tillvägagångssätt där Hessian inte behöver beräknas explicit. Det är också viktigt att notera att för stora dimensioner på problemet, till exempel i maskininlärning, kan det vara mer praktiskt att använda dessa approximationer istället för att direkt beräkna Hessian.

När man arbetar med dessa metoder är det viktigt att förstå både fördelarna och nackdelarna med varje tillvägagångssätt. Fördelarna med Gaussisk filtrering är att den möjliggör en smidig och effektiv approximation av komplexa funktioner, men den kan också leda till en förlust av detaljer i funktionens ursprungliga struktur. Å andra sidan ger quasi-Newton metoder en effektiv lösning för att optimera funktioner utan att behöva beräkna Hessian direkt, men de kräver en noggrann val av komponenter för att undvika att approximationen blir för grov.

För att verkligen förstå effekten av dessa metoder bör man experimentera med olika optimeringsfunktioner och noggrant analysera deras beteende under optimeringsprocessen. Denna förståelse ger en bättre grund för att tillämpa dessa tekn