Learning Julia-Language (online mithilfe der Juliabox + offline)

Ein guter Startplatz für meine weiteren Xpeditionen in die Julia-Programmierung




Zwei Video-Tutorials

Ja, warum nicht? Machen wir's uns doch einfach mal bequem.











+~~~~~~~~~~~~~~~+


k means ...?

 

Ich habe keine Probleme damit zuzugeben, dass meine intellektuellen Fähigkeiten nicht so weit reichen,
den Algorithmus k-means einfach so anhand der vorhandenen (vermutlich leichten) Erklärungen, wie sie zum Beispiel die Wikipedia (k-Means-Algorithmus – Wikipedia) bietet, zu verstehen.¹¹
Ich arbeite (immer noch) dran.
Aber ich komme der Sache immer/schon näher.


Code

 

# Bei Bedarf & natürlich nur einmal
# using Pkg
 # Pkg.add("DataFrames")
# Pkg.add("Plots")
#Pkg.add("Clustering")

using DataFrames
using Plots
using Clustering

plot(size=(500,500),leg=false)

X = filter_houses[[:beds,:sq__ft]]
X = convert(Array{Float64}, X)
X = X'
k = 6
C = kmeans(X,k)
df = DataFrame(cluster = C.assignments,city = filter_houses[:city],
           beds = filter_houses[:beds],
           sq__ft = filter_houses[:sq__ft],
           zip = filter_houses[:zip])
clusters_figure = plot()
for i = 1:k
           clustered_houses = df[df[:cluster].== i,:]
           xvals = clustered_houses[:beds]
           yvals = clustered_houses[:sq__ft]
           scatter!(clusters_figure,xvals,yvals,markersize=4)
       end
xlabel!("Betten")
ylabel!("Quadratmeter")
display(clusters_figure)

Out

 



Code

 

# Bei Bedarf & natürlich nur einmal

# using Pkg

# Pkg.add("DataFrames")

# Pkg.add("Plots")

# Pkg.add("Clustering")



using DataFrames

using Plots

using Clustering

plot(size=(500,500),leg=false)


X = filter_houses[[:sq___ft,:price]]
X = convert(Array{Float64}, X)
X = X'
k = length(unique(filter_houses[:zip]))
C = kmeans(X,k)
df = DataFrame(cluster = C.assignments,city = filter_houses[:city],
           Quadratmeter = filter_houses[:sq__ft],
           Preis = filter_houses[:price],
           zip = filter_houses[:zip])
          
clusters_figure = plot()
for i = 1:k
           clustered_houses = df[df[:cluster].== i,:]
           xvals = clustered_houses[:Quadratmeter]
           yvals = clustered_houses[:Preis]
           scatter!(clusters_figure,xvals,yvals,markersize=4)
       end
xlabel!("Quadratmeter")
ylabel!("Preis")
display(clusters_figure)

println("Errechnetes k ist: ", k)          


Out



Errechnetes k ist: 66



Oh, Entschuldigung!
In meinem (nicht hier angezeigten) Code war noch k = 6 gesetzt!
{Update: Diese Vermutung ist wohl nicht richtig. Woran es genau liegt, dass hier nur 6 Farben angezeigt werden, kann ich aber grade nicht mehr rekonstruieren.}
Es muss mit k = 66 so aussehen
{Update: Das wiederum stimmt natürlich noch.}
:




Und wenn ich das hier tue
:

Code

 

plot(size=(500,500),leg=false)


X = filter_houses[[:sq___ft,:price]]
X = convert(Array{Float64}, X)
X = X'
# k = length(unique(filter_houses[:zip]))
k = 3
C = kmeans(X,k)
df = DataFrame(cluster = C.assignments,city = filter_houses[:city],
           Quadratmeter = filter_houses[:sq__ft],
           Preis = filter_houses[:price],
           zip = filter_houses[:zip])
          
clusters_figure = plot()
for i = 1:k
           clustered_houses = df[df[:cluster].== i,:]
           xvals = clustered_houses[:Quadratmeter]
           yvals = clustered_houses[:Preis]
           scatter!(clusters_figure,xvals,yvals,markersize=4)
       end
xlabel!("Quadratmeter")
ylabel!("Preis")
display(clusters_figure)

# println("Errechnetes k ist: ", k)          
println("Gesetztes k ist: ", k)          

Passiert das
:

Out



Gesetztes k ist: 3


Moment mal!
Dann probieren wir noch kurz
k = 11

Out



Gesetztes k ist: 11


k = 6
muss so aussehen
(iwas ist da oben verkehrt gelaufen)
:

Out - "k = 6"



Gesetztes k ist: 6


Out - "k = 22"



Gesetztes k ist: 22




Zwischenfazit


Allzu viel trennt mich jetzt wohl nicht mehr vom Verständnis.
Insbesondere, da mir jetzt das
mean
wie in
by(filter_houses,:type,filter_houses->mean(filter_houses[:price]))
mehrmals unter die Augen geraten ist
,
und ich nachgeschlagen und verstanden habe,
dass damit schlicht der Durchschnitt ...
nein, falsch! ... der Mittelwert
 gemeint ist
(womit ich ja keinerlei Verständnisprobleme zu haben meine)
.

Und ausserdem scheint es mir ganz hilfreich,
dass sich (mir) hier die Frage aufdrängt:
"Wozu braucht fim diese Cluster/Clusterung überhaupt?
Die Grafik spricht doch auch ohne Clusterfärbung ausreichend für sich selbst, nicht?
Und die Zusammenrückung bei kleinem k scheint auch nicht sehr sinnvoll.
Hier noch mal schnell die Grafik für k = 8
:
"
.

Ich denke, diese Frage, die genaugenommen aus zwei Fragen und einer Bemerkung besteht, ist
iwi
wertvoll
{für das Weitere, was kommen soll(te)}
,
oder
?

Und, übrigens, wenn ich andersherum clustere,
nämlich mit
X = filter_houses[[:price,:sq___ft]]
,
dann ergibt sich
:


Die Frage nach dem Nutzen
scheint mir
- zumindest von blutigen Laien³³³ gestellt -
nicht ganz unsinnig zu sein
.



By the way - Code


by(filter_houses,:type,filter_houses->mean(filter_houses[:price]))

Out

 

┌ Warning: `getindex(sdf::SubDataFrame, colind::ColumnIndex)` is deprecated, use `sdf[!, colind]` instead.
│   caller = (::getfield(Main, Symbol("##13#14")))(::SubDataFrame{DataFrame,DataFrames.Index,Array{Int64,1}}) at REPL[293]:1
└ @ Main ./REPL[293]:1
3×2 DataFrame
│ Row │ type         │ x1        │
│     │ String⍰      │ Float64   │
├─────┼──────────────┼───────────┤
│ 1   │ Residential  │ 2.34802e5 │
│ 2   │ Condo        │ 1.34213e5 │
│ 3   │ Multi-Family │ 2.24535e5 │


Update


Ich muss iwas verkehrt machen,
jetzt erhalte ich bei abermaligem Umdrehen
zu
X = filter_houses[[:sq__ft,:price]]
das
:

Iwas stimmt mit meinem Handling noch nicht, ich exite noch einmal und starte Juli-REPL neu!

julia> exit()
xxxx:~$ julia

Und nochmal alles in einem Code:


# Bei Bedarf & natürlich nur einmal

# using Pkg

# Pkg.add("DataFrames")

# Pkg.add("Plots")

# Pkg.add("Clustering")



using DataFrames

using Plots

using Clustering

# download("http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv","houses.csv")
houses = readtable("houses.csv")
filter_houses = houses[houses[:sq__ft].>0,:]

plot(size=(500,500),leg=false)

X = filter_houses[[:sq__ft,:price]]
X = convert(Array{Float64}, X)
X = X'
# k = length(unique(filter_houses[:zip]))
k = 8
C = kmeans(X,k)
df = DataFrame(cluster = C.assignments,city = filter_houses[:city],
           Quadratmeter = filter_houses[:sq__ft],
           Preis = filter_houses[:price],
           zip = filter_houses[:zip])
          
clusters_figure = plot()
for i = 1:k
           clustered_houses = df[df[:cluster].== i,:]
           xvals = clustered_houses[:Quadratmeter]
           yvals = clustered_houses[:Preis]
           scatter!(clusters_figure,xvals,yvals,markersize=4)
       end
xlabel!("Quadratmeter")
ylabel!("Preis")
display(clusters_figure)

# println("Errechnetes k ist: ", k)          
println("Gesetztes k ist: ", k)          

Out




Dieses war das elfte Bild.
Ein prima Grund, jetzt hiermit aufzuhören.
Und - ehrlich gesagt - nun erscheint mir meine obige Frage
allmählich doch etwas dumm. Ich habe da mehr hineininterpretieren wollen als hineinzuinterpretieren ist - mein alter Kardinalfehler (einer von vielen).
Es handelt sich um Preissegmente - so kann fim das wohl nennen -, die sich mit diesem Algorithmus in dieser Anwendung sichtbar machen lassen
- nicht mehr, nicht weniger.
Ne, ja ... dat is doch klar dann & denne.
Woll?

Hm.... oder doch nicht?

Ach, wat soll's! Bin halt ein kleiner Blödi, kommt Zeit, kommt Schlau - manchmal ...

Bild 12 zu Code





# Bei Bedarf & natürlich nur einmal

# using Pkg

# Pkg.add("DataFrames")

# Pkg.add("Plots")

# Pkg.add("Clustering")



using DataFrames

using Plots

using Clustering

# download("http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv","houses.csv")
houses = readtable("houses.csv")
filter_houses = houses[houses[:sq__ft].>0,:]

plot(size=(500,500),leg=false)

X = filter_houses[[:price,:sq__ft]]
X = convert(Array{Float64}, X)
X = X'
# k = length(unique(filter_houses[:zip]))
k = 8
C = kmeans(X,k)
df = DataFrame(cluster = C.assignments,city = filter_houses[:city],
           Quadratmeter = filter_houses[:sq__ft],
           Preis = filter_houses[:price],
           zip = filter_houses[:zip])
          
clusters_figure = plot()
for i = 1:k
           clustered_houses = df[df[:cluster].== i,:]
           xvals = clustered_houses[:Preis]
           yvals = clustered_houses[:Quadratmeter]
           scatter!(clusters_figure,xvals,yvals,markersize=4)
       end
xlabel!("Preis")      
ylabel!("Quadratmeter")
display(clusters_figure)

# println("Errechnetes k ist: ", k)          
println("Gesetztes k ist: ", k)          






Vielleicht regt's ja nicht nur mich zum Denken an.
;-) & Sry.




¹¹ Bin halt doof, und auch garantiert unter Garantie ein bisschen meschuggi²².²²
²² 'Rhythmus vs. Algorithmus' ist mir schon 'ne harte Nuss.
³³ Onda auch meschuggi(l)li.
³³³ Warum Laien ausgerechnet blutig sein müssen, im deutschen Sprachgebrauch,
um sie als besonders laienhaft zu kennzeichnen,
entzieht sich meiner derzeitigen Kenntnis.¹¹¹
¹¹¹ Aber es lässt sich ja mal erfragen/ergooglen:




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Rand-Notizili



Wer weniger Informationen pro Satz liefert,
muss schneller sprechen
:

Warum Italiener so schnell reden - science.ORF.at

Kommentare

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!