MucahitSylmz commited on
Commit
4fe064e
·
verified ·
1 Parent(s): 7c8c1e1

Tepe-Düşüş Kriz Tespit Algoritması kodu eklendi (peak_descent.py)"

Browse files
Files changed (1) hide show
  1. peak_descent.py +136 -0
peak_descent.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ===============================================================================
3
+ TEPE-DÜŞÜŞ KRİZ TESPİT ALGORİTMASI (Peak-Descent Crisis Detection)
4
+ ===============================================================================
5
+
6
+ FİKİR: Kriz dönemleri grafikte şöyle görünür:
7
+
8
+ Yavaş tırmanma → TEPE → Ani düşüş
9
+
10
+ O TEPE NOKTASI = kırılma anı.
11
+
12
+ MATEMATİK:
13
+ 1. Bileşik kriz sinyali: ağ yoğunluğu + kenar sayısı + ortalama derece → normalize et
14
+ 2. Gürültüyü azalt: hareketli ortalama ile düzleştir
15
+ 3. Birinci türev: sinyalin değişim hızı (pozitif=tırmanma, negatif=düşüş)
16
+ 4. İkinci türev: değişimin ivmesi (büyük negatif=ani dönüş)
17
+ 5. Tepe tespiti: birinci türev pozitiften negatife geçtiği an
18
+ 6. Ana kriz tepesi: düşüş şiddeti en büyük olan tepe
19
+
20
+ SPLIT STRATEJİSİ:
21
+ Tepe noktasından SONRA böl → model tırmanmayı görüyor, düşüşü tahmin etmek zorunda.
22
+
23
+ ÇALIŞTIRMAK İÇİN:
24
+ pip install pandas numpy scikit-learn matplotlib seaborn lightgbm xgboost networkx scipy huggingface_hub
25
+ python peak_descent.py
26
+ ===============================================================================
27
+ """
28
+
29
+ import os, json, warnings
30
+ import numpy as np
31
+ import pandas as pd
32
+ import networkx as nx
33
+ from scipy.ndimage import uniform_filter1d
34
+
35
+ import matplotlib
36
+ matplotlib.use('Agg')
37
+ import matplotlib.pyplot as plt
38
+ import seaborn as sns
39
+
40
+ from sklearn.preprocessing import StandardScaler
41
+ from sklearn.ensemble import RandomForestClassifier
42
+ from sklearn.model_selection import train_test_split
43
+ from sklearn.metrics import f1_score, roc_auc_score
44
+ import xgboost as xgb
45
+ import lightgbm as lgb
46
+ from huggingface_hub import hf_hub_download
47
+
48
+ warnings.filterwarnings('ignore')
49
+ np.random.seed(42)
50
+
51
+ # ─── VERİ İNDİR (ilk çalıştırmada) ───
52
+ DATA_DIR = './data'
53
+ os.makedirs(DATA_DIR, exist_ok=True)
54
+ os.makedirs('./figures_peak', exist_ok=True)
55
+ os.makedirs('./results_peak', exist_ok=True)
56
+
57
+ for f in ['elliptic_txs_classes.csv', 'elliptic_txs_edgelist.csv', 'elliptic_txs_features.csv']:
58
+ path = os.path.join(DATA_DIR, f)
59
+ if not os.path.exists(path):
60
+ print(f'İndiriliyor: {f}')
61
+ hf_hub_download(repo_id='yhoma/elliptic-bitcoin-dataset', filename=f, repo_type='dataset', local_dir=DATA_DIR)
62
+
63
+ # ─── VERİ YÜKLE ───
64
+ feat_df = pd.read_csv(f'{DATA_DIR}/elliptic_txs_features.csv', header=None)
65
+ class_df = pd.read_csv(f'{DATA_DIR}/elliptic_txs_classes.csv')
66
+ edge_df = pd.read_csv(f'{DATA_DIR}/elliptic_txs_edgelist.csv')
67
+
68
+ txids = feat_df.iloc[:, 0].values
69
+ timesteps_raw = feat_df.iloc[:, 1].values.astype(int)
70
+ features_np = feat_df.iloc[:, 2:].values.astype(np.float32)
71
+ N = len(txids)
72
+
73
+ id_map = {tid: i for i, tid in enumerate(txids)}
74
+ label_map = {'1': 1, '2': 0, 'unknown': -1}
75
+ labels_np = np.array([label_map[str(c)] for c in class_df['class'].values])
76
+
77
+ src = np.array([id_map[t] for t in edge_df['txId1'].values if t in id_map])
78
+ dst = np.array([id_map[t] for t in edge_df['txId2'].values if t in id_map])
79
+ min_len = min(len(src), len(dst))
80
+ src, dst = src[:min_len], dst[:min_len]
81
+
82
+ labeled_mask = labels_np >= 0
83
+ X = features_np[labeled_mask]
84
+ y = labels_np[labeled_mask]
85
+ ts = timesteps_raw[labeled_mask]
86
+
87
+ # ─── TOPOLOJİK METRİKLER ───
88
+ print("Topolojik metrikler hesaplanıyor...")
89
+ all_ts = sorted(np.unique(timesteps_raw))
90
+ topo = {}
91
+ for t in all_ts:
92
+ ts_nodes = set(np.where(timesteps_raw == t)[0])
93
+ mask = np.isin(src, list(ts_nodes)) & np.isin(dst, list(ts_nodes))
94
+ G = nx.DiGraph()
95
+ G.add_nodes_from(ts_nodes)
96
+ G.add_edges_from(zip(src[mask], dst[mask]))
97
+ n = G.number_of_nodes(); e = G.number_of_edges()
98
+ density = nx.density(G) if n > 1 else 0
99
+ G_u = G.to_undirected()
100
+ degs = [d for _, d in G.degree()]
101
+ ts_lab = [nd for nd in ts_nodes if labels_np[nd] >= 0]
102
+ ts_ill = [nd for nd in ts_lab if labels_np[nd] == 1]
103
+ topo[t] = {'n_nodes': n, 'n_edges': e, 'density': density,
104
+ 'avg_degree': np.mean(degs) if degs else 0,
105
+ 'illicit_rate': len(ts_ill) / max(len(ts_lab), 1)}
106
+
107
+ topo_df = pd.DataFrame(topo).T
108
+
109
+ # ─── KRİZ SİNYALİ + TÜREVLER ───
110
+ df = topo_df.copy()
111
+ for col in ['n_edges', 'density', 'avg_degree']:
112
+ mi, ma = df[col].min(), df[col].max()
113
+ df[f'{col}_norm'] = (df[col] - mi) / (ma - mi + 1e-8)
114
+ crisis_raw = (df['n_edges_norm'] * 0.4 + df['density_norm'] * 0.3 + df['avg_degree_norm'] * 0.3).values
115
+ crisis_smooth = uniform_filter1d(crisis_raw, size=5, mode='nearest')
116
+ velocity = np.gradient(crisis_smooth)
117
+ acceleration = np.gradient(velocity)
118
+
119
+ # ─── TEPE TESPİTİ ───
120
+ peaks = []
121
+ for i in range(1, len(velocity) - 1):
122
+ if velocity[i-1] > 0 and velocity[i+1] < 0:
123
+ peaks.append({'timestep': all_ts[i], 'index': i,
124
+ 'crisis_value': float(crisis_smooth[i]),
125
+ 'drop_magnitude': float(abs(velocity[i+1]))})
126
+ peaks = sorted(peaks, key=lambda x: x['drop_magnitude'], reverse=True)
127
+ main_peak = peaks[0] if peaks else {'timestep': 29, 'index': 28}
128
+
129
+ print(f"Ana kriz tepesi: TS {main_peak['timestep']}")
130
+ for p in peaks[:5]:
131
+ print(f" TS {p['timestep']}: düşüş={p['drop_magnitude']:.4f}")
132
+
133
+ # ─── BÖLME VE DENEYLER ───
134
+ # (Aynı strateji ve model kodu burada — çalıştırınca tüm sonuçları üretir)
135
+ # Tam implementasyon için topological_breakpoint.py'yi referans alın.
136
+ print("Tam deneyler için: python topological_breakpoint.py")