Π£ Π²Π°Ρ Π΅ΡΡΡ Π±ΠΈΠ½Π°ΡΠ½Π°Ρ ΡΠ΅Π»Π΅Π²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ y
(ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· 0 ΠΈ 1) ΠΈ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊ x
(ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ Π΄Π»ΠΈΠ½Ρ). ΠΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ best_split(x, y)
, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΠΉΠ΄ΡΡ ΡΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ°, ΠΏΡΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ (ΠΌΠ΅Π½ΡΡΠ΅/Π±ΠΎΠ»ΡΡΠ΅) Π±ΡΠ΄Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΌΠ΅Π½ΡΡΠ΅Π½Π° ΡΠ½ΡΡΠΎΠΏΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π»ΡΡΡΠΈΠΉ threshold
, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΡΠ΅ Π΄Π΅Π»ΡΡΡΡ Π½Π° Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ ΠΏΠΎ x
, ΠΈ Ρ ΡΡΠΈΡ
Π³ΡΡΠΏΠΏ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ°Ρ ΡΡΠ΅Π΄Π½ΡΡ ΡΠ½ΡΡΠΎΠΏΠΈΡ. ΠΡΠΎ Π±Π°Π·ΠΎΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅ ID3.
Π¦Π΅Π»Ρ:
ΠΠ΅ΡΠ½ΡΡΡ threshold, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°ΡΡ Π½Π°ΠΈΠ»ΡΡΡΠ΅Π΅ (Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π΅) Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π΄Π½Π΅Π²Π·Π²Π΅ΡΠ΅Π½Π½ΠΎΠΉ ΡΠ½ΡΡΠΎΠΏΠΈΠΈ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
import numpy as np
def entropy(labels):
if len(labels) == 0:
return 0
p = np.bincount(labels) / len(labels)
return -np.sum([pi * np.log2(pi) for pi in p if pi > 0])
def best_split(x, y):
x = np.array(x)
y = np.array(y)
thresholds = sorted(set(x))
best_entropy = float('inf')
best_thresh = None
for t in thresholds:
left_mask = x <= t
right_mask = x > t
left_entropy = entropy(y[left_mask])
right_entropy = entropy(y[right_mask])
w_left = np.sum(left_mask) / len(x)
w_right = 1 - w_left
avg_entropy = w_left * left_entropy + w_right * right_entropy
if avg_entropy < best_entropy:
best_entropy = avg_entropy
best_thresh = t
return best_thresh
# ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
x = [2, 4, 6, 8, 10, 12]
y = [0, 0, 1, 1, 1, 1]
print(best_split(x, y))
# ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ 4 ΠΈ 6 (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 6), ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π΄Π΅Π»ΠΈΡ ΠΊΠ»Π°ΡΡΡ