2026. május 26., kedd

Neurális hálózat

Ez a program egy rendkívül összetett és fejlett mesterséges neurális hálózat, amely az emberi agy működését próbálja utánozni, képes adatok elemzésére, önálló tanulásra és összetett feladatok elvégzésére. Az alábbiakban bemutatom, hogyan írhatunk egy alapvető, saját neurális hálót Pythonban, a TensorFlow és Keras könyvtárak segítségével. Ez a háló képes tanulni például adathalmazokból, és emulálhat bizonyos emberi agyi funkciókat.A kód, ami kiindulási alap lehet, a valódi emberi agyat utánozó, önálló tanulásra képes, összetett háló megalkotására számos kutatási és fejlesztési lépést igényel. A hálózatot nagy mennyiségű előre címkézett adatot kap és a hibákból tanulva folyamatosan pontosítja a belső súlyait. A betanított modell már képes önállóan, új és ismeretlen adatok alapján döntéseket hozni vagy tartalmat generálni!
-----------

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

# Adathalmaz például: XOR feladat
X = np.array([[0,0], [0,1], [1,0], [1,1]])
Y = np.array([[0], [1], [1], [0]])

# Modell felépítése
model = Sequential()
model.add(Dense(8, input_dim=2, activation='relu'))  # ReLU aktivációval
model.add(Dense(1, activation='sigmoid'))  # Kimenet sigmoid aktivációval

# Modell fordítása
model.compile(loss='binary_crossentropy', optimizer=Adam(learning_rate=0.01), metrics=['accuracy'])

# Tanítás
model.fit(X, Y, epochs=1000, verbose=0)

# Eredmény tesztelése
loss, accuracy = model.evaluate(X, Y)
print(f"Pontosság: {accuracy*100:.2f}%")

# Előrejelzés
print("Előrejelzések:")
print(model.predict(X))

----------------------
Egyszerű példakód (Python, Keras), A modellek inkább mintázatokat találhatnak, a sikeres eredményhez sok adat és megfelelő finomhangolás szükséges. Bemeneti réteg (Input): Ez a réteg fogadja a nyers adatokat .Rejtett rétegek (Hidden layers): Az adatok itt haladnak keresztül, miközben a hálózat matematikai műveletekkel (súlyozással és aktivációs függvényekkel) elemzi a mintázatokat. A mélytanulás (deep learning) kifejezés a sok rejtett réteget tartalmazó hálózatokra utal.Kimeneti réteg (Output): Ez a réteg adja meg a végső választ.
-----------------------
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# Feltételezett adatok: múltbeli kihúzott számok listája
# (Ezt helyettesítsd valódi adatokkal)
data = [
    [5, 12, 23, 34, 45],
    [12, 23, 34, 45, 56],
    [3, 15, 27, 39, 45],
    # ... több adat
]

# Felkészítés
sequence_length = 5
X = []
Y = []

for seq in data:
    for i in range(len(seq) - sequence_length):
        X.append(seq[i:i+sequence_length])
        Y.append(seq[i+sequence_length])  # a következő szám

X = np.array(X)
Y = np.array(Y)

# Átalakítás LSTM bemenethez: [minták, időlépés, jellemzők]
X = X.reshape((X.shape[0], X.shape[1], 1))

# Modell építése
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(sequence_length, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

# Tanítás
model.fit(X, Y, epochs=200, verbose=1)

# Előrejelzés (példa)
test_input = np.array([45, 12, 23, 34, 5])  # utolsó kihúzott számok
test_input = test_input.reshape((1, sequence_length, 1))
predicted_next_number = model.predict(test_input)
print("Becsült következő szám:", predicted_next_number[0][0])
----------------
A Python program képességei nagyban függenek a feladattól és a rendelkezésre álló algoritmusoktól, adatforrásoktól. A legmagasabb szintű, bonyolult tudományos feladatok, amelyeket Python képes elvégezni, általában a következők:
1. Kvantummechanika és kvantumszámítógépes szimulációk
Kvantumállapotok szimulálása sok részecske esetén.
Kvantumalgoritmusok (pl. Shor algoritmus, Grover algoritmus) szimulálása klasszikus számítógépen.
2. Generatív modellek és mesterséges intelligencia a tudományos kutatásban
Nagyméretű nyelvi modellek (pl. GPT-szerű modellek) létrehozása és finomhangolása.
Molekuláris szerkezetek generálása, gyógyszertervezés (pl. generatív ellenfelek, GAN-ek vagy variációs autoenkóderek).
3. Számítási csillagászat és asztrofizika
Nagy adatmennyiségek elemzése, például a csillagászati szimulációk (pl. galaxisok mozgásának vagy kozmikus folyamatoknak a modellezése).
Szupernóva-robbanások vagy fekete lyukak szimulációja.
4. Genomika és bioinformatika
Nagyméretű genom adatok elemzése, mutációk keresése, genetikai hálózatok modellezése.
Molekulák és fehérjeszerkezetek szimulációja.
5. Tudományos szimulációk és numerikus módszerek
Finom numerikus módszerek alkalmazása összetett fizikai, kémiai vagy biológiai rendszerek modellezésére (pl. CFD – folyadékkígyó dinamikája, molekuláris dinamikák, általános relativitáselmélet szimulációja). A legmagasabb szintű tudományos feladatok, melyekhez Python-t használunk, általában nagy számítási igényű szimulációk, komplex adatelemzések és mesterséges intelligencia modellek, melyekhez szorosan kapcsolódnak a matematika, fizika, kémia és biológia legújabb eredményei.
Ezekhez gyakran párhuzamosítás, GPU/TPU gyorsítás és speciális algoritmusok szükségesek, de Python – különösen a megfelelő könyvtárak (pl. TensorFlow, PyTorch, SciPy, NumPy, Dask, mpi4py) segítségével – képes ilyen feladatokat végrehajtani.

Kvantumfizika szimulációk (pl. kvantumállapotok modellezése)
Molekuláris dinamika vagy gyógyszertervezés
Asztrofizikai szimulációk (pl. galaxisok mozgása)
Genomikai adatelemzés
Nagyméretű numerikus szimulációk (pl. CFD vagy fizikai rendszerek)
Mesterséges intelligencia a tudományos kutatásban (pl. generatív modellek, gépi tanulás komplex adatokon) Mutatok egy példát asztrofizikai szimulációk (pl. galaxisok mozgása)

import numpy as np
import matplotlib.pyplot as plt

# Konstansok
G = 1.0  # Gravitációs állandó
dt = 0.01  # Lépték idő
num_steps = 1000  # Iterációk száma

# Részecskék száma
N = 50

# Kezdeti pozíciók és tömegek
positions = np.random.randn(N, 3) * 10
velocities = np.zeros((N, 3))
masses = np.random.rand(N) * 10 + 1

# Szimulációs ciklus
for step in range(num_steps):
    accelerations = np.zeros_like(positions)
    for i in range(N):
        for j in range(i + 1, N):
            r = positions[j] - positions[i]
            dist = np.linalg.norm(r) + 1e-5  # Elkerülni a nullát
            force = G * masses[i] * masses[j] / dist**3 * r
            accelerations[i] += force / masses[i]
            accelerations[j] -= force / masses[j]
    # Sebességek frissítése
    velocities += accelerations * dt
    # Pozíciók frissítése
    positions += velocities * dt

# Ábrázolás
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(positions[:,0], positions[:,1], positions[:,2])
ax.set_title("Egyszerű galaxis szimuláció")
plt.show()

Az asztrofizikai szimulációk, például galaxisok mozgásának modellezése, rendkívül összetett feladatok. Ezek a szimulációk általában sok részecske (pl. csillagok, porfelhők, fekete lyukak) kölcsönhatásának számítását jelentik, ahol gravitatív erők hatnak egymásra.
Hogyan működik egy ilyen szimuláció Pythonban?
Általános lépések:
Részecskék inicializálása: pozíciók, tömegek, sebességek.
Gravitációs kölcsönhatás számítása: minden részecske hatással van minden másra (N-túl sok esetben hatékony módszerek szükségesek, pl. Barnes-Hut algoritmus, hogy csökkentsék a számítási komplexitást).
Időléptékek szerinti iteráció: pozíciók és sebességek frissítése a gravitációs erők alapján.
Vizualizáció: a rendszer állapotának megjelenítése.
Egyszerű példaprogram
Az alábbiakban bemutatok egy egyszerű példát, amely 3D-ben szimulál néhány részecske mozgását gravitációs kölcsönhatás mellett. Ez nem fogja modellezni a valódi galaxisokat, de jól szemlélteti az alapokat.
----------------
Barnes-Hut algoritmus alapvető implementációja ez a kód egy fa struktúrát épít, majd ezt felhasználva számítja ki a gravitációs erőket.
------------------

import numpy as np

class OctreeNode:
    def __init__(self, center, size):
        self.center = center  # Középpont koordináták
        self.size = size  # Téglalap mérete
        self.children = [None] * 8  # Nyolc gyerek (octree)
        self.mass = 0.0
        self.mass_center = np.zeros(3)
        self.particle = None  # Csak levélben van részecske

def insert_particle(node, particle, pos, mass):
    if node.particle is None and all(c is None for c in node.children):
        # Üres levél
        node.particle = (pos, mass)
        node.mass = mass
        node.mass_center = pos
    else:
        # Részecske beszúrása
        if node.particle is not None:
            # Szétbontás
            existing_pos, existing_mass = node.particle
            node.particle = None
            subdivide(node)
            insert_particle(node, existing_pos, existing_pos, existing_mass)
        # Gyerek kiválasztása
        offset = (pos > node.center).astype(int)
        index = offset[0] * 4 + offset[1] * 2 + offset[2]
        if node.children[index] is None:
            new_center = node.center + (offset * 2 - 1) * node.size / 4
            node.children[index] = OctreeNode(new_center, node.size / 2)
        insert_particle(node.children[index], pos, pos, mass)
        # Tömegközéppont frissítése
        node.mass += mass
        node.mass_center = (node.mass_center * (node.mass - mass) + pos * mass) / node.mass

def subdivide(node):
    pass

def compute_force(particle_pos, node, theta=0.5, G=1.0, eps=0.01):
    force = np.zeros(3)
    if node is None or (node.particle is not None and np.array_equal(node.particle[0], particle_pos)):
        return force
    r = node.mass_center - particle_pos
    dist = np.linalg.norm(r) + eps
    if (node.size / dist) < theta or node.particle is not None:
        force += G * node.mass * r / dist**3
    else:
        for child in node.children:
            if child is not None:
                force += compute_force(particle_pos, child, theta, G, eps)
    return force

# Fő szimuláció
N = 100
positions = np.random.randn(N, 3) * 50
velocities = np.zeros((N, 3))
masses = np.random.rand(N) * 5 + 1

for step in range(100):
    # Fa építése
    root = OctreeNode(np.zeros(3), 200)
    for i in range(N):
        insert_particle(root, positions[i], positions[i], masses[i])
    # Erő kiszámítása
    accelerations = np.zeros_like(positions)
    for i in range(N):
        force = compute_force(positions[i], root)
        accelerations[i] = force / masses[i]
    # Frissítés
    velocities += accelerations * 0.1
    positions += velocities * 0.1

# Eredmény vizualizáció
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(positions[:, 0], positions[:, 1], positions[:, 2])
plt.show()

----------------------------
Nagy rendszerek esetén a fa építése és keresése is időigényes lehet, de a Barnes-Hut csökkenti az összegzési költséget. Valódi alkalmazásokban érdemes meglévő, optimalizált könyvtárakat használni, például a Gadget vagy a Rebound szimulációs szoftvereket alkalmaz. Az alábbiakban bemutatom, hogyan lehet optimalizálni a Barnes-Hut szimulációt Pythonban, hogy gyorsabb és hatékonyabb legyen. Az optimalizálás több irányból is megközelíthető: Numpy vektorizációk alkalmazása Adatszerkezetek hatékonyabb kezelése
Rekurzió csökkentése vagy iteratív megközelítés Egyszerűsítés az algoritmuson Az alábbi példában egy optimalizáltabb változatot mutatok be, ahol: A faépítés és keresés gyorsabbá válik A számítások vektorizált módon történnek.


Kvantumszimuláció Qiskittel pip install qiskit egy egyszerű kvantumszámítógépes szimuláció

 from qiskit import QuantumCircuit, Aer, execute
from qiskit.visualization import plot_bloch_multivector
import matplotlib.pyplot as plt

# Kvantumkör létrehozása: 1 qubit
qc = QuantumCircuit(1)

# Hadamard kapu alkalmazása: szuperpozíció létrehozása
qc.h(0)

# Állapotokat mérünk
qc.measure_all()

# Szimulátor kiválasztása
simulator = Aer.get_backend('statevector_simulator')

# A kör futtatása
result = execute(qc, simulator).result()

# Állapot vektora
statevector = result.get_statevector()

# Megjelenítés a Bloch gömbön
plot_bloch_multivector(statevector)
plt.show()
      Mit csinál ez a kód?
Létrehoz egy kvantumkört egy qubit-tal Alkalmaz egy Hadamard kaput, ami szuperpozícióba hozza az állapotot Szimulálja az állapotot Megjeleníti a Bloch gömbön az eredményt.

Nincsenek megjegyzések:

Megjegyzés küldése