Come usare classify per separare linee e cerchi
Oct 19 2020
Ho generato linee e cerchi:
lines = Table[
Graphics[
Line[{{RandomInteger[{0, 10}],
RandomInteger[{0, 10}]}, {RandomInteger[{0, 10}],
RandomInteger[{0, 10}]}}], ImageSize -> 10], {x, 1, 20}];
circles =
Table[Graphics[
Circle[{RandomInteger[{0, 10}], RandomInteger[{0, 10}]},
RandomInteger[{0, 20}]], ImageSize -> 10], {x, 1, 20}];
e inseriscili in un classificatore
c = Classify[{lines -> "lines", circles -> "circles"}]
la formazione ha avuto successo senza errori, ma durante il tentativo di testare il classificatore con:
test = Graphics[Line[{{0, 1}, {0, 2}}], ImageSize -> 10]
c[test]
Ottengo l'errore:
ClassifierFunction :: mlbddataev: i dati valutati non sono formattati correttamente.
E non capisco quale sia il problema. Qualcuno può dirmi come formattare correttamente i dati?
Risposte
6 VitaliyKaurov Oct 19 2020 at 13:02
Questo è il modo in cui lo farei.
- I dati devono essere
Association, non un elenco, quando si etichetta in base a interi batch e non singoli oggetti. - Un buon set di allenamento ha dati variabili, non quasi identici. Quindi, progetta attentamente in
Graphicsmodo che cerchi e linee siano di dimensioni diverse e in luoghi diversi. Puoi anche aggiungere rumore (come punti casuali), ma non l'ho fatto per semplicità. - Sperimenta con set di allenamento più grandi per vedere un miglioramento della precisione.
PerformanceGoal->"Quality"è consigliato per risultati più accurati.- Questo caso funziona bene con
Graphics, ma nei casi più complessi si può sempre prendere in considerazione la conversioneGraphicsaImageconRasterizee l'utilizzo di reti neurali .
Set di allenamento:
lines = ParallelTable[Graphics[{Thick,Line[RandomReal[10,{2,2}]]},
ImageSize -> 50,PlotRange->{{0,10},{0,10}}], {x, 1, 100}];
circles = ParallelTable[Graphics[{Thick,Circle[RandomReal[{3,7},2], RandomReal[{1,3}]]},
ImageSize -> 50,PlotRange->{{0,10},{0,10}}], {x, 1, 100}];
Ecco un esempio (i fotogrammi servono solo a sottolineare le diverse posizioni di linee e cerchi all'interno di Graphics):
Framed /@ RandomSample[lines~Join~circles, 10]
Treno:
c=Classify[<|"lines"->lines,"circles"->circles|>,PerformanceGoal->"Quality"]
Information[c]
Set di prova:
linesTEST=ParallelTable[Graphics[{Thick,Line[RandomReal[10,{2,2}]]},
ImageSize -> 100,PlotRange->{{0,10},{0,10}}], {x, 1, 20}];
circlesTEST = ParallelTable[Graphics[{Thick,Circle[RandomReal[{3,7},2], RandomReal[{1,3}]]},
ImageSize -> 50,PlotRange->{{0,10},{0,10}}], {x, 1, 20}];
Misura le prestazioni:
cm=ClassifierMeasurements[c,<|"lines"->linesTEST,"circles"->circlesTEST|>]
cm["ConfusionMatrixPlot"]