Når man arbejder med billedanalyse og segmentering, er en vigtig tilgang at anvende clustering-algoritmer. En af de mest populære metoder til dette formål er Fuzzy C-Means (FCM) clustering, som tillader en gradvis opdeling af data i flere klynger i stedet for en hård opdeling. Denne metode er særligt nyttig i situationer, hvor objekter eller områder i billeder ikke kan opdeles skarpt, men har en vis usikkerhed eller overlapning. I denne kontekst skal vi se på, hvordan FCM kan anvendes til at segmentere billeder ved hjælp af MATLAB.

Først og fremmest skal vi forberede de billeder, som skal analyseres. Hvis billederne er gemt i forskellige mapper, skal man være opmærksom på at finde de korrekte stier til filerne. Derefter skal billederne behandles og konverteres til et passende format og størrelse. Det første billede, I1, konverteres til et gråtonebillede med en størrelse på 400 × 500 pixels. Dette er en nødvendig forbehandling, da FCM-algoritmen kræver, at billederne er i en bestemt størrelse og format.

Den næste opgave er at udføre en tilsvarende forbehandling for det andet billede, I2. Dette billede skal have samme størrelse og egenskaber som I1, så det bliver muligt at sammenligne de to billeder i den efterfølgende analyse.

Når begge billeder er blevet forberedt, kan vi visualisere det første billede ved hjælp af funktionen subplot(121). Denne funktion placerer to plots på samme figur i et én-række-to-kolonne format, hvor det første plot vises først. Funktionen imshow() bruges derefter til at vise billedet. Hvis størrelsen på billedet er ukendt, vil systemet automatisk justere størrelsen ved at bruge en tom værdi i argumenterne.

For at kunne anvende FCM-klyngealgoritmen, er det nødvendigt at konvertere billederne fra matrixformat til en to-kolonnevektor. Hver kolonne repræsenterer en billedmatrixs pixelværdier. Efter denne transformation bliver de to billeder, I1 og I2, til et 200.000 × 2 matrix, hvor hver kolonne indeholder alle pixelværdierne for det respektive billede. Dette er en essentiel del af forbehandlingen, da FCM-algoritmen kræver, at inputdataene er i vektormat.

Når dataene er omformateret, kan FCM-klyngealgoritmen anvendes ved hjælp af funktionen fcm(). For denne opgave anvendes fem klynger, som bestemmes af brugerens valg. For at finde det optimale antal klynger kan vi bruge egenskaben OptimalNumClusters, men i dette tilfælde er vi sikre på, at fem klynger er passende, da det er det antal, vi har valgt at bruge i analysen.

Efter at have kørt FCM, får vi en matrix, U, som indeholder de fuzzy grader af afstande til de respektive centerpunkter for alle observationer i de fem klynger. Denne matrix U er den transponerede version af de oprindelige data. For at finde de observationer, som ligger tættere på klyngernes center, bruger vi en for-løkke til at vælge de datapunkter, der har den højeste medlemskabsgrad for hver klynge. Disse datapunkter er de mest relevante for den næste del af analysen, som involverer segmentering af billederne.

For at segmentere billederne i forskellige sektioner eller niveauer, kan brugeren definere specifikke værdier for observationerne eller pixels i hver klynge. Jo mindre værdierne er, desto færre segmenteringer eller niveauer vil der opnås. For eksempel kan vi bruge en aritmetisk sekvens som {1, 0.8, 0.6, …, 0.0} til at tildele værdier til et nyt billede. Sekvensen starter med en værdi på 1.2 og ændres gennem analysen. Dette skaber forskellige segmenter af billedet, der kan bruges til videre analyse.

Når segmenteringsvektoren er blevet tildelt værdier, skal den omformes tilbage til et standardbilledformat, som i dette tilfælde er 400 × 500 pixels. Dette kan gøres ved at bruge den oprindelige størrelse af billederne, som er blevet gemt under forbehandlingen.

Efter at have foretaget segmenteringen, kan det nye billede visualiseres ved hjælp af imshow(), og resultatet vil blive vist på en ny grafisk figur. I dette tilfælde vil vi observere, hvordan segmenteringen ændrer sig med hver iteration af FCM-algoritmen. Hver iteration reducerer objektfunktionens værdi, som angiver forbedringen af clustering-processen. Når den minimale forbedring er opnået, betyder det, at algoritmen har konvergeret, og den optimale segmentering er fundet.

Når segmenteringen er afsluttet, er det muligt at fortsætte med en anden type clustering, som kan være mere velegnet til den specifikke opgave, såsom probabilistisk klyngeanalyse. Her anvendes metoder som Gaussian Mixture Models (GMM) til at cluster data baseret på sandsynligheden for, at de tilhører en bestemt fordeling. GMM kan anvendes til både hård og blød clustering, afhængig af den valgte clustering-kriterie.

GMM kræver, at brugeren specificerer antallet af klynger, som er nødvendigt for at opbygge modellen. Dette antal klynger svarer til antallet af komponenter i den Gaussian Mixture Model. I multivariant Gaussian distribution er variansen beskrevet ved en kovariansmatrix, som tager højde for forholdet mellem de forskellige variabler i datasættet.

Endelig er det vigtigt at forstå, at både FCM og GMM er teknikker, der tillader en mere fleksibel analyse af billeder og data, da de ikke kræver en fast opdeling af data, men i stedet tillader en blødere og mere realistisk opdeling baseret på sandsynligheder og afstande.

Hvordan kan vi finde den optimale handlingsværdi-funktion i forstærkende læring?

For at finde den optimale handlingsværdi-funktion, ofte betegnet som Q*, kræves der en systematisk metode til at estimere de handlinger, som maksimerer den forventede belønning i et givet miljø. Dette kan gøres gennem algoritmer som værdi-iteration og politik-iteration, som begge er grundlæggende tilgange i forstærkende læring (RL). Formålet med disse algoritmer er at beregne en sekvens af funktioner Qk (k = 0, 1, 2, …), som konvergerer mod den optimale funktion Q*. Beregning af disse funktioner kræver forventningsberegninger over hele tilstands-rummet, hvilket i praksis er upraktisk for større eller uendelige Markov-beslutningsprocesser (MDP). Derfor anvender forstærkende læring metoder som sample-gennemsnit og funktionsapproksimationer for at håndtere de store tilstands-handlingsrum.

For at kunne implementere disse algoritmer i praksis kræves en række centrale begreber. Agenten, som er læreren og beslutningstageren i processen, skal vælge handlinger baseret på det givne miljø og de tilstande, den befinder sig i. Handlingen, der vælges, afhænger af en belønning, der returneres af miljøet, som typisk er en diskonteret sum af fremtidige gevinster. Politikken er den funktion, der kortlægger fra tilstande til handlinger, og den skal være den beslutningstagerens retningslinje for at maksimere den langsigtede belønning.

I forstærkende læring er der tre hovedmetoder til at lære den optimale handlingsværdi: Monte Carlo-metoder, Temporal Difference (TD)-metoden og Funktionsapproksimation.

Monte Carlo-metoder anvendes primært i politik-iteration og involverer to trin: politik-evaluering og politik-forbedring. I politik-evaluerings-trinnet bruges Monte Carlo til at estimere den optimale Q-værdi for et givet sæt af tilstand-handlingspar ved at gennemsnitte de belønninger, der opnås gennem episoder. Efter at politikken er blevet evalueret, forbedres den ved at vælge de handlinger, der maksimerer Q-værdierne for hver tilstand. En stor ulempe ved Monte Carlo-metoder er, at de er ineffektive i store, uendelige miljøer, og de kan være langsomme at konvergere, især når der er høj varians i belønningerne.

Temporal Difference Learning (TD) er en anden vigtig metode, der kan bruges til at forudsige den fremtidige belønning baseret på nuværende og tidligere oplevelser. TD anvender en forenklet fremgangsmåde, hvor i stedet for at beregne den samlede fremtidige belønning, estimeres kun forskellen mellem den nuværende og den næste forventede værdi. Denne metode gør det muligt at lære mere effektivt, da det kræver færre beregninger, og det kan tilpasses løbende, når nye oplysninger bliver tilgængelige.

Funktionsapproksimation giver en måde at håndtere store tilstande og handlingsrum på. Ved at anvende lineære funktionsmodeller kan det være muligt at tilpasse den optimale politik uden at skulle beregne for hver enkelt tilstand-handling par. Dette gør det muligt at arbejde med større og mere komplekse miljøer, som kræver vægtning af tilstands-handlingskombinationer. En populær metode i denne kategori er Deep Q-Learning, hvor en neural netværk bruges til at repræsentere Q-værdierne, hvilket giver fremragende resultater i komplekse, stokastiske miljøer.

At vælge hvilken algoritme eller metode, der skal anvendes i forstærkende læring, afhænger stærkt af den type agent, der bruges. Hver metode har sine fordele og begrænsninger, og valget af algoritme bør afspejle de specifikke krav i den anvendte opgave. For eksempel er Monte Carlo-metoder ideelle til episke problemer med begrænset størrelse, mens Temporal Difference læring er bedre til problemer med kontinuerlig tidsudvikling og usikre belønningsstrukturer.

Det er også vigtigt at forstå, at forstærkende læring ikke kun handler om at finde den bedste handlingspolitik i et statisk miljø, men også om at kunne tilpasse sig dynamiske og ukendte ændringer i miljøet. Dette gør det muligt for agenter at lære og tilpasse deres politik baseret på erfaring og opnåelse af feedback, som hele tiden udvikler sig.

Endvidere er det nødvendigt at være opmærksom på, at alle disse metoder er afhængige af en solid forståelse af den underliggende Markov-beslutningsproces (MDP), som beskriver, hvordan agenten interagerer med og påvirker miljøet. At forstå de underliggende dynamikker i MDP’er, som inkluderer transitioner mellem tilstande og belønningsstrukturer, er afgørende for at kunne implementere og effektivisere forstærkende læring. Agenter kan blive mere effektive ved at forstå og optimere deres politik i forhold til de langsigtede konsekvenser af deres handlinger.

Endtext

Hvordan bygger man et tilpasset miljø til forstærkningslæring for en DC-motor i MATLAB?

Når du arbejder med forstærkningslæring (RL) i MATLAB, er det vigtigt at forstå, hvordan du kan oprette og tilpasse dit eget miljø. Dette giver dig mulighed for at anvende specifikke kontrolmekanismer og træne en agent til at udføre ønskede opgaver. I denne proces bliver du nødt til at definere både observationer og handlinger, samt integrere kontrolalgoritmer som PD-kontrol for at styre motorens bevægelser. Denne proces involverer flere trin, der spænder fra at oprette og definere tilpassede funktioner til at implementere læring og træning af en RL-agent.

Først tildeles de to komponenter i systemet—motorens rotationsvinkel og rotationshastighed—to variabler, Theta og ThetaDot. Det er essentielt at holde styr på både den aktuelle position og hastighed af motoren for at kunne beregne dens fremtidige tilstand. Den næste operation er at beregne udgangen, eller ændringen i vinklen (dtheta), ved hjælp af en PD-kontrolformel. Denne formel hjælper med at kontrollere motorens bevægelse og sørge for, at den når sin ønskede position.

Når dtheta er beregnet, kan den næste tilstand bestemmes ved at tilføje den nuværende tilstand til resultatet af en Euler-integration. Euler-metoden anvendes her til at opdatere tilstanden af motoren i hver tidsenhed. Den næste tilstand tildeles som den næste observation, hvilket i dette projekt betyder, at den nye motorposition og hastighed bliver brugt til at generere belønningen i næste trin.

Efter at have defineret motorens tilstande, er det nødvendigt at definere en handling, som agenten kan vælge. I dette tilfælde er handlingsrummet begrænset til to mulige volt: -50V eller 50V, som agenten kan bruge til at kontrollere motoren. Agenten skal vælge mellem disse to handlinger for at opnå den ønskede motorbevægelighed. Den oprindelige handling sættes til 0, som en startværdi.

I den næste fase skal du kalde en brugerdefineret reset-funktion (mResetFunction), som sørger for, at motoren starter i en specifik, initial tilstand. Dette kan for eksempel være en tilfældig position eller en foruddefineret startposition. Derpå kaldes en step-funktion (mStepFunction) for at opdatere miljøets tilstand baseret på agentens handling. Denne funktion returnerer den næste observation, belønningen og en indikator for, om målet er opnået (IsDone). Hvis motorens rotationsfejl er under en defineret tærskelværdi, vil agenten få en normal belønning (RewardNormalMotor), ellers vil den få en straf (PenaltyErrorMotor).

Når de grundlæggende funktioner er skrevet og gemt i en script-fil (motor_function_env.m), kan de kaldes via MATLAB for at oprette et brugerdefineret RL-miljø. Det er vigtigt at sikre, at script-filen med både reset- og step-funktionerne er gemt i samme mappe, så MATLAB kan finde og bruge dem korrekt. Når miljøet er oprettet og valideret ved hjælp af funktionen validateEnvironment(), kan du begynde at bruge det i Reinforcement Learning Designer for at træne agenten.

I Reinforcement Learning Designer kan du importere dit brugerdefinerede miljø og oprette en ny agent. Her kan du vælge en forstærkningslæringsalgoritme som DQN (Deep Q-Network), som er egnet til at træne agenten til at tage beslutninger baseret på de observationer, den modtager. Når agenten er oprettet, kan du starte træningen ved at vælge parametre som f.eks. det maksimale antal episoder, som agenten skal gennemgå, for at lære den ønskede opførsel.

Under træningen justerer agenten sine handlinger baseret på de belønninger og straffe, den modtager. Hvis agenten udfører handlinger, der bringer motorens position tættere på målet, får den en positiv belønning, og den lærer at gentage disse handlinger. Træningen kan justeres ved at ændre algoritmen, optimere indstillingerne for kritikerens optimering og justere læringsparametre som læringsraten og diskonteringsfaktoren.

Når træningen er afsluttet, kan du eksportere den trænede agent og gemme sessionen. Dette giver dig mulighed for at anvende den trænede agent i andre scenarier eller gemme den til senere brug. Ved at gemme sessionen i en fil som trained_func_env.mat, kan du let hente den senere og fortsætte med at arbejde med den.

En vigtig overvejelse, når man arbejder med brugerdefinerede RL-miljøer, er at sikre, at de funktioner, der er oprettet for reset og step, fungerer korrekt sammen med systemet. Det er også væsentligt at teste miljøet grundigt med validateEnvironment(), da eventuelle fejl i miljøet kan føre til problemer i træningsforløbet.

Endvidere bør det bemærkes, at selvom vi arbejder med en simpel motor, som kun har to handlinger (på eller af), kan dette grundlæggende setup udvides til mere komplekse systemer, hvor flere parametre og handlinger skal tages i betragtning.