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
Kommentar veröffentlichen