Como usar classify para separar linhas e círculos
Oct 19 2020
Eu gerei linhas e círculos:
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 colocá-los em um classificador
c = Classify[{lines -> "lines", circles -> "circles"}]
o treinamento foi bem sucedido sem erros, mas ao tentar testar o classificador com:
test = Graphics[Line[{{0, 1}, {0, 2}}], ImageSize -> 10]
c[test]
Recebo o erro:
ClassifierFunction :: mlbddataev: Os dados sendo avaliados não estão formatados corretamente.
E eu não entendo qual é o problema. Alguém pode me dizer como formatar corretamente os dados?
Respostas
6 VitaliyKaurov Oct 19 2020 at 13:02
É assim que eu faria.
- Os dados precisam ser
Association, não uma lista, quando você rotula por lotes inteiros e não por objetos individuais. - Um bom conjunto de treinamento possui dados variáveis, não quase idênticos. Portanto, projete com cuidado
Graphicspara que os círculos e as linhas tenham tamanhos e lugares diferentes. Você também pode adicionar ruído (como pontos aleatórios), mas não fiz isso por simplicidade. - Experimente conjuntos de treinamento maiores para ver uma melhora na precisão.
PerformanceGoal->"Quality"é recomendado para resultados mais precisos.- Neste caso funciona bem com
Graphics, mas em casos mais complexos que você pode sempre considerar a conversãoGraphicsparaImagecomRasterizee usando Redes Neurais .
Conjunto de treinamento:
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}];
Aqui está um exemplo (os quadros são apenas para enfatizar diversos locais de linhas e círculos dentro do Graphics):
Framed /@ RandomSample[lines~Join~circles, 10]
Trem:
c=Classify[<|"lines"->lines,"circles"->circles|>,PerformanceGoal->"Quality"]
Information[c]
Conjunto de teste:
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}];
Medir o desempenho:
cm=ClassifierMeasurements[c,<|"lines"->linesTEST,"circles"->circlesTEST|>]
cm["ConfusionMatrixPlot"]
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas