def find_eigenvector(A, tolerance=0.00001): guess = [1 for __ in A] while True: result = matrix_operate(A, guess) length = magnitude(result) next_guess = scalar_multiply(1 / length, result) if distance(guess, next_guess) < tolerance: return next_guess, length # собственный вектор, собственное число guess = next_guess
def knn_classify(k, labeled_points, new_point): """каждая маркированная точка должна быть представлена парой (точка, метка)""" # упорядочить маркированные точки от ближайшей до самой удаленной by_distance = sorted(labeled_points, key=lambda point_label: distance(point_label[0], new_point)) # найти метки для k ближайших k_nearest_labels = [label for _, label in by_distance[:k]] # и дать им проголосовать return majority_vote(k_nearest_labels)
def cluster_distance(cluster1, cluster2, distance_agg=min): """найти агрегированное расстояние между элементами кластера cluster1 и элементами кластера cluster2""" return distance_agg([distance(input1, input2) for input1 in get_values(cluster1) for input2 in get_values(cluster2)])
y, theta_0, alpha_0) if __name__ == "__main__": print("using the gradient") v = [random.randint(-10, 10) for i in range(3)] tolerance = 0.0000001 while True: #print v, sum_of_squares(v) gradient = sum_of_squares_gradient(v) # compute the gradient at v next_v = step(v, gradient, -0.01) # take a negative gradient step if distance(next_v, v) < tolerance: # stop if we're converging break v = next_v # continue if we're not print("minimum v", v) print("minimum value", sum_of_squares(v)) print() print("using minimize_batch") v = [random.randint(-10, 10) for i in range(3)] v = minimize_batch(sum_of_squares, sum_of_squares_gradient, v) print("minimum v", v) print("minimum value", sum_of_squares(v))
y, theta_0, alpha_0) if __name__ == "__main__": print("применение градиента") v = [random.randint(-10, 10) for i in range(3)] tolerance = 0.0000001 while True: #print v, sum_of_squares(v) gradient = sum_of_squares_gradient(v) # вычислить градиент в точке v next_v = step(v, gradient, -0.01) # сделать шаг антиградиента if distance(next_v, v) < tolerance: # остановиться, если сходимся break v = next_v # продолжить, если нет print("минимум v", v) print("минимальное значение", sum_of_squares(v)) print() print("применение пакетной минимизации minimize_batch") v = [random.randint(-10, 10) for i in range(3)] v = minimize_batch(sum_of_squares, sum_of_squares_gradient, v) print("минимум v", v) print("минимальное значение", sum_of_squares(v))
def random_distances(dim, num_pairs): return [distance(random_point(dim), random_point(dim)) for _ in range(num_pairs)]