Error: Improper assignment... < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 09:48 Fr 20.03.2015 | Autor: | Rocky14 |
Hallo Leute,
ich soll im Rahmen einer Projektarbeit einige Beispielsortimente mit Optics clustern. Ich habe im Internet dazu einen fertig implementierten Algorithmus gefunden:
% Written by Michal Daszykowski
% Department of Chemometrics, Institute of Chemistry,
% The University of Silesia
% December 2004
function [RD,CD,order]=optics(x,k)
[m,n]=size(x);
CD=zeros(1,m);
RD=ones(1,m)*10^10;
% Calculate Core Distances
for i=1:m
D=sort(dist(x(i,:),x));
CD(i)=D(k+1);
end
order=[];
seeds=[1:m];
ind=1;
while ~isempty(seeds)
ob=seeds(ind);
seeds(ind)=[];
order=[order ob];
mm=max([ones(1,length(seeds))*CD(ob);dist(x(ob,:),x(seeds,:))]);
ii=(RD(seeds))>mm;
RD(seeds(ii))=mm(ii);
[i1 ind]=min(RD(seeds));
end
RD(1)=max(RD(2:m))+.1*max(RD(2:m));
function [D]=dist(i,x)
% function: [D]=dist(i,x)
%
% Aim:
% Calculates the Euclidean distances between the i-th object and all objects in x
% Input:
% i - an object (1,n)
% x - data matrix (m,n); m-objects, n-variables
%
% Output:
% D - Euclidean distance (m,1)
[m,n]=size(x);
D=(sum((((ones(m,1)*i)-x).^2)'));
if n==1
D=abs((ones(m,1)*i-x))';
end
Leider ist mir noch nicht so ganz klar, was da gemacht wird. Was generell bei Optics gemacht wird, habe ich verstanden. Nur finde ich die Schritte hier leider nicht wieder. Da ich ein absoluter Matlab Neuling bin, wollte ich erstmal versuchen, den Code zum Laufen zu bringen und mir erst dann Gedanken zu machen, ob er überhaupt stimmt. Einfach nur so zur Übung. Leider erhalte ich folgende Fehlermeldung:
>> OpticsAlgorithmus(Beispielsortiment,3)
Improper assignment with rectangular empty matrix.
Error in OpticsAlgorithmus (line 25)
RD(1) = max(RD(2:m))+.1*max(RD(2:m));
Habt ihr vielleicht eine Idee, wie ich das lösen kann?
Falls ihr mehr Infos zu Optics benötigt, sagt mir Bescheid :)
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:48 Fr 20.03.2015 | Autor: | Rocky14 |
Ich weiß nicht warum - ich habe dieselbe Funktion jetzt nochmal unter einem anderen Namen abgespeichert und erhalte nun folgendes Ergebnis:
optics(x,4)
ans =
Columns 1 through 13
10.8113 0.1440 0.2817 0.0437 0.5044 0.1875 0.0371 0.0459 0.4629 0.2002 0.1627 0.3620 0.1282
Columns 14 through 26
0.0995 0.0296 0.0371 0.0286 0.1087 0.1282 0.1282 0.0195 0.1057 0.0195 0.1092 0.0459 0.1282
Columns 27 through 39
0.0192 0.0286 0.0459 0.1204 0.0609 0.0579 0.0882 0.1222 0.2290 0.0877 0.1167 0.1081 0.1630
Columns 40 through 52
0.2625 0.6593 0.1222 0.1207 0.2588 0.0609 0.1414 0.1167 0.3125 0.0882 0.0530 0.9040 0.1188
Columns 53 through 65
0.1188 0.1222 0.0877 0.1035 0.1212 0.0882 0.1118 9.8284 0.1414 0.0530 0.1222 0.2815 0.0609
Columns 66 through 70
0.0882 0.0530 0.1559 0.0921 0.1414
Das ist aber leider nicht das, was rausgeworfen werden sollte:
Output:
% RD - vector with reachability distances (m,1)
% CD - vector with core distances (m,1)
% order - vector specifying the order of objects (1,m)
Offensichtlich habe ich nur order als Ergebnis erhalten :(
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 08:12 Mo 23.03.2015 | Autor: | naf |
Hallo Rocky!
Ich denke Du solltest dir erstmal kurz die Grundzüge von Matlab aneignen. Der Grund, warum du jetzt nicht alle Mengen von der Funktion zurück kriegst ist, dass Du diese von der Funktion gar nocht verlangt hast:
bei Matlab kann rine funktion sowohl mehrere Parameter entgegen nehmen wie auch zurückgeben: [result1, result2, result3] = funktionsname(argument1,argument2,...)
wenn du z.B von der Funktion das zweite und dritte Resultat möchtest aber das erste nicht, schreibst du;
[~,B,C]=funktionsname(1,2,3)
wenn du nur
A=funktionsname(1,2,3) schreibst, kriegst du entsprechend nur A.
Konkret für deinen Fall:
[RD,CD,order]=OpticsAlgorithmus(argumente,...)
dann wird das klappen.
Gruss
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:36 Mo 23.03.2015 | Autor: | Rocky14 |
Vielen vielen Dank für deine Hilfe! Es hat geklappt!
Weißt du zufällig auch, wie ich mir diese Ergebnisse jetzt als Graph zeichnen lassen kann? plot und figure funktionieren nicht.
Lese mich, wie von dir geraten, zur Zeit in Matlab ein, aber habe noch nichts Passendes gefunden ;)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:07 Mo 23.03.2015 | Autor: | Rocky14 |
Ich habe jetzt durch folgenden Befehl eine Grafik erhalten.
subplot(2,2,1);
[RD,CD,order] = optics(Beispielsortiment,2);
bar(RD(order))
title('mind 2 pro Cluster');
subplot(2,2,2);
[RD,CD,order] = optics(Beispielsortiment,3);
bar(RD(order))
title('mind 3 pro Cluster');
subplot(2,2,3);
[RD,CD,order] = optics(Beispielsortiment,4);
bar(RD(order))
title('mind 4 pro Cluster');
subplot(2,2,4);
[RD,CD,order] = optics(Beispielsortiment,5);
bar(RD(order))
title('mind 5 pro Cluster');
Damit erhalte ich eine Grafik "4 in 1".
Meine Frage: Was macht bar(RD(order)) genau?
Offensichtlich erhalte ich ein Balkendiagramm. Werden in diesem Balkendiagramm RD und order miteinander verknüpft?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:16 Mo 23.03.2015 | Autor: | naf |
Das klingt doch schon mal gut. Ich wollte dich even auf folgende Seite aufmerksam machen: https://github.com/alexgkendall/OPTICS_Clustering?files=1
aber du scheinst den plot ja schon selber in den griff bekommen zu haben. Ansonsten schau dir mal die Matlab beispiele der funktionen "scatter" und "dendrogram" an.
zu deiner frage:
order ist eine liste von indizes und du greifst damit auf die werte an den entsprechenden stellen von RD zu.
simples beispiel:
du hast ein vektor A = [6,1,2,4,3] und willst auf den wert an stelle zwei zugreifen, das machst du mit A(2) was dann also 1 wär.(ja, matlab startet bei 1 ubd bicht wie die meisten programmiersprachen bei 0) Du kannst aber auch an mehrere stelle. Zugreifen zum beispiel die dritte und vierte: A([3,4]) was dir dann [2,4] gibt. Du kannst dafür aber auch eine variable verwenden: b=[3,4] und dann gibt A(b) entsprechend [2,4]. Dein order ist also ein vektor von indizes mit der gleichen länge/anzahl einträgen wie RD. In diesem fall zum beispiel möchten wir nach grösse ordnen, das heisst wir definieren c=[2,3,5,4,1] (hab ich jetzt manuell geschaut an weöcher position jeweils die nächst tiefere ziffer steht. Dann wär A(c) also [1,2,3,4,6].
genau das macht die optics funktion
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 09:23 Di 24.03.2015 | Autor: | Rocky14 |
Vielen Dank für deine Hilfe.
Ich habe auch mal den Link ausprobiert - aber erhalte nur Fehlermeldungen.
Und zwar folgende:
>> [SetOfCluster, RD, CD, order] = cluster_optics3(Beispielsortiment, 4,15)
Undefined function 'cluster_optics3' for input arguments of type 'table'.
>> [SetOfCluster, RD, CD, order] = cluster_optics3(Beispielsortiment1, 4,15)
Undefined function 'cluster_optics3' for input arguments of type 'double'.
>> [SetOfClusters, RD, CD, order] = cluster_optics3(Beispielsortiment1, 4,15);
bar(RD(order));
figure;
%Cycle through all clusters
for i = 2:length(SetOfClusters)
bar(RD(order(SetOfClusters(i).start:SetOfCluster(i).end)));
pause(0.5)
end
Undefined function 'cluster_optics3' for input arguments of type 'double'.
Muss ich das Beispielsortiment irgendwie anders speichern?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:20 Do 26.03.2015 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 09:32 Di 24.03.2015 | Autor: | Rocky14 |
Ich habe festgestellt, dass ich vergessen habe, den "Current Folder" zu laden. Jetzt macht das Programm zwar was, aber am Ende wirft es trotzdem nur Fehler raus:
[SetOfClusters, RD, CD, order] = cluster_optics3(Beispielsortiment1, 4,15);
bar(RD(order));
figure;
%Cycle through all clusters
for i = 2:length(SetOfClusters)
bar(RD(order(SetOfClusters(i).start:SetOfCluster(i).end)));
pause(0.5)
end
Calculating reachability for all points.
Error using load
Number of columns on line 38 of ASCII file optics.m must be the same as previous lines.
Error in cluster_optics3 (line 6)
load('optics.m');
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:20 Do 26.03.2015 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|