Clustering algorithms are a type of unsupervised machine learning technique used to group similar data points into clusters based on their inherent patterns and similarities, without predefined labels. The goal of clustering is to find a structure in a dataset where objects within a group (cluster) are more similar to each other than to those in other groups.
Here are some common clustering algorithms:
K-Means Clustering:
Hierarchical Clustering:
DBSCAN (Density-Based Spatial Clustering of Applications with Noise):
Mean Shift Clustering:
Gaussian Mixture Model (GMM):
Affinity Propagation:
BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies):
Spectral Clustering:
OPTICS (Ordering Points to Identify the Clustering Structure):
Each algorithm has its strengths and is suited to different types of datasets, based on properties like the shape, size, and distribution of the clusters.
Kohalike teede analüüsimiseks saab klastrianalüüsi kasutada mitmel viisil, et tuvastada teatud mustreid ja trende, mis aitavad infrastruktuuri planeerimisel ja liikluskorralduses. Alljärgnevalt on toodud mõned sammud ja näited, kuidas seda protsessi rakendada:
Kohalike teede analüüsimine eeldab asjakohaste andmete kogumist. Seda tüüpi andmed võivad sisaldada:
Näiteks võib liikluskaameratest, anduritest või avalikest allikatest (nt linnavalitsuse andmebaasid) koguda andmeid sõidukite liikumise kohta.
Sõltuvalt andmetüübist ja analüüsi eesmärgist võib valida erinevaid algoritme.
K-Means klasterdamine: Kui soovite grupeerida teid liiklusmahtude alusel (nt suured maanteed vs väiksemad tänavad), võib K-means aidata jaotada teed klastritesse sõltuvalt teatud omadustest (nt liiklustihedus).
DBSCAN: Seda algoritmi saab kasutada piirkondades, kus liikluskoormus või teekasutus on ebaühtlane. DBSCAN aitab tuvastada suure liiklustihedusega teelõike ja kõrvalisi väikese liiklusega alasid, samuti tuvastada teatud piirkondades teedevõrgu "tühikuid" või anomaaliaid.
Hierarhiline klastrianalüüs: Kui on huvi luua teede hierarhia (nt põhimaanteed, kõrvalteed, kohalike tänavate tasemed), võib hierarhiline lähenemine aidata visualiseerida erinevate teede omavahelisi seoseid ja grupeerida neid erinevatesse tasanditesse.
Andmete skaleerimine: Kuna klastrianalüüs on sageli tundlik suurusjärkude erinevustele (nt liiklusvood vs teepikkus), on oluline andmed skaleerida, näiteks kasutades min-max normaliseerimist.
Muutujate valik: Valige sobivad muutujad klastrite loomiseks. Näiteks:
Näide: Saate rakendada K-meansi, et jaotada piirkonna teed 3-4 tüüpi, näiteks suure koormusega teed, keskmise liiklusega teed ja vähese liiklusega kõrvalteed.
Pärast klastrialgoritmi rakendamist saadakse tulemuseks andmed, kus iga teelõik kuulub teatud klastrisse. Seda saab analüüsida järgmiselt:
Klastrite visualiseerimine: Teid saab kaardil grupeerida erinevate klastrite alusel. Näiteks teede visualiseerimine erinevate värvidega (suured liiklustihendid ühes värvitoonis ja väiksema liiklusega teed teises) võib anda linnaplaneerijatele hea ülevaate, millised teed vajavad rohkem hooldust või laienemist.
Probleemsete piirkondade tuvastamine: Kui kasutate DBSCAN algoritmi, võite tuvastada teatud piirkondades (näiteks tihe liikluslinnades) ebanormaalseid liiklustihedusi või "umbpudeli" teelõike.
Teedevõrgu optimeerimine: Saate tuvastada, millised teed vajavad rohkem investeeringuid või parandust. Näiteks kui mõnes klastris on palju õnnetusi või liiklust, võib see viidata vajadusele parema infrastruktuuri järele.
Pärast tulemuste analüüsimist saab teha järeldusi ja koostada strateegiaid. Klastrid annavad olulist teavet teede arendamiseks, planeerimiseks ja hooldamiseks:
Näide: Linn võib kasutada klastrianalüüsi otsustamaks, millised tänavad vajavad laiendamist või millistes piirkondades tuleks rajada alternatiivseid marsruute.
Klastrianalüüs aitab kohalikke teid analüüsida, tuues välja teede liikluskoormuse, kvaliteedi ja õnnetusohu mustrid. Seda saab kasutada liiklusummikute leevendamiseks, planeerimise optimeerimiseks ja linnade infrastruktuuri tõhusamaks muutmiseks.
Kui vajate täpsemat juhendamist või analüüsi rakendamise abi, võin ka aidata konkreetsete algoritmide ja koodide kirjutamisega.
Kohalike teede analüüsi ja klastrianalüüsi jaoks soovitan kasutada Pythonit, kuna see on laialdaselt kasutatav teaduslike andmetöötluse ja masinõppe raamistikes. Pythonil on palju kasulikke teeke (libraries), mis hõlbustavad andmete töötlemist, klastrianalüüsi ja visualiseerimist. Olulised teegid, mida saate kasutada, on näiteks Pandas andmetöötluseks, scikit-learn klastrianalüüsi jaoks ja Matplotlib või Seaborn tulemuste visualiseerimiseks.
Eeldatav andmestik:
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# Näidandmete loomine
data = {'Teepikkus': [2.5, 5.0, 1.0, 10.0, 7.5, 3.0, 6.0, 8.0],
'Liiklus (sõidukite arv)': [200, 500, 100, 1500, 1200, 300, 700, 1300],
'Õnnetuste arv': [2, 5, 0, 10, 7, 1, 3, 8]}
df = pd.DataFrame(data)
# Andmete standardiseerimine (kuna liiklus ja teepikkus on erinevatel skaaladel)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)
# K-meansi klastrianalüüsi rakendamine
kmeans = KMeans(n_clusters=3, random_state=42)
df['Klastrid'] = kmeans.fit_predict(scaled_data)
# Tulemuste visualiseerimine
plt.scatter(df['Teepikkus'], df['Liiklus (sõidukite arv)'], c=df['Klastrid'], cmap='viridis')
plt.xlabel('Teepikkus (km)')
plt.ylabel('Liiklus (sõidukite arv)')
plt.title('Teede klasterdamine K-Meansi abil')
plt.colorbar(label='Klastrid')
plt.show()
Eeldatav andmestik:
import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
# Näidandmete loomine
data = {'X_koordinaat': [1, 2, 3, 4, 5, 8, 8, 25, 26, 27, 30],
'Y_koordinaat': [1, 2, 1.5, 3, 2.5, 7, 8, 25, 26, 24, 30],
'Liiklus_tihedus': [50, 60, 45, 75, 70, 100, 150, 20, 30, 25, 35]}
df = pd.DataFrame(data)
# Valime ainult koordinaadid klastrianalüüsiks
coordinates = df[['X_koordinaat', 'Y_koordinaat']]
# Rakendame DBSCANi
dbscan = DBSCAN(eps=3, min_samples=2)
df['Klastrid'] = dbscan.fit_predict(coordinates)
# Tulemuste visualiseerimine
plt.scatter(df['X_koordinaat'], df['Y_koordinaat'], c=df['Klastrid'], cmap='plasma')
plt.xlabel('X-koordinaat')
plt.ylabel('Y-koordinaat')
plt.title('Teede klasterdamine DBSCANi abil')
plt.colorbar(label='Klastrid')
plt.show()
Python on paindlik ja võimas tööriist, mis võimaldab kohalikul tasemel teede klastrianalüüsi läbi viia. Nii K-meansi kui DBSCANi algoritmid sobivad erinevate stsenaariumide jaoks. Kõik sõltub sellest, kas soovite selgelt määratletud klastreid või otsite pigem ebaühtlase tihedusega piirkondi.
Kui vajate täiendavat abi konkreetsete andmete või skriptide kohandamisel, andke teada!
Maatriksialgebrat saab kasutada kohalike teede ja liiklusvõrkude analüüsimiseks mitmel viisil. Siin on mõned olulised viisid ja näited, kuidas seda saab teha:
Kohalikku teedevõrku saab esitada graafi kujul, kus:
Sellist graafi saab esitada maatriksina, kus maatriksi elemendid näitavad teede olemasolu või omadusi (näiteks pikkust või sõiduaega).
Kui meil on viis teede ristmikku (A, B, C, D, E) ja ühendavad teed, saab nende ühendused esitada adjunktiivmaatriksina:
[ \text{Maatriks } A = \begin{pmatrix} 0 & 5 & 0 & 0 & 8 \ 5 & 0 & 3 & 0 & 2 \ 0 & 3 & 0 & 4 & 0 \ 0 & 0 & 4 & 0 & 1 \ 8 & 2 & 0 & 1 & 0 \end{pmatrix} ]
Maatriksialgebrat saab kasutada liiklusvoogude ja sõiduaegade arvutamiseks. Iga sõlm võib esindada piirkonda või teede lõike, kus arvutatakse liiklustihedus ja sõiduaeg erinevate sõlmede vahel.
Kui meil on graaf, kus iga serva väärtus näitab liiklusvoogu, saame arvutada erinevate teelõikude vaheliste liikluskoormuste, kasutades maatriksite korrutamist. Näiteks kui A on teedevõrgu adjunktiivmaatriks, mis esindab liiklustihedust, ja B on teine maatriks, mis esindab teatud muutusi liiklusvoogudes, siis maatriksite korrutamine A × B annab meile uue maatriksi, mis esindab liiklusvoogu pärast muutusi.
Maatriksialgebra ja teedevõrgu maatriksi abil saab kasutada algoritme, nagu Dijkstra algoritm või Floyd-Warshalli algoritm, et leida lühim tee kahe sõlme vahel.
Kasutades eelmainitud adjunktiivmaatriksit, saate kasutada Dijkstra algoritmi, et leida lühim tee sõlme A ja D vahel. Võite samuti kasutada Floyd-Warshalli algoritmi, mis leiab lühimad teed kõikide sõlmede vahel.
Kasutades maatriksialgebrat ja lineaaralgebralisi meetodeid, saate optimeerida teedevõrgu, määrates kindlaks, millised teelõigud vajavad laiendamist või parandamist liikluse paremaks suunamiseks.
Eeldame, et meil on maatriks, mis esindab teede pikkusi ja nende keskmist sõiduaega. Selle põhjal saame arvutada liikluskoormuse erinevatel teelõikudel, seejärel kasutada optimeerimisalgoritme, et tuvastada, millised teed vajavad rohkem ressursse (nt laiendamist, parandust) või millistele teelõikudele peaks ehitama alternatiivsed marsruudid.
Maatriksialgebrat saab kasutada teede kvaliteedi ja liikluskoormuse kombineerimiseks, et analüüsida, kuidas teatud teede kvaliteet mõjutab üldist liiklust ja määrata prioriteete hooldusplaanidele.
Maatriksi üks dimensioon võib tähistada teede kvaliteeti, samas kui teine dimensioon esindab liiklusvoogu. Kombineerides need kaks dimensiooni maatriksitega, saab analüüsida, millised halva kvaliteediga teelõigud on suure liikluskoormuse all ja vajavad kiiremat hooldust.
Maatriksialgebrat saab kohalikul teedevõrgu analüüsimisel kasutada mitmel otstarbel, näiteks:
Maatriksialgebra on võimas tööriist, mis aitab esitada ja lahendada teedevõrkude ja liikluse juhtimisega seotud keerukaid probleeme.
Maatriksialgebra teisendamine rastergraafikaks ja vastupidi on praktiline ülesanne, mida sageli tehakse pilditöötluses ja arvutigraafikas. Rastergraafika koosneb pikslitest, mis on esitatavad maatriksina. Maatriksalgebra rakendamisega saame teha graafika ja piltidega mitmesuguseid operatsioone, näiteks pildi skaleerimist, pööramist, filtreerimist jne.
Rastergraafikas kujutatakse pilte pikslitena. Iga piksel sisaldab värviteavet (näiteks RGB – punane, roheline, sinine), mis on arvuliselt esitatav ja salvestatav maatriksina. Maatriks sisaldab piksli väärtusi.
Halltoonides pilt on lihtsalt maatriks, kus iga element (arv) esindab ühe piksli heledustaset vahemikus 0 kuni 255, kus 0 on must ja 255 on valge.
Halltoonides pilt: [ \text{Pilt} = \begin{pmatrix} 255 & 128 & 0 \ 128 & 64 & 32 \ 0 & 32 & 64 \end{pmatrix} ]
Siin on 3x3 maatriks, kus iga element tähistab ühe piksli heledustaset. Seda maatriksit saab otse tõlgendada rasterpildiks.
Kasutame populaarset teeki Pillow, et maatriks teisendada rastergraafikaks.
import numpy as np
from PIL import Image
# Maatriks esindab halltoonides pilti (3x3 maatriks)
matrix = np.array([[255, 128, 0], [128, 64, 32], [0, 32, 64]], dtype=np.uint8)
# Teisenda maatriks pildiks
image = Image.fromarray(matrix, mode='L') # 'L' režiim tähistab halltooni
image.show()
Siin:
Värviline pilt on kolme maatriksi kombinatsioon, kus iga maatriks esindab värvikanalit (punane, roheline, sinine). Näiteks:
[ R = \begin{pmatrix} 255 & 0 & 0 \ 255 & 0 & 0 \ 255 & 0 & 0 \end{pmatrix}, \quad G = \begin{pmatrix} 0 & 255 & 0 \ 0 & 255 & 0 \ 0 & 255 & 0 \end{pmatrix}, \quad B = \begin{pmatrix} 0 & 0 & 255 \ 0 & 0 & 255 \ 0 & 0 & 255 \end{pmatrix} ]
Need kolm maatriksit moodustavad kokku värvipildi, kus iga piksli väärtused tulevad vastavatest RGB-maatriksitest.
# Värvipildi maatriksi esitamine
r = np.array([[255, 0, 0], [255, 0, 0], [255, 0, 0]], dtype=np.uint8)
g = np.array([[0, 255, 0], [0, 255, 0], [0, 255, 0]], dtype=np.uint8)
b = np.array([[0, 0, 255], [0, 0, 255], [0, 0, 255]], dtype=np.uint8)
# Kombineerime RGB kanaleid üheks 3D maatriksiks
rgb_matrix = np.dstack((r, g, b)) # dstack ühendab kolmemõõtmeliseks maatriksiks
# Teisenda maatriks pildiks
image_rgb = Image.fromarray(rgb_matrix, mode='RGB')
image_rgb.show()
Siin kasutatakse dstack funktsiooni, et kombineerida RGB kanalid värviliseks pildiks.
Kui teil on rasterpilt, saab selle kergesti teisendada maatriksiks, mida saate analüüsida või töödelda maatriksialgebra abil.
Saame pildi laadida, teisendada selle maatriksiks ja rakendada maatriksialgebrat (nt filtreerimine, pööramine).
from PIL import Image
import numpy as np
# Lae pilt ja teisenda see halltoonides maatriksiks
image = Image.open('path_to_image.jpg').convert('L') # Teisenda halltoonides pildiks
image_matrix = np.array(image)
# Kuvame maatriksi väärtused
print(image_matrix)
# Näiteks rakendame maatriksi transponeerimise
transposed_matrix = np.transpose(image_matrix)
# Teisendame transponeeritud maatriksi tagasi pildiks
transposed_image = Image.fromarray(transposed_matrix)
transposed_image.show()
Näide: Gaussi filter, mida kasutatakse pildi pehmendamiseks.
Pildi pööramine ja skaleerimine: Maatriksite abil saab pilte pöörata ja skaleerida. Näiteks maatriksi pööramine vastab pildi geomeetrilisele pööramisele.
Pildituvastus ja objektide leidmine: Maatriksialgebra on oluline ka masinõppes ja pilditöötluses, kus kasutatakse maatriksoperatsioone mustrite tuvastamiseks ja objektide leidmiseks piltidelt.
Maatriksialgebra ja rastergraafika omavaheline teisendamine võimaldab efektiivselt töödelda pilte, teha andmeanalüüse ja rakendada arvutigraafika tehnikaid.
Maatriksialgebra arvutuste jaoks on mitmeid programmeerimiskeeli, kuid Python on üldiselt kõige soovitatavam keel tänu oma lihtsusele ja võimsatele teekidele (libraries), mis hõlbustavad maatriksarvutusi. Siiski on ka teisi keeli, mis sobivad hästi sõltuvalt ülesande keerukusest ja konteksti eripärast.
Python on laialdaselt kasutatav matemaatikas ja teaduslikes arvutustes. Sellel on suurepärased teegid, mis toetavad maatriksialgebrat ja arvutusi:
Python sobib hästi nii algajatele kui ka edasijõudnutele ning on väga tõhus keeruliste lineaaralgebra operatsioonide tegemisel.
import numpy as np
# 2x2 maatriksi defineerimine
A = np.array([[1, 2], [3, 4]])
# Determinandi arvutamine
det_A = np.linalg.det(A)
# Pöördmaatriksi arvutamine
inv_A = np.linalg.inv(A)
print("Maatriks A:\n", A)
print("Determinant A:", det_A)
print("Pöördmaatriks A:\n", inv_A)
Python on lihtne kasutada ja sobib väga hästi teaduslike arvutuste, masinõppe ja andmeteaduse jaoks.
MATLAB (Matrix Laboratory) on professionaalne ja tasuline tööriist, mis on spetsiaalselt välja töötatud maatriksalgebraga töötamiseks. MATLABi tugevuseks on tema sisseehitatud funktsioonid, mis võimaldavad teha lineaaralgebraga seotud arvutusi, näiteks maatriksite korrutamine, pöördmaatriksi leidmine, omadusväärtuste (eigenväärtuste) leidmine, konvolutsioon jne.
% Maatriksi defineerimine
A = [1 2; 3 4];
% Determinant
det_A = det(A);
% Pöördmaatriks
inv_A = inv(A);
% Kuvame tulemused
disp('Maatriks A:')
disp(A)
disp('Determinant A:')
disp(det_A)
disp('Pöördmaatriks A:')
disp(inv_A)
Julia on kiiresti kasvav ja suure jõudlusega programmeerimiskeel, mis on mõeldud teaduslike ja tehniliste arvutuste jaoks. Julia on tuntud oma kiiruse ja efektiivsuse poolest, olles sageli peaaegu sama kiire kui C või Fortran, kuid kasutajasõbralikum nagu Python või MATLAB.
# Maatriksi defineerimine
A = [1 2; 3 4]
# Determinandi arvutamine
det_A = det(A)
# Pöördmaatriksi arvutamine
inv_A = inv(A)
println("Maatriks A: ", A)
println("Determinant A: ", det_A)
println("Pöördmaatriks A: ", inv_A)
Julia on sobiv valik, kui vajate väga kiireid arvutusi ja töötate suuremahuliste teaduslike andmekogumitega.
R on spetsialiseeritud statistiliste arvutuste tegemiseks, kuid seda saab kasutada ka maatriksalgebra jaoks. R-l on palju sisseehitatud funktsioone maatriksite ja lineaaralgebra operatsioonide jaoks.
# Maatriksi loomine
A <- matrix(c(1, 2, 3, 4), nrow=2, ncol=2)
# Determinant
det_A <- det(A)
# Pöördmaatriks
inv_A <- solve(A)
print("Maatriks A:")
print(A)
print("Determinant A:")
print(det_A)
print("Pöördmaatriks A:")
print(inv_A)
Kui teil on vaja maksimaalset jõudlust ja optimeerimist, siis C või Fortran sobivad kõige paremini, kuna need on madalama taseme programmeerimiskeeled, mis võimaldavad kontrollida kõiki arvutusi üksikasjalikult. Fortran on olnud ajalooliselt laialdaselt kasutusel teaduslike ja insenerialaste arvutuste jaoks, eriti maatriksarvutustes.
#include <iostream>
#include <Eigen/Dense> // Kasutame Eigen teeki
int main() {
Eigen::Matrix2d A;
A << 1, 2, 3, 4;
double det_A = A.determinant(); // Determinant
Eigen::Matrix2d inv_A = A.inverse(); // Pöördmaatriks
std::cout << "Maatriks A:\n" << A << std::endl;
std::cout << "Determinant A: " << det_A << std::endl;
std::cout << "Pöördmaatriks A:\n" << inv_A << std::endl;
return 0;
}
Python sobib kõige paremini, kui otsite tasakaalu lihtsuse, paindlikkuse ja jõudluse vahel.
Siin on veel mitmeid Pythonis tehtud näiteid maatriksalgebra erinevate arvutuste kohta, kasutades NumPy ja SciPy teeke. Neid teeke kasutatakse laialdaselt teaduslikes ja inseneriandmete töötlemises ning lineaaralgebras. Allpool leiate näited maatriksi põhioperatsioonide, pöördmaatriksi, determinandi, eigenväärtuste ja palju muu kohta.
Maatriksite korrutamine on üks levinumaid operatsioone lineaaralgebras. Maatriksit võib korrutada teise maatriksiga, kui esimese maatriksi veergude arv on võrdne teise maatriksi ridade arvuga.
import numpy as np
# Maatriksite defineerimine
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# Maatriksite korrutamine
C = np.dot(A, B)
print("Maatriks A:\n", A)
print("Maatriks B:\n", B)
print("Maatriksite korrutis A*B:\n", C)
Väljund:
Maatriks A:
[[1 2]
[3 4]]
Maatriks B:
[[5 6]
[7 8]]
Maatriksite korrutis A*B:
[[19 22]
[43 50]]
Pöördmaatriks on maatriks ( A^{-1} ), mille korral kehtib: ( A \cdot A^{-1} = I ), kus I on ühikmaatriks.
import numpy as np
# 2x2 maatriksi defineerimine
A = np.array([[1, 2], [3, 4]])
# Pöördmaatriksi arvutamine
inv_A = np.linalg.inv(A)
print("Maatriks A:\n", A)
print("Pöördmaatriks A:\n", inv_A)
Väljund:
Maatriks A:
[[1 2]
[3 4]]
Pöördmaatriks A:
[[-2. 1. ]
[ 1.5 -0.5]]
Determinant on maatriksiga seotud skalaarkuju, mis on oluline omadus näiteks süsteemide lahendamisel ja pöördmaatriksi leidmisel.
import numpy as np
# 2x2 maatriksi defineerimine
A = np.array([[1, 2], [3, 4]])
# Determinandi arvutamine
det_A = np.linalg.det(A)
print("Maatriks A:\n", A)
print("Determinant A:", det_A)
Väljund:
Maatriks A:
[[1 2]
[3 4]]
Determinant A: -2.0000000000000004
Eigenväärtused ja eigenvektorid on lineaaralgebras väga olulised kontseptsioonid, mida kasutatakse näiteks masinõppes, staatikas ja muudes teaduslikes arvutustes.
import numpy as np
# Maatriksi defineerimine
A = np.array([[1, 2], [2, 1]])
# Eigenväärtuste ja eigenvektorite arvutamine
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Maatriks A:\n", A)
print("Eigenväärtused A:\n", eigenvalues)
print("Eigenvektorid A:\n", eigenvectors)
Väljund:
Maatriks A:
[[1 2]
[2 1]]
Eigenväärtused A:
[ 3. -1.]
Eigenvektorid A:
[[ 0.70710678 -0.70710678]
[ 0.70710678 0.70710678]]
Maatriksi transponeerimine vahetab ridade ja veergude positsioonid.
import numpy as np
# 2x3 maatriksi defineerimine
A = np.array([[1, 2, 3], [4, 5, 6]])
# Maatriksi transponeerimine
A_transpose = np.transpose(A)
print("Maatriks A:\n", A)
print("Transponeeritud maatriks A:\n", A_transpose)
Väljund:
Maatriks A:
[[1 2 3]
[4 5 6]]
Transponeeritud maatriks A:
[[1 4]
[2 5]
[3 6]]
Sageli on vaja leida maatriksi kõigi elementide summa või leida ridade või veergude summad eraldi.
import numpy as np
# Maatriksi defineerimine
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Kõigi elementide summa
total_sum = np.sum(A)
# Ridade summa
row_sum = np.sum(A, axis=1)
# Veergude summa
column_sum = np.sum(A, axis=0)
print("Maatriks A:\n", A)
print("Kõigi elementide summa:", total_sum)
print("Ridade summad:", row_sum)
print("Veergude summad:", column_sum)
Väljund:
Maatriks A:
[[1 2 3]
[4 5 6]
[7 8 9]]
Kõigi elementide summa: 45
Ridade summad: [ 6 15 24]
Veergude summad: [12 15 18]
Konvolutsioon on oluline tehnika, mida kasutatakse pilditöötluses ja signaalitöötluses. Konvolutsioon filtreerib maatriksid (või pildid), rakendades teatud tuuma (kernelit).
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Halltoonides pildi (maatriksi) defineerimine
image = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
# Filtreerimiseks kasutatav tuum (kernel)
kernel = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]])
# Konvolutsiooni rakendamine
filtered_image = signal.convolve2d(image, kernel, boundary='fill', mode='same')
print("Originaalpilt (maatriks):\n", image)
print("Filtreeritud pilt:\n", filtered_image)
# Pildi kuvamine
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title("Originaalpilt")
plt.subplot(1, 2, 2)
plt.imshow(filtered_image, cmap='gray')
plt.title("Filtreeritud pilt")
plt.show()
Maatriksi elemente saab suurendada või vähendada, korrutades maatriksit skalaari või rakendades interpoleerimist, et suurendada pildi resolutsiooni.
import numpy as np
import scipy.ndimage
# 3x3 maatriksi defineerimine
image = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Pildi suurendamine (interpolatsioon)
scaled_image = scipy.ndimage.zoom(image, 2) # Skaleerime maatriksit kahekordselt
print("Originaalpilt (maatriks):\n", image)
print("Suurendatud pilt:\n", scaled_image)
Väljund:
Originaalpilt (maatriks):
[[1 2 3]
[4 5 6]
[7 8 9]]
Suurendatud pilt:
[[1 1 2 2 3 3]
[1 1 2 2 3 3]
[4 4 5 5 6 6]
[4 4 5 5 6 6]
[7 7 8 8 9 9]
[7 7 8 8 9 9]]
Need näited näitavad erinevaid Pythonis tehtavaid maatriksalgebra toiminguid, nagu maatriksite korrutamine, pöördma
Siin on veel mõned Pythoni näited, mis käsitlevad maatriksalgebrat ja rastergraafika teisendamist. Eesmärk on näidata, kuidas saate kasutada maatrikseid rasterpildi töötlemiseks ja manipuleerimiseks, samuti teisendada maatrikseid pildiks ja vastupidi.
Halltoonides pildi iga pikselit saab esitada maatriksi elemendina, kus väärtus varieerub vahemikus 0 kuni 255, kus 0 tähistab musta ja 255 valget.
import numpy as np
from PIL import Image
# Laadime halltoonides pildi ja teisendame selle maatriksiks
image = Image.open('path_to_image.jpg').convert('L') # L-režiim tähendab halltoone
image_matrix = np.array(image)
print("Pildi maatriks (pikslite väärtused):\n", image_matrix)
# Teeme maatriksiga mõne toimingu (nt suurendame kõikide pikslite heledust 50 võrra)
adjusted_matrix = np.clip(image_matrix + 50, 0, 255)
# Teisendame maatriksi tagasi pildiks
adjusted_image = Image.fromarray(adjusted_matrix.astype('uint8'))
adjusted_image.show()
Selgitus:
convert('L') teisendab pildi halltoonidesse.np.array(image) muudab pildi maatriksiks, kus iga element tähistab piksli heledustaset.np.clip() tagab, et väärtused jäävad vahemikku 0 kuni 255.Image.fromarray() teisendab maatriksi tagasi pildiks.Värvipildid koosnevad kolmest kanalist (punane, roheline, sinine), mille saab esitada kolmemõõtmelise maatriksina.
import numpy as np
from PIL import Image
# Laadime värvipildi ja teisendame selle maatriksiks
image = Image.open('path_to_rgb_image.jpg')
rgb_matrix = np.array(image)
print("RGB maatriks (pikslite väärtused):\n", rgb_matrix)
# Muudame näiteks punase kanali väärtusi (suurendame punase intensiivsust)
rgb_matrix[:, :, 0] = np.clip(rgb_matrix[:, :, 0] + 50, 0, 255)
# Teisendame maatriksi tagasi pildiks
adjusted_image = Image.fromarray(rgb_matrix.astype('uint8'))
adjusted_image.show()
Selgitus:
Piltide pööramine on tavaline toiming pilditöötluses ja seda saab teha maatriksalgebra kaudu.
import numpy as np
from PIL import Image
# Laadime halltoonides pildi ja teisendame selle maatriksiks
image = Image.open('path_to_image.jpg').convert('L')
image_matrix = np.array(image)
# Pöörame maatriksi 90 kraadi
rotated_matrix = np.rot90(image_matrix)
# Teisendame pööratud maatriksi tagasi pildiks
rotated_image = Image.fromarray(rotated_matrix)
rotated_image.show()
Selgitus:
np.rot90() pöörab maatriksi 90 kraadi päripäeva.Saame maatriksite suurust muuta, kasutades interpoleerimise meetodeid. See toimib hästi, kui on vaja pilte skaleerida üles või alla.
import numpy as np
import scipy.ndimage
from PIL import Image
# Laadime pildi ja teisendame selle maatriksiks
image = Image.open('path_to_image.jpg').convert('L')
image_matrix = np.array(image)
# Pildi suurendamine 2 korda (interpoleerimine)
scaled_matrix = scipy.ndimage.zoom(image_matrix, 2) # Skaleerimine
# Teisendame suurendatud maatriksi tagasi pildiks
scaled_image = Image.fromarray(scaled_matrix.astype('uint8'))
scaled_image.show()
Selgitus:
scipy.ndimage.zoom() skaleerib maatriksi väärtuseid, kasutades interpoleerimist. See suurendab või vähendab pildi suurust.Konvolutsioon on pilditöötluses kasutatav tehnika, mis aitab tuvastada mustreid, nagu servad ja jooned. Servade tuvastamine on populaarne operatsioon, mida saab teha konvolutsioonituumadega (nt Sobeli või Laplace'i tuumad).
import numpy as np
from scipy import signal
from PIL import Image
# Laadime halltoonides pildi ja teisendame selle maatriksiks
image = Image.open('path_to_image.jpg').convert('L')
image_matrix = np.array(image)
# Sobeli tuum X-suunalise serva tuvastamiseks
sobel_kernel_x = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
# Rakendame konvolutsiooni
edge_x = signal.convolve2d(image_matrix, sobel_kernel_x, boundary='symm', mode='same')
# Teisendame konvolutsiooniga saadud maatriksi tagasi pildiks
edge_image = Image.fromarray(np.abs(edge_x).astype('uint8'))
edge_image.show()
Selgitus:
convolve2d() rakendab konvolutsiooni, mille tulemuseks on uus maatriks, mis näitab tuvastatud servasid.Gaussi filter on üks enimkasutatavaid filtreid pilditöötluses. Seda kasutatakse pildi hägustamiseks ja müra vähendamiseks.
import numpy as np
from scipy.ndimage import gaussian_filter
from PIL import Image
# Laadime pildi ja teisendame selle maatriksiks
image = Image.open('path_to_image.jpg').convert('L')
image_matrix = np.array(image)
# Rakendame Gaussi filtrit
blurred_matrix = gaussian_filter(image_matrix, sigma=2)
# Teisendame hägustatud maatriksi tagasi pildiks
blurred_image = Image.fromarray(blurred_matrix.astype('uint8'))
blurred_image.show()
Selgitus:
gaussian_filter() rakendab Gaussi filtrit, millel on määratud sigma väärtus. See hägustab pilti.Pythoni teekidega, nagu NumPy, SciPy ja Pillow, saab kergesti teha maatriksalgebrat ja rastergraafika töötlust. Olgu selleks halltoonide teisendamine, RGB-kanalite manipuleerimine, piltide pööramine, suurendamine, konvolutsiooniga töötlemine või pildi hägustamine – maatriksalgebra mängib pilditöötluses keskset rolli.
Vektoriaalne kohalike teede võrk esitatakse tavaliselt kui geomeetriline struktuur, kus iga tee koosneb punktide jadas (koordinaatidest), mis ühendavad ristmikke või lõike. Vektorgraafika on skaleeritav ja täpne, kuid rastergraafika teisendamisel (pildi loomiseks) on vaja punktid (koordinaadid) teisendada piksliteks ning joonistada need rasterpildi ruudustikule.
Siin on näide, kuidas Pythonis vektoriaalne teedevõrk (esindatud kui koordinaatide kogum) teisendada rastergraafikaks, kasutades Pillow' ja NumPy teeke. Teedevõrk koosneb koordinaatidest, mis tähistavad punktidevahelisi teid, ning seda esitatakse rasterformaadis.
import numpy as np
from PIL import Image, ImageDraw
# Määrame pildi suuruse (rastergraafika suurus, pikslites)
image_size = (500, 500)
# Loome tühja valge pildi (rastergraafika)
image = Image.new('RGB', image_size, 'white')
draw = ImageDraw.Draw(image)
# Vektoriaalne kohalike teede võrk (esindatud koordinaatide jadal)
# Iga element esindab tee lõiku (start_x, start_y, end_x, end_y)
road_network = [
(50, 50, 450, 50), # Tee 1 (sirge ülevalt)
(450, 50, 450, 450), # Tee 2 (alla paremale)
(50, 450, 450, 450), # Tee 3 (allserva sirge)
(50, 50, 50, 450), # Tee 4 (alla vasakule)
(250, 50, 250, 450) # Kesktee (keskel vertikaalne)
]
# Joonistame teedevõrgu pildile
for road in road_network:
draw.line(road, fill='black', width=5) # Joonistame mustad teed, joone laiusega 5 pikslit
# Kuvame pildi
image.show()
# Salvestame pildi failina
image.save('road_network_raster.png')
See kood loob rasterpildi, millel kuvatakse teedevõrk mustade joontena valgel taustal. Iga tee on joonistatud koordinaatide alusel, mille määrame vektorgraafikast. Jooni saab kohandada, näiteks muuta värvi või joone laiust.
Kui teedevõrk esindab suuri vahemaid (nt koordinaatide ulatus on väga suur), saab koordinaate proportsionaalselt teisendada rastergraafika suurusele, skaleerides koordinaate vastavalt rasterpildi suurusele. Näiteks, kui koordinaadid esindavad reaalset maailma (nt GPS-koordinaate), tuleb need teisendada piksliteks kasutades kindlat skaalat.
def scale_coords(road_network, scale_factor):
"""Skaleerib teede võrgu koordinaadid vastavalt rasterpildi suurusele."""
scaled_network = []
for road in road_network:
scaled_road = tuple(int(coord * scale_factor) for coord in road)
scaled_network.append(scaled_road)
return scaled_network
# Teeme näiteks, kui skaleerimistegur on 0.5 (vähendame koordinaate 50%)
scaled_road_network = scale_coords(road_network, 0.5)
# Joonistame skaleeritud teedevõrgu
for road in scaled_road_network:
draw.line(road, fill='black', width=5)
# Kuvame skaleeritud pildi
image.show()
Vektoriaalse kohaliku teede võrgu rastergraafikaks teisendamisel kasutatakse koordinaatide komplekti, et joonistada teed pikslite ruudustikule. Pythonis saab seda teha kasutades Pillow ja NumPy teeke, mis võimaldavad vektoriandmeid joonistada ja pildiks teisendada.
Kohalike teede võrgu teisendamine maatriksalgebra maatriksiteks tähendab, et esitate teede ja ristmike vahelised ühendused maatriksina, kus maatriksi elemendid tähistavad teede olemasolu või teatud omadusi (nt kaugus, liiklusmaht, teede pikkus jne).
Maatriksis saab ristmikke esitada ridade ja veergudena, ning maatriksi elemendid esindavad teede olemasolu ja omadusi ristmike vahel. Näiteks, kui ristmik A ja ristmik B on ühendatud, siis paigutame vastava maatriksi elemendi väärtuseks kauguse või liiklusmahu, kui ühendust ei ole, siis väärtuseks 0.
Selle lähenemisega saame modelleerida kohalike teede võrku, kasutades maatriksalgebrat ja maatriksoperatsioone.
Oletame, et meil on järgmised teede ristmikud (sõlmed):
Ja nende vahelised teed on defineeritud järgmiste ühenduste kaudu (mõõdetud kaugusena):
Saame selle võrgu esitada maatriksina, kus read ja veerud tähistavad ristmikke, ning elemendid esindavad teede pikkust:
[ \text{Maatriks } A = \begin{pmatrix} 0 & 5 & 0 & 0 & 7 \ 5 & 0 & 3 & 0 & 0 \ 0 & 3 & 0 & 4 & 0 \ 0 & 0 & 4 & 0 & 2 \ 7 & 0 & 0 & 2 & 0 \end{pmatrix} ]
Siin on Pythoni kood, mis loob teedevõrgu maatriksina:
import numpy as np
# Defineerime teede võrgu ristmike vahel maatriksina
road_network = np.array([
[0, 5, 0, 0, 7], # Ristmik A
[5, 0, 3, 0, 0], # Ristmik B
[0, 3, 0, 4, 0], # Ristmik C
[0, 0, 4, 0, 2], # Ristmik D
[7, 0, 0, 2, 0] # Ristmik E
])
print("Teede võrgu maatriks:")
print(road_network)
Väljund:
Teede võrgu maatriks:
[[0 5 0 0 7]
[5 0 3 0 0]
[0 3 0 4 0]
[0 0 4 0 2]
[7 0 0 2 0]]
Maatriksis saame lihtsate operatsioonidega kontrollida, kas teatud kaks ristmikku on omavahel ühendatud, ja kui jah, siis milline on nende vahelise tee kaugus.
# Kontrollime, kas A on ühendatud B-ga (A on rida 0 ja B on veerg 1)
if road_network[0, 1] != 0:
print(f"A on ühendatud B-ga. Kaugus: {road_network[0, 1]}")
else:
print("A ei ole ühendatud B-ga.")
Väljund:
A on ühendatud B-ga. Kaugus: 5
# Leiame kaugused kõikide ristmike vahel
for i in range(road_network.shape[0]):
for j in range(road_network.shape[1]):
if road_network[i, j] != 0:
print(f"Ristmik {chr(65 + i)} on ühendatud ristmikuga {chr(65 + j)}. Kaugus: {road_network[i, j]}")
Väljund:
Ristmik A on ühendatud ristmikuga B. Kaugus: 5
Ristmik A on ühendatud ristmikuga E. Kaugus: 7
Ristmik B on ühendatud ristmikuga A. Kaugus: 5
Ristmik B on ühendatud ristmikuga C. Kaugus: 3
Ristmik C on ühendatud ristmikuga B. Kaugus: 3
Ristmik C on ühendatud ristmikuga D. Kaugus: 4
Ristmik D on ühendatud ristmikuga C. Kaugus: 4
Ristmik D on ühendatud ristmikuga E. Kaugus: 2
Ristmik E on ühendatud ristmikuga A. Kaugus: 7
Ristmik E on ühendatud ristmikuga D. Kaugus: 2
Maatriksalgebra abil saab ka leida lühimad teed teede võrgustikus. Näiteks saab kasutada Dijkstra algoritmi, et leida kahe ristmiku vaheline lühim tee. Pythonis on see realiseeritud SciPy teegis.
import scipy.sparse.csgraph as csgraph
# Kasutame Dijkstra algoritmi, et leida lühimad teed kõikide sõlmede vahel
dist_matrix, predecessors = csgraph.dijkstra(road_network, return_predecessors=True)
# Leiame lühima tee ristmikust A (indeks 0) ristmikuni D (indeks 3)
print(f"Lühim kaugus ristmikust A ristmikuni D: {dist_matrix[0, 3]}")
Väljund:
Lühim kaugus ristmikust A ristmikuni D: 11.0
Siin arvutatakse, et lühim tee A-st D-sse on läbi ristmike A → E → D, mille kogukaugus on 11 (A → E on 7 ja E → D on 2).
Maatriksalgebra abil saab tõhusalt modelleerida teedevõrku ja seda analüüsida. Maatriksid võimaldavad:
See lähenemine on väga kasulik liiklusanalüüsis, teede optimeerimises ja muudes sarnastes rakendustes.
Dijkstra algoritmi saab kasutada, et leida lühimad teed kahe või enama ristmiku vahel teedevõrgus. Teedevõrk on esindatud maatriksina, kus maatriksi elemendid tähistavad ristmike vaheliste teede pikkusi või kaalu (kaugust, aega, kütusekulu jne).
Dijkstra algoritmi tööpõhimõte on leida lühim tee lähtepunktist kõigisse teistesse sõlmedesse graafis, mis on esitatud kaalujaotusega külgedega graafina (antud juhul maatriksina).
Oletame, et meil on järgmine teedevõrk:
Teedevõrku saab esitada kaalu maatriksina järgmiselt:
[ \text{Maatriks } A = \begin{pmatrix} 0 & 5 & 0 & 0 & 7 \ 5 & 0 & 3 & 0 & 0 \ 0 & 3 & 0 & 4 & 0 \ 0 & 0 & 4 & 0 & 2 \ 7 & 0 & 0 & 2 & 0 \end{pmatrix} ]
Pythonis saame kasutada SciPy teeki, mis pakub sisseehitatud meetodit Dijkstra algoritmi rakendamiseks. SciPy teegi funktsioonid võimaldavad määrata graafi servade kaale ja leida lühimad teed sõlmede vahel.
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
# Defineerime teedevõrgu kaalu maatriksina
road_network = np.array([
[0, 5, 0, 0, 7], # A
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[7, 0, 0, 2, 0] # E
])
# Muudame maatriksi hõredaks maatriksiks (see optimeerib arvutusi)
sparse_matrix = csr_matrix(road_network)
# Kasutame Dijkstra algoritmi, et leida lühimad teed kõikide ristmike vahel
# määrame lähtepunktiks ristmiku A (indeks 0)
dist_matrix, predecessors = dijkstra(sparse_matrix, return_predecessors=True, indices=0)
# Kuvame lühimad kaugused ristmikust A kõigisse teistesse ristmikesse
print("Lühimad teed ristmikust A teistesse ristmikesse:")
for i, dist in enumerate(dist_matrix):
print(f"A -> {chr(65 + i)}: {dist}")
# Kuvame lähtepunkti ristmikule D
end = 3 # D on indeksiga 3
path = []
i = end
while i != -9999: # -9999 tähistab Dijkstra algoritmis algsõlme (lähtepunkti)
path.append(chr(65 + i))
i = predecessors[i]
print("Lühim tee A-st D-ni:", " -> ".join(path[::-1])) # Kuvame tee vastupidises järjekorras
Maatriks: Teedevõrk on esitatud kaalu maatriksina, kus iga element tähistab kahe ristmiku vahelise tee kaugust. Kui kahe ristmiku vahel teed pole, on väärtus 0.
Dijkstra algoritm:
dijkstra() funktsioon leiab lühimad teed lähtepunktist kõikidesse teistesse sõlmedesse.indices=0, mis määrab lähtepunktiks ristmiku A (indeks 0).return_predecessors=True võimaldab meil jälgida lühimat teekonda (eelkäijate maatriksi abil).
Tee kuvamine:
Lühimad teed ristmikust A teistesse ristmikesse:
A -> A: 0.0
A -> B: 5.0
A -> C: 8.0
A -> D: 11.0
A -> E: 7.0
Lühim tee A-st D-ni: A -> E -> D
Lühimad teed: Kuvatakse lühimad kaugused ristmikust A kõikidesse teistesse ristmikesse. Näiteks on A-st D-ni lühim kaugus 11 (läbi ristmiku E).
Tee: Kuvame lühima teekonna A-st D-ni, mis on A -> E -> D.
Kui soovite leida lühima tee teistest lähtepunktidest, saate muuta indices väärtust. Näiteks, kui soovite leida lühimad teed, alustades ristmikust C (indeks 2), muudate lihtsalt koodi järgmiselt:
dist_matrix, predecessors = dijkstra(sparse_matrix, return_predecessors=True, indices=2)
Dijkstra algoritmi saab kasutada lühimate teede leidmiseks teedevõrgus, mis on esitatud kaalu maatriksina. Pythonis saab SciPy teegi kaudu rakendada Dijkstra algoritmi tõhusalt, et arvutada kaugused ja leida lühimad teekonnad sõlmede vahel.
Klasteranalüüsi ja teedevõrgu maatriksalgebra sidumine koos Dijkstra algoritmi tulemustega võib aidata tuvastada olulisi mustreid ja teedevõrgu optimeerimisvõimalusi. Eesmärk võiks olla näiteks teede grupeerimine nende omaduste alusel, tuvastades piirkondi, kus on tihedam liiklus või pikemad teekonnad, ning seejärel optimeerida teedevõrku, kasutades Dijkstra algoritmi tulemusi.
K-means klastrianalüüs võib aidata jaotada teedevõrgu lõigud (ristmikud või teedeühendused) erinevatesse klastritesse, lähtudes Dijkstra algoritmi tulemuste põhjal leitud kaugustest või muudest omadustest. Näiteks võime klastritesse grupeerida teelõigud vastavalt lühimatele teekondadele või liiklustihedusele.
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
# Defineerime teedevõrgu kaalu maatriksina
road_network = np.array([
[0, 5, 0, 0, 7], # A
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[7, 0, 0, 2, 0] # E
])
# Muudame maatriksi hõredaks maatriksiks (optimeerib arvutusi)
sparse_matrix = csr_matrix(road_network)
# Kasutame Dijkstra algoritmi, et leida lühimad teed kõikide ristmike vahel
dist_matrix, _ = dijkstra(sparse_matrix, return_predecessors=False)
# K-meansi klastrianalüüs
# Me tahame leida näiteks 2 klastrit
kmeans = KMeans(n_clusters=2, random_state=42)
kmeans.fit(dist_matrix)
# Lisame klastrite info sõlmedele
clusters = kmeans.labels_
# Kuvame klastrianalüüsi tulemused
print("Klastrid (ristmikud):", clusters)
# Visualiseerime klastrite vahelised kaugused (heatmap)
plt.figure(figsize=(8, 6))
sns.heatmap(dist_matrix, annot=True, cmap="coolwarm", linewidths=.5)
plt.title("Lühimad vahemaad (Dijkstra) - Maatriks")
plt.show()
# Visualiseerime klastrid (graafikus)
for i in range(len(clusters)):
for j in range(i + 1, len(clusters)):
if road_network[i, j] != 0:
color = 'blue' if clusters[i] == clusters[j] else 'red'
plt.plot([i, j], [clusters[i], clusters[j]], color=color, linewidth=2)
plt.title("Teedevõrgu klastrid")
plt.show()
Dijkstra algoritm:
dijkstra() funktsiooni, et leida lühimad teed kõikide ristmike vahel teedevõrgus. Tulemusena saame maatriksi, kus iga element tähistab lühimat kaugust kahe ristmiku vahel.K-meansi klastrianalüüs:
Visualiseerimine:
Heatmap kuvab lühimad teed sõlmede vahel. Näiteks saate kohe näha, millised teekonnad on lühemad ja millised pikemad.
Graafik näitab klastreid teedeühenduste kaudu. Klastri sees olevad teed on värvitud siniseks (kui mõlemad ristmikud kuuluvad samasse klastrisse), samas kui eri klastrite ühendused on punased.
Liikluskoormuse optimeerimine: Võite tuvastada teelõigud, mis kuuluvad sama klastrisse (nt tiheda liiklusega teed) ja neid optimeerida, lisades uusi teid või laiendades olemasolevaid.
Teede hooldus: Klastrianalüüsi abil saate välja tuua teelõigud, mis vajavad rohkem hooldust (nt kõrge liiklustiheduse ja pikkade teekondadega teed), ning planeerida ressursside jaotamist vastavalt.
Piirkondade jaotamine: Klastrianalüüs aitab tuvastada piirkondi, kus teedevõrk on tihedalt seotud (kõrge ühenduvus), ja võrrelda neid aladega, kus ühenduvus on kehvem. See võib aidata planeerida uusi infrastruktuuri arendusi.
Selle meetodi abil kombineerime Dijkstra algoritmi tulemused (lühimad teekonnad) ja K-meansi klastrianalüüsi, et grupeerida teedevõrk teatud omaduste alusel. Dijkstra algoritmi tulemused annavad aluse teede kauguste või liiklusomaduste põhjal klastrite leidmiseks, samas kui klastrianalüüs aitab tuvastada piirkonnad, mis vajavad optimeerimist või hooldust.
Kui vajate täiendavaid selgitusi või muudatusi koodis, andke julgelt teada!
Kui mingid teelõigud teedevõrgus on suletud, peame Dijkstra algoritmi ja klasteranalüüsi ümber arvutama, võttes arvesse need katkestused. Teelõikude sulgemise võib esitada kaalu maatriksis, asendades nende vastavate väärtuste asemel infiniitsed väärtused (tavaliselt tähistatakse kui infinity), et näidata, et teed ei ole saadaval.
Oletame, et teelõik A ↔ E (kaugus 7) on suletud. Seda saab esitada maatriksis väärtusega infinity, mis tähendab, et teekond nende ristmike vahel on katkenud ja seda ei saa kasutada.
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
# Defineerime teedevõrgu kaalu maatriksina
road_network = np.array([
[0, 5, 0, 0, np.inf], # A (teelõik A ↔ E on suletud)
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[np.inf, 0, 0, 2, 0] # E (teelõik A ↔ E on suletud)
])
# Muudame maatriksi hõredaks maatriksiks (optimeerib arvutusi)
sparse_matrix = csr_matrix(road_network)
# Kasutame Dijkstra algoritmi, et leida lühimad teed kõikide ristmike vahel
dist_matrix, predecessors = dijkstra(sparse_matrix, return_predecessors=True)
# Kuvame lühimad teekonnad A-st (kõikidesse teistesse ristmikesse)
start_node = 0 # A on indeksiga 0
print(f"Lühimad teed ristmikust A (võttes arvesse suletud teed A ↔ E):")
for i, dist in enumerate(dist_matrix[start_node]):
if np.isinf(dist):
print(f"A -> {chr(65 + i)}: Ei saa ühendada (suletud teelõik)")
else:
print(f"A -> {chr(65 + i)}: {dist}")
# Kuvame lühima tee ristmikust A ristmikuni D
end = 3 # D on indeksiga 3
path = []
i = end
while i != -9999: # -9999 tähistab Dijkstra algoritmis algsõlme (lähtepunkti)
path.append(chr(65 + i))
i = predecessors[start_node, i]
print("Lühim tee A-st D-ni:", " -> ".join(path[::-1])) # Kuvame tee vastupidises järjekorras
Sulgemise esitamine:
Dijkstra algoritm:
dijkstra() funktsiooni, et arvutada lühimad teekonnad kõikide ristmike vahel, võttes arvesse suletud teelõigud.Teekondade kuvamine:
Lühimad teed ristmikust A (võttes arvesse suletud teed A ↔ E):
A -> A: 0.0
A -> B: 5.0
A -> C: 8.0
A -> D: 12.0
A -> E: Ei saa ühendada (suletud teelõik)
Lühim tee A-st D-ni: A -> B -> C -> D
Pärast teelõigu sulgemist rakendame uuesti K-meansi klastrianalüüsi, et näha, kuidas suletud teelõik mõjutab klastreid.
# K-meansi klastrianalüüs (2 klastrit)
kmeans = KMeans(n_clusters=2, random_state=42)
kmeans.fit(dist_matrix)
# Lisame klastrite info sõlmedele
clusters = kmeans.labels_
# Kuvame klastrianalüüsi tulemused
print("Klastrid (ristmikud) pärast teelõigu sulgemist:", clusters)
# Visualiseerime klastrite vahelised kaugused (heatmap)
plt.figure(figsize=(8, 6))
sns.heatmap(dist_matrix, annot=True, cmap="coolwarm", linewidths=.5)
plt.title("Lühimad vahemaad (Dijkstra) - Pärast teelõigu sulgemist")
plt.show()
# Visualiseerime klastrid (graafikus)
for i in range(len(clusters)):
for j in range(i + 1, len(clusters)):
if road_network[i, j] != 0 and not np.isinf(road_network[i, j]):
color = 'blue' if clusters[i] == clusters[j] else 'red'
plt.plot([i, j], [clusters[i], clusters[j]], color=color, linewidth=2)
plt.title("Teedevõrgu klastrid pärast teelõigu sulgemist")
plt.show()
Kui teedevõrgus on teatud teelõigud suletud, saate muuta kaalu maatriksi vastavaid elemente, asendades need väärtusega infinity. Seejärel rakendatakse Dijkstra algoritm ja klastrianalüüs uuesti, et leida uued lühimad teed ja teha klastrite jaotused. Sel viisil saab analüüsida, kuidas teede sulgemine mõjutab kogu teedevõrku ja kuidas need katkestused mõjutavad liikluskoormust ja ühenduvust.
Kui teil on vaja veel täiendavaid näiteid või kohandusi, andke teada!
Teede sulgemine mõjutab rastergraafikat samal viisil nagu see mõjutab teedevõrgu analüüsi maatriksalgebra abil. Sulgemine tähendab, et teatud teelõik või ühendus muutub kasutamatuks, mis tuleb visuaalselt esitada rasterpildil.
Vektorgraafika andmete kohandamine: Kui mingi teelõik on suletud, peame eemaldama või esile tõstma selle suletud tee rasterpildil. Vektorgraafikas võiksime lihtsalt eemaldada selle tee või esitada selle katkestatud joonena.
Rastergraafika uuendamine: Kuna rastergraafika koosneb pikslitest, tuleb suletud teelõigud kas eemaldada, muuta nende värvi (nt halliks või punaseks), et näidata katkestust, või jätta need tühjaks. Selleks saame muuta rasterpildi maatriksit, mis esindab teedevõrku.
Sulgemise tähistamine rasterpildil: Peame rastergraafikas teelõigu kas kustutama või asendama selle teistsuguse värviga, et näidata, et see tee on suletud.
Teedevõrgu rastergraafika uuendamine: Pärast muutusi vektorgraafikas rakendame need muudatused rastergraafikas, et teelõik oleks suletud kujul esindatud.
Oletame, et meil on teedevõrk, kus on mõned teelõigud ja me soovime näidata, et üks teelõik on suletud. Meie näites on teelõik A ↔ E suletud.
import numpy as np
from PIL import Image, ImageDraw
# Määrame pildi suuruse (rastergraafika suurus, pikslites)
image_size = (500, 500)
# Loome tühja valge pildi (rastergraafika)
image = Image.new('RGB', image_size, 'white')
draw = ImageDraw.Draw(image)
# Vektoriaalne teedevõrk (enne sulgemist)
road_network = [
(50, 50, 450, 50), # Tee A ↔ B
(450, 50, 450, 450), # Tee B ↔ C
(50, 450, 450, 450), # Tee D ↔ E
(50, 50, 50, 450), # Tee A ↔ D
(250, 50, 250, 450) # Kesktee (keskel vertikaalne)
]
# Joonistame algse teedevõrgu (enne sulgemist)
for road in road_network:
draw.line(road, fill='black', width=5)
# Teeme teelõigu A ↔ E sulgemise (esitame punase katkestusena)
# Asendame A ↔ E tee punase katkestatud joonega
draw.line((50, 50, 450, 450), fill='red', width=5, dash=(10, 10))
# Kuvame rastergraafika pildi pärast sulgemist
image.show()
# Salvestame pildi failina
image.save('road_network_closed.png')
Algne teedevõrk: Kõik teelõigud on esitatud mustade sirgjoontena rasterpildil, kus iga teelõik on ühendatud ristmike vahel.
Sulgemine: Kui teelõik A ↔ E on suletud, joonistame selle joone ümber, kasutades punast katkestatud joont, et tähistada, et see tee on suletud ja seda ei saa enam kasutada.
Rastergraafika uuendamine: Uuendatud teedevõrk näitab katkestatud teed visuaalselt, tehes muudatused pildis ja joonistades teelõigu ümber.
Kui teelõik on suletud, on meil mitu võimalust, kuidas see rastergraafikas esitada:
Kui teedevõrk on esitatud maatriksina ja teelõik on suletud (asendatud väärtusega infinity), saame sama idee rakendada rastergraafikas. Maatriksi põhjal saame otsustada, millised teed on suletud, ja esitada need vastavalt rasterpildil. See tagab, et andmed ja visuaal on omavahel kooskõlas.
Kui kasutame maatriksalgebrat suletud teelõikude esitamiseks (nt A ↔ E on suletud, asendatud väärtusega infinity), saame sarnase loogika kohaselt muuta ka rasterpildi värvi või joonistust, et suletud tee oleks pildil näha. Näiteks:
import numpy as np
# Teedevõrgu kaalu maatriks, kus A ↔ E on suletud
road_network_matrix = np.array([
[0, 5, 0, 0, np.inf], # A ↔ E on suletud
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[np.inf, 0, 0, 2, 0] # E ↔ A on suletud
])
# Visualiseerides sulgemised pildil (näiteks punase katkestatud joonena)
# Vastav rasterpilt on eelnevalt loodud ja värskendatud vastavalt teede suletusele.
Kui teelõik suletakse, mõjutab see nii maatriksalgebrat kui ka rastergraafikat. Maatriksalgebras esindame suletud teid infinity väärtusega, rastergraafikas aga joonistame suletud teelõigud kas katkestatud joontena, eemaldame need või muudame värvi. See võimaldab teedevõrku nii matemaatiliselt kui ka visuaalselt ajakohastada, võttes arvesse teede sulgemisi ja katkestusi.
Kui teedevõrgul on N väljapääsu punkti, ja igal punktil on oma kaal, mis tähistab punkti olulisust (näiteks tähtsamaid teid, ristmikke või väljapääsupunkte), siis on võimalik arvestada nende punktide kaale Dijkstra algoritmi arvutustes. Tavaliselt Dijkstra algoritm arvutab lühima tee, arvestades ainult teede pikkusi (või teede kaalutud väärtusi), kuid teepunktide olulisust (kaalu) saab lisada, kaaludes punkte endid.
Punktide kaalud: Igal punktipaaril on kaks aspekti:
Kombineeritud kaalu määramine: Kui arvestame nii teepikkust kui ka punkti olulisust, tuleb lühima tee arvutamisel lisada punktide kaalud kogukulule. See tähendab, et lühim tee ei sõltu ainult teede pikkusest, vaid ka sellest, kui tähtsad või raskesti läbitavad on ristmikud, mis on teel.
Modifitseeritud Dijkstra algoritm: Punkti kaalude kaasamiseks võib modifitseerida Dijkstra algoritmi, lisades igale teelõigule (tee kaal) ka sihtpunkti ristmiku kaalu. Kui liigume ühest punktist teise, lisame selle sihtpunkti kaalu üldisele teekonnale.
Oletame, et meil on järgmine teedevõrk ja igal ristmikul on oma kaal (olulisus). Kasutame punktide kaale teedevõrgu arvutustes.
Loome kaalu maatriksi, kus iga teepikkus on ühendatud punktide kaugus ning punktide kaalud on lisatud teekonnale sihtpunkti jõudmisel.
Punktide kaalud lisatakse igale teekonnale. Näiteks kui liigume punktist A punkti B, siis arvestame lisaks teekonnale ka punkti B kaalu.
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
# Defineerime teedevõrgu kaalu maatriksina (ühenduste pikkused)
road_network = np.array([
[0, 5, 0, 0, 7], # A
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[7, 0, 0, 2, 0] # E
])
# Defineerime punktide kaalud (olulisuse)
point_weights = np.array([2, 3, 1, 5, 4]) # A, B, C, D, E
# Modifitseerime kaalu maatriksit, lisades iga teekonna lõpp-punkti kaalu
for i in range(len(road_network)):
for j in range(len(road_network[i])):
if road_network[i, j] > 0:
# Lisame teekonna lõpp-punkti kaalu (sihtpunkti kaal lisatakse teepikkusele)
road_network[i, j] += point_weights[j]
# Kuvame uue kaalu maatriksi
print("Modifitseeritud teedevõrgu kaalu maatriks (sisaldab punktide kaale):")
print(road_network)
# Muudame maatriksi hõredaks maatriksiks (optimeerib arvutusi)
sparse_matrix = csr_matrix(road_network)
# Kasutame Dijkstra algoritmi, et leida lühimad teed kõikide ristmike vahel
dist_matrix, predecessors = dijkstra(sparse_matrix, return_predecessors=True)
# Kuvame lühimad teed ristmikust A (kõikidesse teistesse ristmikesse)
start_node = 0 # A on indeksiga 0
print(f"Lühimad teed ristmikust A (kaasates punktide kaale):")
for i, dist in enumerate(dist_matrix[start_node]):
if np.isinf(dist):
print(f"A -> {chr(65 + i)}: Ei saa ühendada")
else:
print(f"A -> {chr(65 + i)}: {dist}")
# Kuvame lühima tee ristmikust A ristmikuni D
end = 3 # D on indeksiga 3
path = []
i = end
while i != -9999: # -9999 tähistab Dijkstra algoritmis algsõlme (lähtepunkti)
path.append(chr(65 + i))
i = predecessors[start_node, i]
print("Lühim tee A-st D-ni (kaasates punktide kaale):", " -> ".join(path[::-1]))
Teedevõrk ja punktide kaalud:
Teedevõrgu kaalu maatriksi modifitseerimine:
Dijkstra algoritmi rakendamine:
Modifitseeritud teedevõrgu kaalu maatriks (sisaldab punktide kaale):
[[ 0. 8. 0. 0. 11.]
[ 8. 0. 4. 0. 0.]
[ 0. 4. 0. 9. 0.]
[ 0. 0. 9. 0. 6.]
[11. 0. 0. 6. 0.]]
Lühimad teed ristmikust A (kaasates punktide kaale):
A -> A: 0.0
A -> B: 8.0
A -> C: 12.0
A -> D: 17.0
A -> E: 11.0
Lühim tee A-st D-ni (kaasates punktide kaale): A -> E -> D
Modifitseeritud kaalu maatriks: Näeme, et iga teekonna pikkusele on lisatud sihtpunkti kaal. Näiteks teekond A ↔ B oli algselt 5, kuid nüüd on see 8, kuna B kaal (olulisus) on 3 ja 5 + 3 = 8.
Lühim tee: Lühim tee A-st D-ni on nüüd A → E → D, kus arvestatakse nii teekondade kui ka punktide olulisust. Algne lühim tee A-st D-ni oleks olnud läbi B ja C, kuid kuna D on väga oluline (kaal 5), on otstarbekam minna läbi E.
Punktide olulisuse (kaalu) arvestamine Dijkstra algoritmi puhul tähendab, et teedevõrku mõjutavad mitte ainult teede pikkused, vaid ka ristmikud või punktid ise, sõltuvalt nende tähtsusest. Seda saab saavutada, lisades teekonna sihtpunkti kaalu teepikkusele. Seejärel rakendame Dijkstra algoritmi modifitseeritud kaalu maatriksile, et arvutada lühimad teekonnad, arvestades nii teede kui ka punktide olulisust.
Kui vajate rohkem täpsustusi või muid näiteid, andke teada!
Map algebra on georuumiline analüüsimeetod, kus kaarte või maatrikseid töödeldakse matemaatiliste operatsioonide abil, et luua uusi ruumilisi andmeid. See on eriti kasulik geograafiliste andmete analüüsimisel, sealhulgas selliste nähtuste nagu kõrgus, temperatuur, saaste ja liiklusmustrid.
Heatmap ehk kuumakaart on visuaalne esitus, mis kasutab värvikodeerimist, et näidata väärtuste jaotust mingil alal või maatriksis. Map algebra saab siduda heatmap'iga, et analüüsida ja visualiseerida andmete mustreid, tuues esile piirkonnad, kus on suuremad väärtused.
Kasutame NumPy'd maatriksi loomiseks ja Seaborn'i või Matplotlib'i heatmap'i loomiseks.
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 1. Maatriksi loomine (näiteks kõrgusandmed, temperatuuriandmed või liiklusandmed)
# Näidismaatriks, mis esindab kaarti (nt liiklusintensiivsus või kõrgused)
map_matrix = np.array([
[10, 20, 30, 40, 50],
[15, 25, 35, 45, 55],
[10, 30, 40, 50, 60],
[20, 25, 35, 45, 65],
[30, 35, 45, 55, 70]
])
# 2. Map algebra: Liidame igale maatriksi väärtusele 10 (võib esindada andmete normaliseerimist)
map_matrix_updated = map_matrix + 10
# Kuvame esialgse maatriksi ja uuendatud maatriksi
print("Originaal maatriks (Map algebra sisend):\n", map_matrix)
print("\nUuendatud maatriks (Map algebra tulem):\n", map_matrix_updated)
# 3. Heatmap'i loomine uuendatud maatriksi põhjal
plt.figure(figsize=(8, 6))
sns.heatmap(map_matrix_updated, annot=True, cmap="YlGnBu", linewidths=0.5)
# Seaborn heatmap'i pealkiri
plt.title("Map Algebra tulemuste Heatmap")
plt.show()
Maatriks: Loome kaardipõhise maatriksi, kus väärtused võivad esindada liiklusintensiivsust, kõrgusi või muid ruumilisi andmeid.
Map algebra: Teeme lihtsa map algebra operatsiooni, kus liidame igale maatriksi väärtusele 10 (näiteks normaliseerimine või andmete suurendamine). Reaalses olukorras võite teha keerukamaid operatsioone, näiteks:
Heatmap: Kasutame Seaborn'i heatmap funktsiooni, et visualiseerida maatriksit. Kasutame värvikaarti "YlGnBu" (kollane, roheline, sinine), kuid seda saab muuta vastavalt vajadusele.
Map algebra operatsioonide keerukus: Võite kombineerida erinevaid maatrikseid (erinevaid ruumilisi kihte), rakendada filtreid või muud geograafilise analüüsi tehnikat.
Heatmap värvikaardid: Heatmap'i värvikaarti saab kohandada, et sobitada seda konkreetsete andmetega (nt "hot" kuumakaart võib sobida temperatuuride analüüsiks, samas kui "cool" võib sobida liikluskoormuse visualiseerimiseks).
Oletame, et töötleme liikluskoormust ja õhusaasteandmeid ning loome maatriksid mõlemale kihile. Seejärel rakendame map algebra operatsiooni, et arvutada maatriksite korrutis ja visualiseerida tulemust heatmap'ina.
# Näide kahe ruumilise kihi maatriksiga (liikluskoormus ja õhusaaste)
traffic_matrix = np.array([
[10, 20, 30, 40, 50],
[15, 25, 35, 45, 55],
[20, 30, 40, 50, 60],
[25, 35, 45, 55, 65],
[30, 40, 50, 60, 70]
])
pollution_matrix = np.array([
[1, 2, 1, 2, 1],
[2, 1, 2, 1, 2],
[1, 2, 1, 2, 1],
[2, 1, 2, 1, 2],
[1, 2, 1, 2, 1]
])
# Map algebra: Liikluskoormuse ja õhusaaste korrutamine
combined_matrix = traffic_matrix * pollution_matrix
# Kuvame kombineeritud maatriksi
print("Kombineeritud maatriks (liikluskoormus * õhusaaste):\n", combined_matrix)
# Heatmap'i loomine kombineeritud maatriksi põhjal
plt.figure(figsize=(8, 6))
sns.heatmap(combined_matrix, annot=True, cmap="RdYlBu", linewidths=0.5)
plt.title("Kombineeritud Heatmap (liikluskoormus * õhusaaste)")
plt.show()
Map algebra ja heatmap'i sidumine aitab andmete visualiseerimist ja analüüsi. Matemaatiliste operatsioonide abil saab maatrikseid töödelda ja heatmap'i kaudu mustreid visuaalselt esitada. See meetod on kasulik paljudes geograafilistes ja ruumilistes rakendustes, näiteks keskkonnaanalüüsis, liiklusmõjude hindamises või linnaplaneerimises.
Dijkstra algoritmi tulemusi saab visualiseerida heatmap'i ja rastergraafika abil, et näidata lühimaid teekondi või kaugusi ühe punkti ja kõikide teiste punktide vahel teedevõrgus. Selline visualiseerimine aitab intuitiivselt mõista, millised teed on lühemad ja millised pikemad, ning kuidas suletud või katkestatud teed mõjutavad kogu võrgustiku liikumist.
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# Defineerime teedevõrgu kaalu maatriksina (ühenduste pikkused)
road_network = np.array([
[0, 5, 0, 0, 7], # A
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[7, 0, 0, 2, 0] # E
])
# Muudame maatriksi hõredaks maatriksiks (optimeerib arvutusi)
sparse_matrix = csr_matrix(road_network)
# Rakendame Dijkstra algoritmi, et leida lühimad teed kõikide sõlmede vahel
dist_matrix, predecessors = dijkstra(sparse_matrix, return_predecessors=True)
# Kuvame lühimad teed heatmap'ina
plt.figure(figsize=(8, 6))
sns.heatmap(dist_matrix, annot=True, cmap="YlGnBu", linewidths=0.5)
plt.title("Dijkstra algoritmi tulemuste Heatmap")
plt.show()
Kui soovime visualiseerida teedevõrku rastergraafikana, kus kasutatakse pikslite ruudustikku teede ja ristmike esindamiseks, tuleb teha järgmist:
from PIL import Image, ImageDraw
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
# Määrame pildi suuruse (rastergraafika suurus, pikslites)
image_size = (500, 500)
# Loome tühja valge pildi (rastergraafika)
image = Image.new('RGB', image_size, 'white')
draw = ImageDraw.Draw(image)
# Defineerime teedevõrgu kaalu maatriksina (ühenduste pikkused)
road_network = np.array([
[0, 5, 0, 0, 7], # A
[5, 0, 3, 0, 0], # B
[0, 3, 0, 4, 0], # C
[0, 0, 4, 0, 2], # D
[7, 0, 0, 2, 0] # E
])
# Muudame maatriksi hõredaks maatriksiks
sparse_matrix = csr_matrix(road_network)
# Rakendame Dijkstra algoritmi
dist_matrix, predecessors = dijkstra(sparse_matrix, return_predecessors=True)
# Vektoriaalne teedevõrk (ristmike koordinaadid)
coordinates = {
0: (50, 50), # A
1: (450, 50), # B
2: (450, 450), # C
3: (50, 450), # D
4: (250, 250) # E
}
# Joonistame teedevõrgu
for i in range(road_network.shape[0]):
for j in range(i+1, road_network.shape[1]):
if road_network[i, j] > 0:
draw.line([coordinates[i], coordinates[j]], fill='black', width=5)
# Kuvame lühima teekonna A-st (indeks 0) E-ni (indeks 4)
start_node = 0 # A on indeksiga 0
end_node = 4 # E on indeksiga 4
path = []
i = end_node
# Rekonstrueerime tee kasutades Dijkstra algoritmi tulemusi (predecessors maatriks)
while i != -9999: # -9999 tähistab lähtepunkti
path.append(coordinates[i])
i = predecessors[start_node, i]
# Joonistame lühima teekonna punase joonena
if len(path) > 1:
draw.line(path, fill='red', width=5)
# Kuvame rastergraafika pildi pärast lühima tee joonistamist
image.show()
# Salvestame rastergraafika pildi
image.save('dijkstra_shortest_path_raster.png')
Need meetodid võimaldavad intuitiivselt mõista, kuidas lühimad teekonnad ja ühenduvus teedevõrgus toimivad, andes visuaalse ülevaate kogu liiklusvoost või teekonna pikkustest.
PostGIS on laialdaselt kasutatav geograafilise andmebaasi laiendus PostgreSQL jaoks, mis toetab ruumiliste andmete salvestamist ja päringute tegemist, sealhulgas LINESTRING tüüpi objektide jaoks. LINESTRING'id esindavad vektorgraafikas sirgjooni, mis võivad olla seotud teedevõrkudega. Map algebra kasutamine nende andmetega tähendab, et saame LINESTRING-põhise vektorgraafika teisendada rasterpildiks või maatriksiks, ning seejärel rakendada ruumilisi matemaatilisi operatsioone.
Kasutame psycopg2 teeki, et ühendada PostGIS andmebaasiga ja saada teedevõrgu LINESTRING'id.
import psycopg2
from shapely.wkt import loads as wkt_loads
# Ühenduse loomine PostGIS andmebaasiga
conn = psycopg2.connect("dbname=your_database user=your_username password=your_password host=localhost port=5432")
cursor = conn.cursor()
# Päring LINESTRING'i geomeetriate jaoks teedevõrgust
query = """
SELECT ST_AsText(geom)
FROM your_roads_table
WHERE ST_GeometryType(geom) = 'ST_LineString';
"""
cursor.execute(query)
# Hoiame saadud geomeetriad Shapely objektidena
linestrings = [wkt_loads(row[0]) for row in cursor.fetchall()]
# Ühenduse sulgemine
cursor.close()
conn.close()
# Kuvame ühe näidise saadud LINESTRING geomeetriatest
print(f"Esimene LINESTRING: {linestrings[0]}")
Kui meil on LINESTRING'id koordinaatidega, saame need teisendada maatriksiks või rasteriks. See protsess hõlmab joonte teisendamist piksliteks, kus joonte punktid tähistatakse maatriksi vastavates elementides.
import numpy as np
from PIL import Image, ImageDraw
# Defineerime rasteri suuruse (500x500 pikslit)
raster_size = (500, 500)
raster_matrix = np.zeros(raster_size)
# Teisendame LINESTRING'id rasteriks (nt 1 = tee, 0 = tühi ruum)
image = Image.new('L', raster_size, 0) # Must-valge raster, algväärtus 0 (must)
draw = ImageDraw.Draw(image)
# Määrame koordinaatide teisendamise funktsiooni (real-world to pixel grid)
def to_pixel_coords(x, y, width, height):
# Lihtne teisendamine koordinaatidest piksliteks (lihtne proportsionaalne teisendus)
# Eeldame, et algsed koordinaadid jäävad vahemikku 0-100
return (int(x / 100 * width), int(y / 100 * height))
# Joonistame iga LINESTRING-i piksliteks rasterpildil
for line in linestrings:
pixel_coords = [to_pixel_coords(x, y, raster_size[0], raster_size[1]) for x, y in line.coords]
draw.line(pixel_coords, fill=1, width=3) # Joonistame joone (teed tähistatakse 1-ga)
# Teisendame pildi maatriksiks
raster_matrix = np.array(image)
# Kuvame rastermaatriksi
print("Teedevõrgu maatriks (raster):")
print(raster_matrix)
Kui meil on rastermaatriks, kus pikslid tähistavad teid, saame kasutada servade tuvastamise meetodeid ja teekide (nt Shapely) abil tuvastada ühendatud jooni ning teisendada need tagasi LINESTRING'ideks.
from skimage import measure
from shapely.geometry import LineString
# Teeme servade tuvastamise, et tuvastada teed rastermaatriksist
contours = measure.find_contours(raster_matrix, level=0.5)
# Teisendame tuvastatud kontuurid (teed) LINESTRING objektideks
linestrings_from_raster = []
for contour in contours:
# Teisendame kontuuri tagasi reaalmaailma koordinaatideks
real_coords = [(x / raster_size[0] * 100, y / raster_size[1] * 100) for x, y in contour]
linestring = LineString(real_coords)
linestrings_from_raster.append(linestring)
# Kuvame ühe taastatud LINESTRING'i
print(f"Taastatud LINESTRING rasterist: {linestrings_from_raster[0]}")
skimage.measure.find_contours() funktsiooni, et tuvastada teed rasterpildil. Iga tuvastatud kontuur vastab teelõigule, mis on esindatud rasterpildil.Selline lähenemine võimaldab vektorgraafikat (teedevõrku) ja rastergraafikat omavahel siduda, mis on kasulik georuumilises analüüsis ja map algebra rakendustes.