def find_elbow(k_range, inertia): # Konwersja wejściowych list na tablice NumPy dla bezpieczeństwa k_range = np.asarray(k_range) inertia = np.asarray(inertia) # Współrzędne punktów skrajnych x1, y1 = k_range[0], inertia[0] x2, y2 = k_range[-1], inertia[-1] # Równanie prostej przechodzącej przez p1 i p2 w postaci ogólnej: Ax + By + C = 0 # A = y2 - y1, B = -(x2 - x1), C = x2*y1 - y2*x1 A = y2 - y1 B = -(x2 - x1) C = x2 * y1 - y2 * x1 # Obliczamy odległości dla wszystkich punktów jednocześnie (bez pętli) # Wzór: |A*x + B*y + C| / sqrt(A^2 + B^2) numerator = np.abs(A * k_range + B * inertia + C) denominator = np.sqrt(A**2 + B**2) distances = numerator / denominator # Zwracamy k, dla którego odległość jest największa return k_range[np.argmax(distances)]