Viac

Je možné použiť pamäťové vrstvy v algoritmoch spracovania QGIS?


Vytváram doplnok QGIS, ktorý sa pripája k databáze MySQL v miestnej sieti, a potom pridá podmnožinu jednej z tabuliek do vrstvy v pamäti; podmnožina je založená na mene údajov (pričom sa berie iba najnovšie pozorovanie pre každé miesto, kde sa vykonávajú merania). Táto pamäťová vrstva bola úspešne vytvorená.

Potom však chcem spustiť niekoľko algoritmov geoprocesingu a mám problém použiť vrstvu v pamäti v ktoromkoľvek z nich.

self.stationuri = "point? crs = epsg: 4326 & field = id: integer & field = {}: double & index = yes" .format (self.cb_field.currentText ()) self.vlayer = QgsVectorLayer (self.stationuri, "scratch", " pamäť ") ak nie self.vlayer.isValid (): zvýšenie výnimky (" Nepodarilo sa vytvoriť vrstvu v pamäti ") self.vlayer.startEditing () pre i, r v enumeráte (výsledok): # Výsledok je rad za radom riadkový výsledok dotazu SQL # Pridať funkcie… self.vlayer.commitChanges () self.vlayer.updateExtents () # Pridať vrstvu na mapu QgsMapLayerRegistry.instance (). addMapLayer (self.vlayer) # Vrstva bola úspešne pridaná do mapy so všetkými funkciami a geometria # NÍŽE SPADÍ APART vyskúšajte: processing.runandload ("gdalogr: gridinvdist", self.vlayer, self.cb_field.currentText (), 2,0,0,0,0,0,0,0,0, ' Float32 ', None) # None = výstup v pamäti; Zobrazí sa rovnaká chyba, ak zadám cestu k reťazcu a názov súboru. okrem Výnimky, e: zvýšiť e

Nie je vznesená žiadna výnimka, ale nie je vytvorený ani pridaný žiadny obsah do TOC, ale je vytvorený nasledujúci protokol vprocessing.log:

INFO | Po, 04. mája 2015 11: 28: 23 | Výstup konzoly na spustenie GDAL |/bin/sh: 1: /tmp/processing/bbebe7599c83446d9c2b03a251879657/OUTPUT.tif: nenájdený |/bin/sh: 1: -zfield: nenájdený || FAILURE: Zdroj údajov nie je špecifikovaný. Použitie: gdal_grid [--help-general] [--formats] | [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/| CInt16/CInt32/CFloat32/CFloat64}] | [-of formát] [-co "NAME = VALUE"] | [-zfield názov_poľa] [-z_increase increase_value] [-z_multiply multiply_value] | [-a_srs srs_def] [-spat xmin ymin xmax ymax] | [-clipsrc | WKT | zdroj údajov | spat_extent] | [-clipsrcsql sql_statement] [-clipsrclayer vrstva] | [-clipsrcwhere výraz] | [-l meno_používateľa]* [-kde výraz] [-sql select_statement] | [-txe xmin xmax] [-tym ymin ymax] [-veľkosť x veľkosť ysize] | [-a algoritmus [: parameter1 = hodnota1]*] [-q] |  || Dostupné algoritmy a parametre s predvolenými hodnotami: | Inverzná vzdialenosť k výkonu (predvolené) | invdist: power = 2,0: smoothing = 0,0: radius1 = 0,0: radius2 = 0,0: uhol = 0,0: max_points = 0: min_points = 0: nodata = 0,0 | Kĺzavý priemer | priemer: polomer1 = 0,0: polomer2 = 0,0: uhol = 0,0: min_bodov = 0: uzlové údaje = 0,0 | Najbližší sused | najbližšie: polomer1 = 0,0: polomer2 = 0,0: uhol = 0,0: uzlové údaje = 0,0 | Rôzne údajové metriky | : polomer1 = 0,0: polomer2 = 0,0: uhol = 0,0: min_bodov = 0: uzlové údaje = 0,0 | možné metriky sú: | minimum | maximum | rozsah | počítať | priemerná vzdialenosť | average_distance_pts |

Zdá sa, že dôležitou súčasťou jeFAILURE: Source datasource is not specified.Avšakself.vlayer.isValid () == Pravda, takže nevidím, čo je na mojom vstupe zlé. Skúsil som nahradiťsamovoľiteľs'memory: scratch'vo výzve naspracovanie.behať, ale potom sa na konzolu vytlačí (ale nevyvolá) nasledujúca chyba:Chyba: Nesprávna hodnota parametra: pamäť: scratch.

Mám ten istý problém, keď to spustím prostredníctvom grafického rozhrania QGIS a pomocou rozbaľovacej ponuky vyberiem svoješkrabanecvrstva, ktorá je v TOC. K tomu dochádza, či zadám výstupný raster ako pamäť alebo zadám umiestnenie na disku.

Táto otázka sa zdá byť podobná, ale ich riešením bolo pridať pamäťovú vrstvu k TOC pred jej použitím. Už to robím a chyba stále pretrváva.

Myslel som si, že ide o všeobecný problém s pamäťovými vrstvami a algoritmami geoprocesingu QGIS, ale nasledujúci problém funguje bez problémov:

processing.runandload ("qgis: fixeddistancebuffer", self.vlayer, 500, 5, True, "output_buffer.shp")

Čo robím zle? Prečo nemožno v niektorých algoritmoch spracovania „špecifikovať“ moju množinu údajov o zdroji pamäte?

EDIT: tu je zdrojový kódgdalogr: gridinvdistak je to užitočné.


Zdá sa, že pamäťové vrstvy nie je možné použiť ako vstup pre skripty spracovania GDAL/OGR, pretože Processing nedokáže správne pripraviť údaje na použitie s ogr2ogr. Preto napríklad nástroj vyrovnávacej pamäte QGIS funguje, ale nástroj vyrovnávacej pamäte GDAL/OGR zlyhá:

Vektory vyrovnávacej pamäte algoritmu ... GDAL príkaz: cmd.exe /C ogr2ogr.exe "C:  Users  anita  AppData  Local  Temp  processing70e5e0852cb9456ba2e3780f8386122e  86d237c8f414ff8a230 -461d-aff6-6271ded02eea} bod? Crs = EPSG: 4326 & memoryid = {6772bccd-f55d-461d-aff6-6271ded02eea} -dialect sqlite -sql "SELECT ST_Buffer (geometry, 1000),* FROM 'point? Crs = EPSG: 4326 & = {6772bccd-f55d-461d-aff6-6271ded02eea} '"Výstup príkazu GDAL: FAILURE: Nedá sa otvoriť zdroj údajov' point? Crs = EPSG: 4326 's nasledujúcimi ovládačmi. -> JP2ECW -> OCI -> SOSI ...

Spracovanie by muselo nejako pripraviť údaje (uložiť ich do súboru) a potom ich odoslať do nástroja GDAL/OGR.

Otvoril som lístok: S nástrojmi OGR nemožno použiť pamäťové vrstvy


Toto je správny spôsob, ako je vysvetlené v dokumentácii http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

nasledujúci kód pracuje so všetkými v pamäti okrem posledného, ​​kedy je načítaný

MDT = cesta/drt. (xmin, xmax, ymin, ymax), 0, -1,0,00100, None) vect = processing.runalg ("tráva: r.to.vect", odtok ['výstup'], 0, nepravda, "%f, %f,%f,%f "%(xmin, xmax, ymin, ymax), 0, None) bu = processing.runalg (" qgis: fixeddistancebuffer ", vect ['output'], Metros_afecta, 1, False, None ) buf = bu ['OUTPUT'] bufe = QgsVectorLayer (buf, "area", "ogr") #posledné načítanie vrstvy QgsMapLayerRegistry.instance (). addMapLayers ([bufe])

processing.runalg vráti slovník v tomto prípade bu ['VÝSTUP'] VÝSTUP JE KĽÚČ, a hodnota je dočasná cesta, kde môžete vidieť kľúč s processeing.alghelp ("spracovanie názvu") ako spracovaním, alghelp ("tráva" : r.drain “)

vrátiť sa

processing.alghelp ("grass: r.drain") ALGORITHM: r.drain - Sleduje tok výškovým modelom na rastrovej mape. vstup  koordinovať  vector_points  -c  -a  -n  GRASS_REGION_PARAMETER  GRASS_REGION_CELLSIZE_PARAMETER  GRASS_SNAP_TOLERANCE_PARAMETER  GRASS_MIN_AREA_PARAMETER  výkon 

v tomto prípade je kľúč výkon , dávajte si pozor na veľké písmeno, musíte písať veľkým písmenom alebo bez neho, v tomto prípade nie veľkým písmenom


A čo sa pozrieť na virtuálne systémy súborov GDAL (http://www.gdal.org/gdal_virtual_file_systems.html)

Existujevsimempredpona pre cesty podobné súborom v pamäti…


Prečo šifrovať údaje v pamäti?

Videl som, že KeePass nielen šifruje súbor s databázou hesiel, ale môže tiež šifrovať heslá, ktoré uchováva v pamäti. Toto je len príklad. Rozmýšľam nad novým projektom, ktorý sa zaoberá citlivými / osobnými údajmi, a teraz sa pýtam, či by som mal šifrovať aj uchovávanie údajov v pamäti. Tento projekt by bol implementovaný s Java SE a ďalšou aplikáciou pre Android. V tomto špeciálnom prípade nebudú uložené žiadne údaje v cloude ani na serveri. Dáta z Androidu bude aplikácia Java SE Desktop importovať prostredníctvom káblového pripojenia.

Ale prečo je to vôbec potrebné? Nepracujú moderné operačné systémy so správou virtuálnej pamäte, aby procesy z používateľského priestoru / užívateľského režimu nemali prístup do pamäte iných procesov?

Je to len ďalšia obranná línia, ak existuje zraniteľnosť operačného systému, ktorá umožňuje prístup do cudzej pamäte? V takom prípade si myslím, že by bolo oveľa jednoduchšie ukradnúť dátový súbor a použiť záznamník kľúčov na zachytenie hesla, ktoré používateľ zadá, namiesto krádeže údajov prostredníctvom prístupu do pamäte.


C ++ som učil vysokoškolákov asi dva roky a zaoberal som sa rekurziou. Z mojej skúsenosti je vaša otázka a pocity veľmi spoločný. V extrémnom prípade niektorí študenti považujú rekurziu za ťažko zrozumiteľnú, zatiaľ čo iní ju chcú použiť takmer na všetko.

Myslím, že Dave to zhrnul dobre: ​​použite to tam, kde je to vhodné. To znamená, že ho používajte, keď vám to príde prirodzené. Keď sa stretnete s problémom, kde sa krásne hodí, s najväčšou pravdepodobnosťou ho spoznáte: bude sa zdať, že ani nemôžete nájsť iteračné riešenie. Prehľadnosť je tiež dôležitým aspektom programovania. Ostatní ľudia (a vy tiež!) By mali byť schopní prečítať a porozumieť kódu, ktorý vytvoríte. Myslím, že je bezpečné povedať, že iteračné slučky sú na prvý pohľad ľahšie pochopiteľné ako rekurzia.

Neviem, ako dobre poznáte programovanie alebo počítačovú vedu vo všeobecnosti, ale silne cítim, že tu nemá zmysel hovoriť o virtuálnych funkciách, dedičnosti alebo o akýchkoľvek pokročilých koncepciách. Často som začínal s klasickým príkladom výpočtu Fibonacciho čísel. Pekne to tu sedí, pretože Fibonacciho čísla sú definované rekurzívne. Toto je ľahko pochopiteľné a nevyžaduje to akýkoľvek fantastické vlastnosti jazyka. Potom, čo študenti získali základné znalosti o rekurzii, sme sa ešte raz pozreli na niektoré jednoduché funkcie, ktoré sme vytvorili skôr. Tu je príklad:

Obsahuje reťazec znak $ x $?

Takto sme to urobili predtým: iterujte reťazec a zistite, či nejaký index obsahuje $ x $.

Otázkou potom je, môcť robíme to rekurzívne? Isteže môžeme, tu je jeden zo spôsobov:

Ďalšou prirodzenou otázkou je, či to máme urobiť takto? Pravdepodobne nie. Prečo? Je ťažšie pochopiť a ťažšie prísť s tým. Preto je tiež náchylnejší na chyby.

Riešenie niektorých problémov je prirodzenejšie vyjadrené pomocou rekurzie.

Predpokladajme napríklad, že máte stromovú dátovú štruktúru s dvoma druhmi uzlov: listy, ktoré ukladajú celočíselnú hodnotu, a vetvy, ktoré majú vo svojich poliach ľavý a pravý podstrom. Predpokladajme, že listy sú usporiadané tak, aby najnižšia hodnota bola v ľavom liste.

Predpokladajme, že úlohou je vytlačiť hodnoty stromu v uvedenom poradí. Rekurzívny algoritmus na to je celkom prirodzený:

Zapísanie ekvivalentného kódu bez rekurzie by bolo oveľa ťažšie. Skús to!

Všeobecnejšie povedané, rekurzia funguje dobre pre algoritmy rekurzívnych dátových štruktúr, ako sú stromy, alebo pre problémy, ktoré je možné prirodzene rozdeliť na podproblémy. Skúste napríklad rozdeliť a dobyť algoritmy.

Ak naozaj chcete vidieť rekurziu v jej najprirodzenejšom prostredí, mali by ste sa pozrieť na funkčný programovací jazyk ako Haskell. V takom jazyku neexistuje žiadna slučková konštrukcia, takže všetko je vyjadrené pomocou rekurzie (alebo funkcií vyššieho rádu, ale to je iný príbeh, o ktorom stojí za to vedieť).

Všimnite si tiež, že funkčné programovacie jazyky vykonávajú optimalizovanú rekurziu chvosta. To znamená, že nekladú rámec zásobníka, pokiaľ nepotrebujú --- v podstate rekurziu je možné previesť na slučku. Z praktického hľadiska môžete písať kód prirodzeným spôsobom, ale dosiahnuť výkon iteračného kódu. Rekordne sa zdá, že kompilátory C ++ optimalizujú aj chvostové hovory, takže neexistuje žiadna dodatočná réžia pri použití rekurzie v C ++.

Od niekoho, kto prakticky žije v rekurzii, sa pokúsim objasniť túto tému.

Pri prvom zavedení do rekurzie sa dozviete, že je to funkcia, ktorá sa sama volá a je v zásade demonštrovaná algoritmami, ako je napríklad prechádzanie stromom. Neskôr zistíte, že sa veľa používa vo funkčnom programovaní pre jazyky ako LISP a F#. Pri F#, ktoré píšem, je väčšina z toho, čo píšem, rekurzívna a zhoda so vzorom.

Ak sa naučíte viac o funkčnom programovaní, ako je F#, naučíte sa F# Zoznamy sú implementované ako jednotlivo prepojené zoznamy, čo znamená, že operácie, ktoré pristupujú iba k hlavnému zoznamu, sú O (1) a prístup k prvkom je O (n). Akonáhle sa to naučíte, máte tendenciu prechádzať údajmi ako zoznam, vytvárať nový zoznam v opačnom poradí a potom zoznam obrátiť, než sa vrátite z funkcie, ktorá je veľmi účinná.

Teraz, keď na to začnete myslieť, čoskoro zistíte, že rekurzívne funkcie budú tlačiť rámec zásobníka pri každom volaní funkcie a môžu spôsobiť pretečenie zásobníka. Ak však rekurzívnu funkciu skonštruujete tak, aby mohla vykonávať chvostové volanie a kompilátor podporuje schopnosť optimalizovať kód pre chvostové volanie. tj. .NET OpCodes. Pole Tailcall nespôsobíte pretečenie zásobníka. V tomto mieste začnete písať akúkoľvek slučku ako rekurzívnu funkciu a akékoľvek rozhodnutie ako zhodu s dňami, či a kedy sú teraz históriou.

Akonáhle prejdete na AI pomocou spätného sledovania v jazykoch, ako je PROLOG, všetko je rekurzívne. Aj keď si to vyžaduje myslenie úplne odlišným spôsobom od imperatívneho kódu, ak je PROLOG správnym nástrojom na riešenie problému, zbaví vás bremena nutnosti písať veľa riadkov kódu a môže výrazne znížiť počet chýb. Pozri: Amo zákazník eoTek

Aby som sa vrátil k vašej otázke, kedy používať rekurziu jedným spôsobom, pozerám sa na programovanie s hardvérom na jednom konci a abstraktnými konceptmi na druhom konci. Čím bližšie je problém k hardvéru, tým viac premýšľam v imperatívnych jazykoch o tom, či a kedy, čím abstraktnejší problém, tým viac o jazykoch na vysokej úrovni s rekurziou. Ak však začnete písať nízkoúrovňový systémový kód a podobne a chcete si overiť, či je platný, potom vám prídu vhod riešenia, ako napríklad dokazovače viet, ktoré sa do značnej miery spoliehajú na rekurziu.

Ak sa pozriete na Jane Street, uvidíte, že používajú funkčný jazyk OCaml. Aj keď som nevidel žiadny z ich kódov, z čítania toho, čo o svojom kóde uvádzajú, mrzuto uvažujú rekurzívne.

Pretože hľadáte zoznam použití, poskytnem vám základnú predstavu o tom, čo hľadať v kóde, a zoznam základných použití, ktoré sú väčšinou založené na koncepte katamorfizmu, ktorý presahuje základy.

Pre C ++: Ak definujete štruktúru alebo triedu, ktorá má ukazovateľ na rovnakú štruktúru alebo triedu, potom by sa pri metódach prechodu, ktoré používajú ukazovatele, mala zvážiť rekurzia.

Jednoduchý prípad je jednosmerne prepojený zoznam. Zoznam by ste spracovali od hlavy alebo chvosta a potom by ste rekurzívne prechádzali zoznamom pomocou ukazovateľov.

Strom je ďalším prípadom, kde sa rekurzia často používa natoľko, že ak vidíte pohyb stromu bez rekurzie, mali by ste sa začať pýtať prečo? Nie je to zlé, ale niečo, čo by malo byť uvedené v komentároch.


Obaja množstvo dát a množstvo stromov vo vašom lese zaberie pamäť.

Vzhľadom na množstvo dát, ktoré máte, je zrejmé, prečo zaberá úložisko - sú to údaje, takže čím ich máte viac, tým viac miesta zaberá v pamäti. Ak je váš súbor údajov príliš veľký, možno ho ani nebudete môcť načítať do pamäte - na školenie bude možno potrebné zostať na disku (myslím, že scikit to nepodporuje).

Pokiaľ ide o počet stromov, každý strom, ktorý sa pestuje, je vyškolený na podmnožinu náhodných znakov (aby sa les mohol vyhnúť odchýlkam a vyhnúť sa tomu, aby všetky stromy rástli rovnako). Akonáhle je les natrénovaný, objekt modelu bude mať informácie o každom jednotlivom strome - je to cesta rozhodovania, rozdelené uzly, prahy atď. Toto sú informácie a čím viac informácií máte, tým viac úložného priestoru bude potrebovať. Preto viac stromov = viac informácií = viac využitia pamäte.

Existujú aj ďalšie faktory, ktoré určujú, koľko pamäte modelový objekt (trénovaný les) zaberie, napríklad max_depth, ktorý nastavuje maximálny počet vrstiev / úrovní, na ktoré môže strom vyrásť. Ak je tento veľký, stromy môžu rásť hlbšie, a preto bude modelový objekt väčší, a preto bude potrebovať viac úložného priestoru. To by však nemalo byť príliš veľké, aby ste sa vyhli nadmernému vybaveniu.


1 odpoveď 1

Nie, nie je to vôbec bezpečné. Prístupová fráza by priniesla deterministický kľúč, ale to by spôsobilo, že by bol tento kľúč citlivý na útoky hrubou silou a slovníkom. Okrem toho Fernet.generate_key () používa CSPRNG (os.urandom ()), ktorý má zdroj náhodnosti špecifický pre OS a neakceptuje seed.

Je možné vytvoriť deterministické, ale silné kľúče pomocou KDF založeného na hesle. Vstavaná knižnica hashlib v Pythone ponúka dve takéto funkcie: pbkdf2_hmac () a scrypt (). Oba KDF zavádzajú pracovný faktor (na vygenerovanie kľúča je potrebné vynaložiť veľké množstvo zdrojov CPU), ktorý prakticky neumožňuje útoky hrubou silou/slovníkom. Odporúčam scrypt, pretože to stojí zdroje CPU, pamäte a paralelných zdrojov, zatiaľ čo PBKDF2 spotrebováva iba zdroje CPU.

Vytvorenie kľúča kompatibilného s Fernetom pomocou scryptu:

Soľ by mala byť dlhá a náhodná, aj keď to nie je tajomstvo, musí byť jedinečné pre každé heslo. Parametre n, r a p určujú pracovný faktor (n = náklady na CPU/pamäť, r = veľkosť bloku, p = paralelizácia). Tieto hodnoty je možné zvýšiť v závislosti od operačného systému - proces derivácie kľúča by mal trvať približne 100 ms. Tajomná hodnota je iba heslo, hodnoty soli a n, r, p je možné uložiť alebo prenášať pomocou kľúča.


Budem predpokladať, že C1, C2 atď. Máte na mysli konvolučné vrstvy a P1, P2 znamená združovanie vrstiev a FC znamená plne prepojené vrstvy.

Pamäť potrebnú na prechod dopredu môžeme vypočítať takto:

Ak pracujete s hodnotami float32, potom podľa odkazu uvedeného vyššie @Alexandru Burlacu máte:

Vstup: 50x50x3 = 7 500 = 7,5K

P2: 12x12x64 = 9,216 = 9,2K & lt- Toto je problém (a moja aproximácia je tu veľmi ručne zvlnený odhad). Namiesto práce s 50, 25, '12,5 'by dávalo zmysel pracovať s násobkami 32. Počul som, že práca s násobkami 32 je tiež efektívnejšia z hľadiska pamäte. Dôvod, prečo je to zlý nápad, je to, že združovanie 2x2 nedelí priestor správne, pokiaľ viem. Neváhajte ma opraviť, ak sa mýlim.

Výstup: 1 x 10 = 10 = 0,01 K (takmer nič)

Celková pamäť: 7,5K + 80K + 20K + 40K + 0,5K = 157,2K * 4 bajty = 628,8 KB

Ak pracujete s minibatchom veľkosti 64, načítate 64 z nich naraz do pamäte a vykonáte všetky operácie spoločne, pričom všetko zmeníte takto:

Vstup: 64x50x50x3 = 480 000 = 480K = 0,48M

C1: 64x50x50x32 = 5 120 000 = 5,12 mil

P1: 64x25x25x32 = 1 280 000 = 1,28 M

C2: 64x25x25x64 = 2 560 000 = 2,56M

P2: 64x12x12x64 = 589 824 = 590K = 0,59M

FC: 64x500 = 32 000 = 32K = 0,032M

Výstup: 1x10x64 = 640 = 0,64K = 0,00064M (je nám to jedno, je to malé)

Celková pamäť: 10 miliónov x 4 bajty

40 MB (hovorím približné, pretože webová stránka uvádza aj približnú hodnotu)

EDIT: Web som zle prečítal, prepáčte.

Podľa webových stránok spätný lístok vyžaduje asi trojnásobok toho, pretože je potrebné uložiť:

aktivácie a súvisiace gradienty pre každý neurón - majú rovnakú veľkosť

gradienty hmotností (parametrov), ktoré sú rovnako veľké ako parametre


Úvod

Zmeny počasia, erózia životného prostredia, prírodné katastrofy a zvyšujúce sa dopravné zaťaženie môžu neustále meniť správanie a dokonca spôsobiť zhoršenie stavu mostov v ich dlhodobej prevádzke [1]. Aplikácia BHM bola uznaná ako atraktívny nástroj na zlepšenie zdravia a bezpečnosti mosta a včasné varovanie pred poškodením konštrukcie [2,3,4]. Typický systém BHM vo všeobecnosti poskytuje rôzne efektívne informácie v reálnom čase, ako sú teplota, vietor, trhliny, priehyb a napätie. Tieto informácie môžeme použiť na posúdenie zdravotného stavu mosta podľa zodpovedajúcej diagnostickej metódy. Monitorovanie zdravia mostov a hodnotenie bezpečnosti sú teda nevyhnutnými požiadavkami trvalo udržateľného rozvoja mostného inžinierstva.

Vieme, že detekčná účinnosť senzorov inštalovaných v mostnej konštrukcii sa počas ich dlhodobej prevádzky postupne zhoršuje, čo ovplyvňuje spoľahlivosť monitorovacích údajov. Okrem toho vážne environmentálne podmienky majú vážny vplyv na kvalitu zozbieraných údajov [2]. Typy zhromaždených údajov sú navyše rôzne a ich množstvo je obrovské. Problémom súčasného výskumu a aplikácie systému monitorovania zdravotného stavu mosta preto často nie je zhromažďovanie monitorovacích údajov, ale spôsob získavania užitočných informácií z rozsiahlych údajov nahromadených v priebehu času [5]. Väčšina systémov správy mostov však v súčasnosti používa údaje zozbierané zo senzorov bez analýzy, čo výrazne ovplyvní kvalitu údajov a povedie k tomu, že technológia identifikácie poškodenia mosta a diagnostika chýb sa ocitnú v dileme „katastrofa dát“. Cieľom tohto príspevku je použitie metód založených na dolovaní údajov na prekonanie problémov subjektivity, vysokej zložitosti výpočtu, nízkej citlivosti a komplikovanej technológie v tradičnej analýze.

Vďaka nepretržitej práci systému zberu údajov monitorovania mosta sa denne prenáša a ukladá do databázy veľké množstvo údajov. O nahromadených dátach v databáze možno preto povedať, že sú obrovské počas celého obdobia prevádzky mosta. Tradičná databázová technológia ukázala svoju slabosť v riešení tak veľkého množstva ukladania a spracovania údajov. Vznik technológie, ako je Hadoop, poskytuje vynikajúce riešenie pre rozsiahle spracovanie údajov.

Spracovanie údajov je základnou súčasťou systému monitorovania zdravia mosta. Vysokokvalitné údaje sú základom pre presné posúdenie zdravotného stavu mostov. S rastúcim rozsahom údajov monitorovania mostov sa tradičná databázová technológia v ukladaní a spracovaní údajov postupne oslabovala. Aby sa splnili výzvy, ktoré prináša rast údajov v systéme monitorovania mostov, funkcia monitorovania a predikcie dát mosta v kombinácii s Hadoop má teoretický význam a praktickú hodnotu. V tejto práci sme vytvorili klaster Hadoop s tromi uzlami a testovali sme navrhovaný algoritmus v distribuovanom prostredí.

V tomto príspevku sa zameriavame na spracovanie monitorovacích údajov a získanie štruktúrovaných údajov. A potom na základe teórie klastrovania dolovania údajov používame Kohonenovu neurónovú sieť na zoskupenie štruktúrovaných dát a vysvetlenie bodu v klastroch. Zaviedli sme tiež sieťový model LSTM na predpovedanie priehybu, ktorý môže odrážať zdravie mostnej konštrukcie analyzovaním historických monitorovacích údajov. Tieto dve metódy môžu byť do určitej miery použité na vyhodnotenie zdravotného stavu mostov. Prvý z nich môže získať klasifikačný vzor údajov zozbieraných za normálnych prevádzkových podmienok a potom poskytnúť zodpovedajúce včasné varovanie prostredníctvom analýzy odľahlých hodnôt generovaných pri vstupe nových údajov do siete.

Ten môže predpovedať hodnotu konkrétneho atribútu a potom môžeme získať zdravotný stav porovnaním predpovedanej hodnoty s jej obmedzenou hodnotou za normálnej prevádzky. Stručne povedané, Kohonenova neurónová sieť môže vykonať všeobecné hodnotenie celkovej štruktúry mostov a neurónová sieť LSTM môže predpovedať hodnotu parametra konkrétneho mosta. Tieto dva prístupy majú svoj vlastný dôraz, ale oba môžu hodnotiť zdravý stav mostov. Hlavný prínos a práca sú tieto:

Predspracovávame údaje zhromaždené senzormi systému monitorovania zdravia mosta. Po prvé, chýbajúce hodnoty vyplníme analýzou rozsahu hodnôt údajov, ako aj historických údajov a empirických údajov. Po druhé, analyzujeme príčinu abnormálnych údajov a opravíme ich. Nakoniec zlúčime údaje, ktoré sú najbližšie k času akvizície, a potom štandardizujeme každý záznam.

Neurónovú sieť Kohonen používame na samoadaptívne zoskupenie spracovaných štruktúrovaných dát a získanie klasifikačného vzoru dát zozbieraných za normálnych prevádzkových podmienok. Potom môžeme analyzovať odľahlé hodnoty generované pri vstupe nových údajov do siete a poskytnúť zodpovedajúce včasné varovanie podľa výsledkov.

Na predikciu hodnoty priehybu používame model predikcie časových radov vytvorený neurónovou sieťou LSTM. A potom môžeme získať zdravotný stav porovnaním predpovedanej hodnoty s jej limitnou hodnotou za normálnej prevádzky.


5 odpovedí 5

Pri problémoch s kódom sa používa veľký počet, pretože je ťažké sa s nimi vyrovnať, a to je ten istý dôvod, prečo sa používajú na šifrovanie. Pre väčšinu jazykov existujú triedy BigInt, ktoré im môžu pomôcť lepšie ich ovládať. Väčšinu problémov s kódom je možné vyriešiť pri minimálnom riešení veľkých čísel. Existujú však šikovné riešenia, ktoré nachádzajú spôsoby, ako sa vyhnúť práci s veľkými číslami, pokiaľ to nie je nevyhnutné.

Aj keď presné riešenie závisí od skutočného problému, existujú rôzne prístupy, ktoré môžete vyskúšať pred jednoduchým výpočtom hrubou silou pomocou svojvoľný alebo viacnásobné presná matematická knižnica (BigInt, GMP, MPFR, ARPREC atď.).

Najprv použite trochu matematiky. Dajú sa výrazy zjednodušiť? Povedali ste, že zdrojom týchto úloh sú hádanky, takže by som bol veľmi naklonený pozrieť sa na tento prístup a nájsť riešenie, pretože to môže byť faktorom hádaniek. aha moment. Rovnice s faktoriálmi, ako sú binomické pravdepodobnosti, je možné zvyčajne zjednodušiť alebo vypočítať (nepriamo) pomocou matematických techník, a nie hrubou silou.

Faktorizácia čísel a zrušenie spoločných faktorov by bola jedna z prvých vecí, ktoré by som skúsil, v prípade potreby ručne. Pomôcť môže viacnásobná presná kalkulačka.

Preformulovalo by sa otázka alebo jej hodnoty buď na inú bázu (napr. Binárnu, hexadecimálnu) alebo na rozdielovú stupnicu (napr. Logaritmická báza 2, 10 alebo e -- prirodzené) uľahčiť zaobchádzanie s hodnotami? Jedným príkladom logaritmickej stupnice je decibel používaný pre úrovne RF a zvuku.

Použitie techník, ktoré sa dnes bežne neučia, ale ktoré sú medzi programátormi, inžiniermi a matematikmi, ktorí sú oboznámení s pravidlom snímky, dobre známe, môže byť niekedy nápomocné.

V závislosti od otázky vás najskôr urobenie aproximácie môže niekedy viesť k správnej odpovedi tým, že vám markantné prvky nebudú prekážať v kreatívnom útoku na problém.

Pre váš príklad vypočítajte príbuznú (približnú), ale zjednodušenú rovnicu.

čo je veľmi blízko k správnej alebo presnej odpovedi

Ďalším „trikom“ je použitie modulo (mod, %, modulo, a bmod n) je jedným z mojich obľúbených spôsobov znižovania čísel, takže ak poznáte nejakú základnú abstraktnú algebru, niekedy môžete pracovať aj s modulárnou aritmetikou.

Toto je veľmi hrubý návod, ako by som sa postavil k rovnici „hádanky“ alebo k problému s programovaním, ktorý zahŕňa veľké množstvo.


5 odpovedí 5

Povedal mi, že existujú iba dve šifrovania, o ktorých vie, že ich nemožno prelomiť a AES medzi ne nepatrí

To mi hovorí, že ste položili svojmu profesorovi nesprávnu otázku. Spýtali ste sa odborníka na kybernetickú bezpečnosť, či je možné prelomiť algoritmus, na ktorý je odpoveď vždy áno, s výnimkou niekoľkých nepohodlných algoritmov, ako sú napríklad podložky na jednorazové použitie používané presne tým správnym spôsobom. Aj v týchto prípadoch sa môžete obávať zneužívania.

AES-256 je algoritmus. Dá sa to zlomiť. Ak sa pozriete na históriu kryptografie, každý algoritmus sa nakoniec pokazí. Preto vytvárame nové algoritmy. Otázkou je, ako dlho trvá, kým matematika prelomí.

Skutočnou otázkou je „aký je váš model hrozby?“ Akému útoku sa snažíte zabrániť? Vytvárate si digitálny zámok v diári, aby bol v bezpečí pred zvedavými očami vašej sestry, alebo ste Edward Snowden na úteku pred niekoľkými tromi listovými agentúrami s miliardami dolárov?

AES-256 je v súčasnej dobe označený ako dostatočný na použitie vo vláde USA na prenos informácií PRÍSNE TAJNÝCH/SCI. To je do značnej miery najvyššia úroveň klasifikácie, pre ktorú to mohli vyčistiť, takže americká vláda je celkom presvedčená, že nikto nemôže prelomiť AES-256 v časových lehotách potrebných na ochranu najväčších tajomstiev nášho národa.

(Takmer. To, čo skutočne hovorí, je, že sú si istí, že nikto mimo vlády USA môže zlomiť AES-256. To, čo si myslíte, že to hovorí o tom, či to americká vláda sama dokáže prelomiť, závisí od vášho modelu hrozby. a či sa zapojíte do diskusií o tom, či ťažká cínová fólia robí lepšie klobúky alebo nie)

AES -256 - bloková šifra - pokiaľ vieme, nebola porušená. Nebolo to ani blízko k zlomeniu. Na druhej strane nemôžeme dokázať, že je bezpečný. To znamená, že možno nájsť algoritmus, ktorý je schopný prelomiť AES. Väčšina šifier nemôže byť osvedčené byť v bezpečí. V informačno-teoretickom zmysle je zabezpečených iba niekoľko algoritmov, ako napríklad jednorazový blok.

Dokument, na ktorý poukazujete, je o súvisiacich kľúčových útokoch. Tieto útoky sú skutočne možné a znižujú silu AES pre konkrétne prípady použitia na hodnotu, ktorá teoreticky prelomí šifru. V zásade by ste nemali používať AES-256 na vytváranie hashovacej funkcie. Prakticky na dosiahnutie dôvernosti je AES-256 stále považovaný za bezpečný, dokonca aj proti útokom využívajúcim kvantovú kryptoanalýzu.

Zabezpečená bloková šifra však sama osebe neposkytuje žiadne zabezpečenie. Potrebujete bezpečný systém a pre tento zabezpečený systém aj vy smieť potrebovať bezpečný protokol. A v tom protokole ty smieť potrebovať schému alebo režim prevádzky (napríklad GCM). A táto schéma šifrovania môže vyžadovať blokovú šifru. A tá bloková šifra môže byť AES-256.

Samotný algoritmus AES -256 vyžaduje, aby bol za bezpečný považovaný dobre chránený tajný kľúč a bezpečná implementácia - napríklad ochrana pred útokmi z bočného kanála. Mohlo by to byť napríklad kompatibilné s FIPS.

Aj keď je algoritmus AES-256 považovaný za bezpečný, neznamená to, že je bezpečná vaša schéma, protokol alebo systém. Na to potrebujete model hrozby a ukážte, že je prakticky zabezpečený proti všetkým možným vektorom útoku.

TLDR: Pri vytváraní bezpečného systému môžete používať AES-256, považuje sa to za zabezpečené aj keď sa to nedá dokázať. Ostatné aspekty systému sú oveľa pravdepodobnejšie neúspešné ako AES -256 - samotná bloková šifra.


1 odpoveď 1

  1. Propagácia počtu položiek v batohu nevedie k optimálnym riešeniam.
  2. Jeden riešenie spočíva v pridaní tretej dimenzie. Je to dosť jednoduché, ale je potrebné pri tom vziať do úvahy niektoré skutočnosti. Všimnite si však, že to nie je jediná alternatíva

V nasledujúcom texte predpokladám, že ste oboznámení s riešením založeným na dynamickom programovaní. Najmä Nebudem diskutovať o tom, ako prejsť tabuľkou dozadu, aby som určil riešenie.

Najprv sa zamerajme na typický prípad: počet položiek je neobmedzený. V takom prípade postavíte stôl $ T $, kde $ T_$ obsahuje optimálnu hodnotu, keď sa celková kapacita batohu rovná $ i $ a do úvahy sa berú iba prvé položky $ j $. Odtiaľ:

kde $ w_j $ a $ v_j $ predstavujú hmotnosť a hodnotu $ j $-tej položky. Ak $ C $ je celková kapacita vášho batohu a existuje celkom $ N $ položiek, optimálne riešenie je dané $ T_$. Je známe, že tento algoritmus beží v pseudopolynomiálnom čase a jednou z jeho výhod je, že zvažuje iba tie kombinácie, ktoré zodpovedajú maximálnej kapacite.

To však nestačí na pridanie obmedzenia: maximálny počet položiek $ p $. Dôvodom je, že predchádzajúci vzorec opakovania neberie do úvahy rôzne kombinácie položiek:

  1. Po prvé, ak $ T_& lt (T_+v_j) $ potom $ T_= (T_+v_j) $, aby sa položka $ j $ -tá pridala k batohu napriek maximálnemu počtu zvažovaných položiek, $ p $ ---, aby ste možno porušili svoje obmedzenia. Well, you might be tempted here to apply the preceding formula keeping track of the number of items inserted at each step and do not add others if the number of items currently in the knapsack exceeds $p$ but,
  2. Second, if $T_>(T_+v_j)$ then $T_=T_$ so that this item is not added but that might be a big mistake in case the optimal solution $T_$ already consists of the maximum number of items to insert into the knapsack. The reason is that we are not properly comparing: on one hand, to preserve the optimal solution consisting of $p$ items selected among the previous $(j-1)$ on the other hand, to insert the $j$-th item and, additionally consider the best subset with $(p-1)$ items among the previous $(j-1)$.

So that a first solution consists of adding a third dimension. For your case, let $T_$ be the optimal solution when the capacity of the knapsack is $i$, only the first $j$ items are considered and it is not allowed to put more than $k$ items in the knapsack. Teraz,

  • If you are computing $T_$ for a number of items strictly less or equal than the number of items that can be inserted ($jleq k$) then proceed as usual but using the same value of $k$: $T_ =max<>, T_+v_j>$
  • Now, if you have to compute $T_$ for a number of items strictly larger than the number of items that can be inserted ($j> k$) then: $T_ =max<>, T_+v_j>$

The first expression should be clear. The second works since the $(k-1)$-th layer of the table $T$ keeps track of the best combination of $(k-1)$ items among the first $(j-1)$ as required above.

An efficient implementation of this algorithm does not need to compute $T_$ for all $k$. Note that the preceding recurrence relationships relate layer $k$ with $(k-1)$ and thus, it is possible to alternate between two successive layers (e.g., if you are interested in the optimal solution with $k=4$ you just use two consecutive layers: 0 and 1, 1 and 2, 2 and 3, 3 and 4 and you're done). In other words, this algorithm takes twice the memory required by the traditional approach based on dynamic programming and thus, it can be still run in pseudo-polynomial time.

Be aware, however, that this is not the only solution! And there is another you might find more elegant. In the preceding formulae, we retrieved the optimal solution which consisted of no more than $(k-1)$ items among the first $(j-1)$ as $T_$. However, it should be clear that this is precisely equal to $maxlimits_<>>$ just by using the original table!! ie., the optimal solution with no more than $k$ items can be also retrieved by considering the optimal solutions with 1 item, 2 items, 3 items, . $(j-1)$ items . To make this formulation work you should also keep track of the number of items considered in every partial solution so that you will need two integers per cell. This memory occupation results in precisely the same memory requirements of the algorithm shown above (using a third dimension in the form of layers $k$).