WedX - журнал о программировании и компьютерных науках

Проблема с setdiff в R при решении polynom::polynomial

Может кто-нибудь объяснить, почему функция setdiff в R не работает в следующем примере? Обратите внимание, что не имеет значения, использую ли я базу R или dplyr.

#setdiff doesn't work
poly1 <- polynom::polynomial(c(-2,1))
poly2 <- polynom::polynomial(c(-4,0,1))
solve_poly1 <- solve(poly1)
solve_poly2 <- solve(poly2)
print(solve_poly2)
print(solve_poly1)
setdiff(solve_poly2, solve_poly1)
dplyr::setdiff(solve_poly2, solve_poly1)

#what is the structure?
str(solve_poly1)
str(solve_poly2)

#setdiff works
set1 <- c(2)
set2 <- c(-2,2)
setdiff(set2, set1)
dplyr::setdiff(set2, set1)

#what is the structure?
str(set1)
str(set2)

Вот мой вывод:

> #setdiff doesn't work
> poly1 <- polynom::polynomial(c(-2,1))

> poly2 <- polynom::polynomial(c(-4,0,1))

> solve_poly1 <- solve(poly1)

> solve_poly2 <- solve(poly2)

> print(solve_poly2)
[1] -2  2

> print(solve_poly1)
[1] 2

> setdiff(solve_poly2, solve_poly1)
[1] -2  2

> dplyr::setdiff(solve_poly2, solve_poly1)
[1] -2  2

> #what is the structure?
> str(solve_poly1)
 num 2

> str(solve_poly2)
 num [1:2] -2 2

> #setdiff works
> set1 <- c(2)

> set2 <- c(-2,2)

> setdiff(set2, set1)
[1] -2

> dplyr::setdiff(set2, set1)
[1] -2

> #what is the structure?
> str(set1)
 num 2

> str(set2)
 num [1:2] -2 2

Основываясь на структуре моих массивов, я не понимаю, почему корни многочленов обрабатываются иначе, чем массивы, объявленные вручную.

r
16.04.2020

Ответы:


1

Это не ошибка с setdiff, а ошибка с плавающей запятой в R. Поскольку полином решается численно, значения solve_poly2 не равны точно -2 и 2.

> solve_poly1 - set1
[1] 0
> solve_poly2 - set2
[1] -4.440892e-16 -4.440892e-16

Чтобы избежать этой проблемы, вы можете определить функцию для выполнения операции setdiff в пределах допуска, которую я изменил из этого соответствующего ответа .

setdiff_tolerance <- function(a, b, tol = 1e-7) {
  a[sapply(a, function(x) !any(abs(x - b) <= tol))]
}

setdiff_tolerance(solve_poly2, solve_poly1)
[1] -2
16.04.2020
  • Имеет смысл. Спасибо большое! 16.04.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]