Aanbevolen procedures voor het gebruik van de Multivariate Anomaly Detector-API
Belangrijk
Vanaf 20 september 2023 kunt u geen nieuwe Anomaly Detector-resources maken. De Anomaly Detector-service wordt op 1 oktober 2026 buiten gebruik gesteld.
Dit artikel bevat richtlijnen voor aanbevolen procedures die moeten worden gevolgd bij het gebruik van de MVAD-API's (Multivariate Anomaly Detector). In deze zelfstudie gaat u:
- API-gebruik: informatie over het gebruik van MVAD zonder fouten.
- Data engineering: leer hoe u uw gegevens het beste kunt koken, zodat MVAD met een betere nauwkeurigheid presteert.
- Veelvoorkomende valkuilen: leer hoe u veelvoorkomende valkuilen kunt voorkomen die klanten tegenkomen.
- Veelgestelde vragen: Meer informatie over antwoorden op veelgestelde vragen.
API-gebruik
Volg de instructies in deze sectie om fouten te voorkomen tijdens het gebruik van MVAD. Als u nog steeds fouten krijgt, raadpleegt u de volledige lijst met foutcodes voor uitleg en acties die u moet ondernemen.
Invoerparameters
Vereiste parameters
Deze drie parameters zijn vereist voor trainings- en deductie-API-aanvragen:
source
- De koppeling naar uw zip-bestand in Azure Blob Storage met Shared Access Signatures (SAS).startTime
- De begintijd van de gegevens die worden gebruikt voor training of deductie. Als het eerder is dan de werkelijke vroegste tijdstempel in de gegevens, wordt de werkelijke vroegste tijdstempel gebruikt als het beginpunt.endTime
- De eindtijd van de gegevens die worden gebruikt voor training of deductie die later dan of gelijk aanstartTime
moet zijn. AlsendTime
dit later is dan de werkelijke laatste tijdstempel in de gegevens, wordt de werkelijke laatste tijdstempel gebruikt als het eindpunt. AlsendTime
dit gelijk is aanstartTime
, betekent dit deductie van één gegevenspunt dat vaak wordt gebruikt in streamingscenario's.
Optionele parameters voor trainings-API
Andere parameters voor de trainings-API zijn optioneel:
slidingWindow
- Hoeveel gegevenspunten worden gebruikt om afwijkingen te bepalen. Een geheel getal tussen 28 en 2.880. De standaardwaarde is 300. AlsslidingWindow
dit het geval isk
voor modeltraining, moeten ten minstek
punten toegankelijk zijn vanuit het bronbestand tijdens deductie om geldige resultaten te verkrijgen.MVAD neemt een segment van gegevenspunten om te bepalen of het volgende gegevenspunt een anomalie is. De lengte van het segment is
slidingWindow
. Houd rekening met twee dingen bij het kiezen van eenslidingWindow
waarde:- De eigenschappen van uw gegevens: of deze periodiek en de steekproeffrequentie zijn. Wanneer uw gegevens periodiek zijn, kunt u de lengte van 1 - 3 cycli instellen als de
slidingWindow
. Wanneer uw gegevens een hoge frequentie hebben (kleine granulariteit), zoals minuutniveau of tweede niveau, kunt u een relatief hogere waardeslidingWindow
instellen. - De afweging tussen trainings-/deductietijd en mogelijke invloed op de prestaties. Een grotere
slidingWindow
kan leiden tot langere trainings-/deductietijd. Er is geen garantie dat grotereslidingWindow
s leiden tot nauwkeurigheidswinsten. Een kleinslidingWindow
model kan ertoe leiden dat het model moeilijk kan worden geconvergeerd naar een optimale oplossing. Het is bijvoorbeeld moeilijk om afwijkingen te detecteren wanneerslidingWindow
er slechts twee punten zijn.
- De eigenschappen van uw gegevens: of deze periodiek en de steekproeffrequentie zijn. Wanneer uw gegevens periodiek zijn, kunt u de lengte van 1 - 3 cycli instellen als de
alignMode
- Meerdere variabelen (tijdreeksen) uitlijnen op tijdstempels. Er zijn twee opties voor deze parameter enInner
, enOuter
de standaardwaarde isOuter
.Deze parameter is essentieel wanneer er sprake is van een onjuiste uitlijning tussen tijdstempelreeksen van de variabelen. Het model moet de variabelen uitlijnen op dezelfde tijdstempelreeks voordat het verder wordt verwerkt.
Inner
betekent dat het model alleen detectieresultaten rapporteert op tijdstempels waarop elke variabele een waarde heeft, dat wil zeggen het snijpunt van alle variabelen.Outer
betekent dat het model detectieresultaten rapporteert op tijdstempels waarop een variabele een waarde heeft, dat wil zeggen de samenvoeging van alle variabelen.Hier volgt een voorbeeld om verschillende
alignModel
waarden uit te leggen.Variabele-1
timestamp waarde 2020-11-01 1 2020-11-02 2 2020-11-04 4 2020-11-05 5 Variabele-2
timestamp waarde 2020-11-01 1 2020-11-02 2 2020-11-03 3 2020-11-04 4 Inner
twee variabelen samenvoegentimestamp Variabele-1 Variabele-2 2020-11-01 1 1 2020-11-02 2 2 2020-11-04 4 4 Outer
twee variabelen samenvoegentimestamp Variabele-1 Variabele-2 2020-11-01 1 1 2020-11-02 2 2 2020-11-03 nan
3 2020-11-04 4 4 2020-11-05 5 nan
fillNAMethod
- De samengevoegde tabel invullennan
. Er ontbreken mogelijk waarden in de samengevoegde tabel en deze moeten correct worden verwerkt. We bieden verschillende methoden om ze op te vullen. De opties zijnLinear
,Previous
, ,Subsequent
enZero
enFixed
de standaardwaarde isLinear
.Optie Wijze Linear
Waarden doorvoeren nan
door lineaire interpolatiePrevious
Geef de laatste geldige waarde door om hiaten te vullen. Voorbeeld: [1, 2, nan, 3, nan, 4]
->[1, 2, 2, 3, 3, 4]
Subsequent
Gebruik de volgende geldige waarde om hiaten te vullen. Voorbeeld: [1, 2, nan, 3, nan, 4]
->[1, 2, 3, 3, 4, 4]
Zero
Vul nan
waarden in met 0.Fixed
Vul nan
waarden in met een opgegeven geldige waarde die moet worden opgegeven inpaddingValue
.paddingValue
- Opvullingswaarde wordt gebruikt om in dat geval op te vullennan
fillNAMethod
Fixed
en moet in dat geval worden opgegeven. In andere gevallen is dit optioneel.displayName
- Dit is een optionele parameter die wordt gebruikt om modellen te identificeren. U kunt deze bijvoorbeeld gebruiken om parameters, gegevensbronnen en andere metagegevens over het model en de bijbehorende invoergegevens te markeren. De standaardwaarde is een lege tekenreeks.
Invoergegevensschema
MVAD detecteert afwijkingen van een groep met metrische gegevens en we noemen elke metrische waarde een variabele of een tijdreeks.
U kunt het voorbeeldgegevensbestand van Microsoft downloaden om het geaccepteerde schema te controleren van: https://aka.ms/AnomalyDetector/MVADSampleData
Elke variabele moet twee en slechts twee velden
timestamp
bevatten envalue
moet worden opgeslagen in een csv-bestand (door komma's gescheiden waarden).De kolomnamen van het CSV-bestand moeten nauwkeurig
timestamp
envalue
hoofdlettergevoelig zijn.De waarden moeten voldoen aan ISO 8601. Dit
timestamp
value
kunnen gehele getallen of decimalen zijn met een willekeurig aantal decimalen. Een goed voorbeeld van de inhoud van een CSV-bestand:timestamp waarde 2019-04-01T00:00:00Z 5 2019-04-01T00:01:00Z 3,6 2019-04-01T00:02:00Z 4 ... ... Notitie
Als uw tijdstempels uren, minuten en/of seconden hebben, moet u ervoor zorgen dat deze correct worden afgerond voordat u de API's aanroept.
Als uw gegevensfrequentie bijvoorbeeld elke 30 seconden één gegevenspunt moet zijn, maar u tijdstempels ziet, zoals '12:00:01' en '12:00:28', is het een sterk signaal dat u de tijdstempels vooraf moet verwerken naar nieuwe waarden zoals '12:00:00' en '12:00:30'.
Raadpleeg de sectie 'Timestamp round-up' in het document met aanbevolen procedures voor meer informatie.
De naam van het CSV-bestand wordt gebruikt als de naam van de variabele en moet uniek zijn. Bijvoorbeeld 'temperature.csv' en 'humidity.csv'.
Variabelen voor training en variabelen voor deductie moeten consistent zijn. Als u bijvoorbeeld gebruikmaakt van
series_1
,series_2
, ,series_3
enseries_4
series_5
voor training, moet u precies dezelfde variabelen voor deductie opgeven.CSV-bestanden moeten worden gecomprimeerd in een zip-bestand en geüpload naar een Azure Blob-container. Het zip-bestand kan elke gewenste naam hebben.
Mapstructuur
Een veelvoorkomende fout bij het voorbereiden van gegevens is extra mappen in het zip-bestand. Stel dat de naam van het zip-bestand is series.zip
. Na het decomprimeren van de bestanden naar een nieuwe map ./series
, is het juiste pad naar CSV-bestanden ./series/series_1.csv
en kan een verkeerd pad zijn ./series/foo/bar/series_1.csv
.
Het juiste voorbeeld van de mapstructuur na het decomprimeren van het zip-bestand in Windows
.
└── series
├── series_1.csv
├── series_2.csv
├── series_3.csv
├── series_4.csv
└── series_5.csv
Een onjuist voorbeeld van de mapstructuur na het decomprimeren van het zip-bestand in Windows
.
└── series
└── series
├── series_1.csv
├── series_2.csv
├── series_3.csv
├── series_4.csv
└── series_5.csv
Data-engineering
Nu kunt u uw code zonder fouten uitvoeren met MVAD-API's. Wat kan er worden gedaan om de nauwkeurigheid van uw model te verbeteren?
Gegevenskwaliteit
- Naarmate het model normale patronen van historische gegevens leert, moeten de trainingsgegevens de algemene normale status van het systeem vertegenwoordigen. Het is moeilijk voor het model om deze soorten patronen te leren als de trainingsgegevens vol afwijkingen zijn. Een empirische drempelwaarde van abnormale snelheid is 1% en lager voor een goede nauwkeurigheid.
- Over het algemeen moet de ontbrekende waardeverhouding van trainingsgegevens lager zijn dan 20%. Te veel ontbrekende gegevens kunnen tot gevolg hebben dat automatisch ingevulde waarden (meestal lineaire waarden of constante waarden) worden geleerd als normale patronen. Dit kan ertoe leiden dat echte (ontbrekende) gegevenspunten worden gedetecteerd als afwijkingen.
Gegevenshoeveelheid
Het onderliggende model van MVAD heeft miljoenen parameters. Er is een minimum aantal gegevenspunten nodig om een optimale set parameters te leren. De empirische regel is dat u 5000 of meer gegevenspunten (tijdstempels) per variabele moet opgeven om het model te trainen voor een goede nauwkeurigheid. Hoe meer trainingsgegevens, hoe nauwkeuriger. In gevallen waarin u echter niet zoveel gegevens kunt verzamelen, raden we u nog steeds aan om met minder gegevens te experimenteren en te zien of de gekraakte nauwkeurigheid nog steeds acceptabel is.
Telkens wanneer u de deductie-API aanroept, moet u ervoor zorgen dat het brongegevensbestand precies genoeg gegevenspunten bevat. Dat is normaal gesproken
slidingWindow
+ het aantal gegevenspunten dat echt deductieresultaten nodig heeft. In een streaming-case bijvoorbeeld wanneer u telkens wanneer u een nieuwe tijdstempel wilt deductie uitvoeren, kan het gegevensbestand alleen het voorloop-plus-EN-gegevenspuntslidingWindow
bevatten. Vervolgens kunt u doorgaan en een ander zip-bestand maken met hetzelfde aantal gegevenspunten (slidingWindow
+1), maar één stap naar de 'rechterkant' verplaatsen en verzenden voor een andere deductietaak.Alles wat buiten dat of "voor" het voorloopschuifvenster valt, heeft helemaal geen invloed op het deductieresultaat en kan alleen een downgrade van de prestaties veroorzaken. Alles hieronder kan leiden tot een
NotEnoughInput
fout.
Round-up van tijdstempel
In een groep variabelen (tijdreeksen) kan elke variabele worden verzameld uit een onafhankelijke bron. De tijdstempels van verschillende variabelen kunnen inconsistent zijn met elkaar en met de bekende frequenties. Hier volgt een eenvoudig voorbeeld.
Variabele-1
timestamp | waarde |
---|---|
12:00:01 | 1.0 |
12:00:35 | 1.5 |
12:01:02 | 0,9 |
12:01:31 | 2.2 |
12:02:08 | 1.3 |
Variabele-2
timestamp | waarde |
---|---|
12:00:03 | 2.2 |
12:00:37 | 2.6 |
12:01:09 | 1.4 |
12:01:34 | 1,7 |
12:02:04 | 2.0 |
We hebben twee variabelen verzameld van twee sensoren die elke 30 seconden één gegevenspunt verzenden. De sensoren verzenden echter geen gegevenspunten met een strikte even frequentie, maar soms eerder en soms later. Omdat MVAD rekening houdt met correlaties tussen verschillende variabelen, moeten tijdstempels correct worden uitgelijnd, zodat de metrische gegevens de toestand van het systeem correct kunnen weerspiegelen. In het bovenstaande voorbeeld moeten tijdstempels van variabele 1 en variabele 2 goed worden afgerond op de frequentie vóór de uitlijning.
Laten we eens kijken wat er gebeurt als ze niet vooraf worden verwerkt. Als we zijn ingesteld alignMode
op ( Outer
wat betekent samenvoeging van twee sets), is de samengevoegde tabel:
timestamp | Variabele-1 | Variabele-2 |
---|---|---|
12:00:01 | 1.0 | nan |
12:00:03 | nan |
2.2 |
12:00:35 | 1.5 | nan |
12:00:37 | nan |
2.6 |
12:01:02 | 0,9 | nan |
12:01:09 | nan |
1.4 |
12:01:31 | 2.2 | nan |
12:01:34 | nan |
1,7 |
12:02:04 | nan |
2.0 |
12:02:08 | 1.3 | nan |
nan
geeft ontbrekende waarden aan. De samengevoegde tabel is natuurlijk niet wat u zou verwachten. Variabele 1 en variabele 2 interleave, en het MVAD-model kan geen informatie over correlaties extraheren. Als dit is ingesteld alignMode
Inner
, is de samengevoegde tabel leeg omdat er geen algemene tijdstempel is in variabele 1 en variabele 2.
Daarom moeten de tijdstempels van variabele 1 en variabele 2 vooraf worden verwerkt (afgerond op de dichtstbijzijnde tijdstempels van 30 seconden) en de nieuwe tijdreeksen zijn:
Variabele-1
timestamp | waarde |
---|---|
12:00:00 | 1.0 |
12:00:30 | 1.5 |
12:01:00 | 0,9 |
12:01:30 | 2.2 |
12:02:00 | 1.3 |
Variabele-2
timestamp | waarde |
---|---|
12:00:00 | 2.2 |
12:00:30 | 2.6 |
12:01:00 | 1.4 |
12:01:30 | 1,7 |
12:02:00 | 2.0 |
De samengevoegde tabel is nu redelijker.
timestamp | Variabele-1 | Variabele-2 |
---|---|---|
12:00:00 | 1.0 | 2.2 |
12:00:30 | 1.5 | 2.6 |
12:01:00 | 0,9 | 1.4 |
12:01:30 | 2.2 | 1,7 |
12:02:00 | 1.3 | 2.0 |
Waarden van verschillende variabelen bij dichte tijdstempels zijn goed uitgelijnd en het MVAD-model kan nu correlatie-informatie extraheren.
Beperkingen
Er zijn enkele beperkingen in zowel de trainings- als deductie-API's. Houd rekening met deze beperkingen om fouten te voorkomen.
Algemene beperkingen
- Schuifvenster: 28-2880 tijdstempels, standaard is 300. Stel voor periodieke gegevens de lengte van 2-4 cycli in als het schuifvenster.
- Variabelenummers: voor training en batchdeductie, maximaal 301 variabelen.
Trainingsbeperkingen
- Tijdstempels: maximaal 1000000. Te weinig tijdstempels kunnen de modelkwaliteit verlagen. Raad aan om meer dan 5000 tijdstempels te hebben.
- Granulariteit: de minimale granulariteit is
per_second
.
Beperkingen voor batchdeductie
- Tijdstempels: maximaal 20000, ten minste 1 schuifvensterlengte.
Beperkingen voor streamingdeductie
- Tijdstempels: maximaal 2880, ten minste 1 schuifvensterlengte.
- Tijdstempels detecteren: van 1 tot 10.
Modelkwaliteit
Hoe omgaan met fout-positief en fout-negatief in echte scenario's?
We hebben ernst opgegeven die de significantie van afwijkingen aangeeft. Fout-positieven kunnen worden gefilterd door een drempelwaarde in te stellen voor de ernst. Soms worden er te veel fout-positieven weergegeven wanneer er patroonverschuivingen zijn in de deductiegegevens. In dergelijke gevallen moet een model mogelijk opnieuw worden getraind op nieuwe gegevens. Als de trainingsgegevens te veel afwijkingen bevatten, kunnen er fout-negatieven zijn in de detectieresultaten. Dit komt doordat het model patronen van de trainingsgegevens en afwijkingen leert, kan leiden tot vooroordelen in het model. Het opschonen van gegevens kan dus helpen bij het verminderen van fout-negatieven.
Hoe kunt u schatten welk model het beste kan worden gebruikt op basis van trainingsverlies en validatieverlies?
Over het algemeen is het moeilijk om te bepalen welk model het beste is zonder een gelabelde gegevensset. We kunnen echter gebruikmaken van het trainings- en validatieverlies om een ruwe schatting te maken en die slechte modellen te negeren. Eerst moeten we kijken of trainingsverlies convergeren. Uiteenlopende verliezen geven vaak een slechte kwaliteit van het model aan. Ten tweede kunnen verlieswaarden helpen bepalen of underfitting of overfitting plaatsvindt. Modellen die underfitting of overfitting zijn, hebben mogelijk geen gewenste prestaties. Ten derde, hoewel de definitie van de verliesfunctie niet rechtstreeks de detectieprestaties weergeeft, kunnen verlieswaarden een hulphulpprogramma zijn om de kwaliteit van het model te schatten. Lage verlieswaarde is een noodzakelijke voorwaarde voor een goed model, dus we kunnen modellen met hoge verlieswaarden negeren.
Veelvoorkomende valkuilen
Naast de foutcodetabel hebben we geleerd van klanten zoals u enkele veelvoorkomende valkuilen tijdens het gebruik van MVAD-API's. Deze tabel helpt u om deze problemen te voorkomen.
Valkuil | Gevolg | Uitleg en oplossing |
---|---|---|
Tijdstempels in trainingsgegevens en/of deductiegegevens zijn niet naar boven afgerond om te voldoen aan de respectieve gegevensfrequentie van elke variabele. | De tijdstempels van de deductieresultaten zijn niet zoals verwacht: te weinig tijdstempels of te veel tijdstempels. | Raadpleeg de round-up van timestamp. |
Te veel afwijkende gegevenspunten in de trainingsgegevens | De nauwkeurigheid van het model wordt negatief beïnvloed omdat er afwijkende gegevenspunten als normale patronen tijdens de training worden behandeld. | Empirisch kunt u de abnormale snelheid met of minder dan 1% behouden. |
Te weinig trainingsgegevens | De nauwkeurigheid van het model is aangetast. | Empirisch vereist het trainen van een MVAD-model 15.000 of meer gegevenspunten (tijdstempels) per variabele om een goede nauwkeurigheid te behouden. |
Alle gegevenspunten als isAnomaly =true afwijkingen gebruiken |
Te veel fout-positieven | U moet zowel isAnomaly als severity (of score ) gebruiken om afwijkingen die niet ernstig zijn uit te luizen en (optioneel) groepering te gebruiken om de duur van de afwijkingen te controleren om willekeurige ruis te onderdrukken. Raadpleeg de sectie Veelgestelde vragen hieronder voor het verschil tussen severity en score . |
Submappen worden in het gegevensbestand gezipt voor training of deductie. | De CSV-gegevensbestanden in submappen worden genegeerd tijdens de training en/of deductie. | Er zijn geen submappen toegestaan in het zip-bestand. Raadpleeg de mapstructuur voor meer informatie. |
Te veel gegevens in het deductiegegevensbestand: bijvoorbeeld het comprimeren van alle historische gegevens in het zip-bestand van deductiegegevens | Er worden mogelijk geen fouten weergegeven, maar u ondervindt verminderde prestaties wanneer u het zip-bestand probeert te uploaden naar Azure Blob en wanneer u deductie probeert uit te voeren. | Raadpleeg de hoeveelheid gegevens voor meer informatie. |
Anomaly Detector-resources maken in Azure-regio's die MVAD nog niet ondersteunen en MVAD-API's aanroepen | Er wordt een fout 'resource niet gevonden' weergegeven tijdens het aanroepen van de MVAD-API's. | Tijdens de preview-fase is MVAD alleen beschikbaar voor beperkte regio's. Maak een bladwijzer voor wat er nieuw is in Anomaly Detector om up-to-date te blijven met de implementaties van MVAD-regio's. U kunt ook een GitHub-probleem indienen of contact met ons opnemen om AnomalyDetector@microsoft.com specifieke regio's aan te vragen. |
Veelgestelde vragen
Hoe werkt MVAD-schuifvenster?
Laten we twee voorbeelden gebruiken om te leren hoe het schuifvenster van MVAD werkt. Stel dat u = 1440 hebt ingesteld slidingWindow
en dat uw invoergegevens een granulariteit van één minuut hebben.
Streamingscenario: u wilt voorspellen of het ONE-gegevenspunt op '2021-01-02T00:00:00Z' afwijkend is. Uw
startTime
enendTime
zijn dezelfde waarde ('2021-01-02T00:00:00Z'). Uw deductiegegevensbron moet echter ten minste 1440 + 1 tijdstempels bevatten. Omdat MVAD de voorloopgegevens vóór het doelgegevenspunt neemt ('2021-01-02T00:00:00Z') om te bepalen of het doel een anomalie is. De lengte van de benodigde voorloopgegevens isslidingWindow
of 1440 in dit geval. 1.440 = 60 * 24, dus uw invoergegevens moeten beginnen vanaf uiterlijk "2021-01-01T00:00:00Z".Batch-scenario: u hebt meerdere doelgegevenspunten om te voorspellen. Je
endTime
zal groter zijn dan jestartTime
. Deductie in dergelijke scenario's wordt uitgevoerd op een 'bewegend venster'. MVAD gebruikt bijvoorbeeld gegevens van2021-01-01T00:00:00Z
tot2021-01-01T23:59:00Z
(inclusief) om te bepalen of gegevens2021-01-02T00:00:00Z
afwijkend zijn. Vervolgens wordt verder aangegeven en worden gegevens van2021-01-01T00:01:00Z
(2021-01-02T00:00:00Z
inclusief) naar (inclusief) gebruikt om te bepalen of gegevens2021-01-02T00:01:00Z
afwijkend zijn. Het gaat op dezelfde manier verder (waarbij 1440 gegevenspunten moeten worden vergeleken) tot de laatste tijdstempel die is opgegeven doorendTime
(of de werkelijke laatste tijdstempel). Daarom moet uw deductiegegevensbron gegevens bevatten die beginnen vanstartTime
-slidingWindow
en idealiter gegevens bevatten in totaalslidingWindow
+ ().endTime
-startTime
Wat is het verschil tussen severity
en score
?
Normaal gesproken raden we u aan om te gebruiken severity
als filter om 'anomalieën' uit te zaaien die niet zo belangrijk zijn voor uw bedrijf. Afhankelijk van uw scenario en gegevenspatroon hebben deze afwijkingen die minder belangrijk zijn vaak relatief lagere severity
waarden of zelfstandige (niet-aaneengeslagen) hoge severity
waarden, zoals willekeurige pieken.
In gevallen waarin u meer geavanceerde regels nodig hebt dan drempelwaarden voor severity
of de duur van continue hoge severity
waarden, kunt u gebruiken score
om krachtigere filters te bouwen. Als u begrijpt hoe MVAD gebruikt score
om afwijkingen te bepalen, kan dit helpen:
We overwegen of een gegevenspunt afwijkend is vanuit zowel globaal als lokaal perspectief. Als score
een tijdstempel hoger is dan een bepaalde drempelwaarde, wordt de tijdstempel gemarkeerd als een anomalie. Als score
deze lager is dan de drempelwaarde, maar relatief hoger is in een segment, wordt deze ook gemarkeerd als anomalie.