Почему переменные объявляются с их именем интерфейса в Java? [дубликат]

Спасибо за общие ответы. Вот другая попытка суммирования их. Прощение, если я говорю слишком много "очевидных" вещей: Я ничего не знал о наименьших квадратах прежде, таким образом, все было плохо мне знакомо.

НЕ полиномиальной интерполяция

Полиномиальной интерполяция соответствует многочлену градуса n, учитывая n+1 точки данных, например, находит кубическое, которое передает точно через четыре данных точки. Как сказано в вопросе, это не было, хотят меня wanted—, я имел много точек и хотел многочлен маленького градуса (который будет [только 1 128] [приблизительно 1 128] соответствие, если мы не были удачливы), —, но так как некоторые ответы настояли на том, чтобы говорить об этом, я должен упомянуть их:) Lagrange многочлен , матрица Vandermonde , и т.д.

, Что такое наименьшие квадраты?

"Наименьшие квадраты" конкретное определение/критерий / "метрика" "как хорошо" аппроксимации полиномом. (Существуют другие, но это является самым простым.) Говорят, что Вы пытаетесь соответствовать многочлену p (x, y) = + основной обмен + cy + дуплекс 2 глоток> + ey 2 глоток> + fxy к некоторым точкам определенных данных (x я , y я , Z я ) (где "Z я " был "f (x я , y я )" в вопросе). С наименьшими квадратами проблема состоит в том, чтобы найти "лучшие" коэффициенты (a, b, c, d, e, f), такими, что то, что минимизировано (сохранил "меньше всего"), является "суммой квадратов остатков", а именно,

S = ∑ я (+ основной обмен я + cy я + дуплекс я 2 глоток> + ey я 2 глоток> + fx я y я - Z я ) 2 глоток>

Теория

важная идея состоит в том, что при рассмотрении S как функции (a, b, c, d, e, f), тогда S , минимизировал в точке, в которой градиент 0 . Это означает это, например, ∂ S/∂ f=0, т.е. это

я 2 (+ … + fx я y я - Z я ) x я y я = 0

и подобные уравнения для a, b, c, d, e. Обратите внимание, что это просто линейные уравнения в a… f. Таким образом, мы можем решить их с [1 115] Исключение Гаусса или любой из [1 116] обычные методы .

Это все еще называют "линейными наименьшими квадратами", потому что, хотя функция мы хотели, был квадратичный многочлен, это все еще линейно в параметрах (a, b, c, d, e, f). Обратите внимание, что то же самое работает, когда мы хотим, чтобы p (x, y) был любой "линейной комбинацией" [1 130] произвольный fj функций вместо просто многочлена (= "линейная комбинация одночленов").

Код

Для одномерного случая (когда существует только переменный x — fj, одночлены x j глоток>), существует Numpy polyfit :

>>> import numpy
>>> xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ys = [1.1, 3.9, 11.2, 21.5, 34.8, 51, 70.2, 92.3, 117.4, 145.5]
>>> p = numpy.poly1d(numpy.polyfit(xs, ys, deg=2))
>>> print p
       2
1.517 x + 2.483 x + 0.4927

Для многомерного случая или линейных наименьших квадратов в целом, существует SciPy. , Как объяснено в его документации , это берет матрицу fj значений ( x я ). (Теория состоит в том, что это находит псевдоинверсия Мура-Пенроуза из A.) С нашим выше вовлечения в качестве примера (x я , y я , Z я ), соответствуя многочлену означает, что fj является одночленами x () глоток> y () глоток>. Следующее находит лучшее квадратичное (или лучший многочлен любого другого градуса при изменении "градуса = 2" строки):

from scipy import linalg
import random

n = 20
x = [100*random.random() for i in range(n)]
y = [100*random.random() for i in range(n)]
Z = [(x[i]+y[i])**2 + 0.01*random.random() for i in range(n)]

degree = 2
A = []
for i in range(n):
    A.append([])
    for xd in range(degree+1):
        for yd in range(degree+1-xd):
            A[i].append((x[i]**xd)*(y[i]**yd)) #f_j(x_i)

c,_,_,_ = linalg.lstsq(A,Z)
j = 0
for xd in range(0,degree+1):
    for yd in range(0,degree+1-xd):
        print " + (%.2f)x^%dy^%d" % (c[j], xd, yd),
        j += 1

печать

 + (0.01)x^0y^0  + (-0.00)x^0y^1  + (1.00)x^0y^2  + (-0.00)x^1y^0  + (2.00)x^1y^1  + (1.00)x^2y^0

, таким образом, это обнаружило, что многочлен является x 2 глоток> +2xy+y 2 глоток> +0.01. [Последний срок иногда-0.01 и иногда 0, который должен ожидаться из-за случайных помех, которые мы добавили.]

Альтернативы Python+Numpy/Scipy R и Компьютерные Системы Алгебры: Sage, Mathematica, Matlab, Клен. Даже Excel мог бы быть в состоянии сделать это. Числовые Рецепты обсуждает методы для реализации его самостоятельно (в C, Фортране).

Проблемы

  • Это сильно под влиянием [1 153], как точки выбраны . Когда я имел x=y=range(20) вместо случайных точек, это всегда производило 1.33x 2 глоток> +1.33xy+1.33y 2 глоток>, который был озадачивающим..., пока я не понял, что, потому что я всегда имел x[i]=y[i], многочлены были тем же: x 2 глоток> +2xy+y 2 глоток> = 4x 2 глоток> = (4/3) (x 2 глоток> +xy+y 2 глоток>). Таким образом, мораль - то, что важно выбрать точки тщательно для получения "правильного" многочлена. (Если Вы можете, выбрал, необходимо выбрать Chebyshev узлы для полиномиальной интерполяции; не уверенный, если то же верно для наименьших квадратов также.)
  • Сверхустановка : многочлены более высокого градуса могут всегда соответствовать данным лучше. Если Вы изменяетесь degree на 3 или 4 или 5, это все еще главным образом распознает тот же квадратичный многочлен (коэффициенты 0 для условий более высокого градуса), но для больших градусов, это запускает подходящие многочлены более высокого градуса. Но даже с градусом 6, беря больший n (больше точек данных вместо 20, говорят 200), все еще соответствует квадратичному многочлену. Таким образом, мораль должна постараться не сверхсоответствовать, для которого она могла бы помочь взять как можно больше точек данных.
  • могли бы быть проблемы [1 124] числовая устойчивость , я не полностью понимаю.
  • , Если Вам не нужен многочлен, можно получить лучшие соответствия с другими видами функций, например, шлицы (кусочные полиномы).

17
задан scunliffe 27 September 2009 в 21:01
поделиться

6 ответов

Когда вы читаете

List<String> list = new ArrayList<String>();

, вы понимаете, что все, что вас волнует, это List , и вы уделяете меньше внимания фактической реализации. Кроме того, вы ограничиваете себя членами, объявленными List , а не конкретной реализацией. Вам все равно, хранятся ли ваши данные в линейном массиве или в какой-то причудливой структуре данных, пока они выглядят как List .

С другой стороны, чтение второй строки дает вам представление о том, что код заботится о переменной, являющейся ArrayList . Написав это, вы неявно говорите (будущим читателям), что вам не следует:

21
ответ дан 30 November 2019 в 12:36
поделиться

Использование интерфейса позволяет быстро изменить базовую реализацию List / Map / Set / и т. Д.

Речь идет не о сохранении нажатий клавиш, а о быстром изменении реализации. В идеале вы не должны раскрывать конкретные методы реализации, а просто использовать требуемый интерфейс.

7
ответ дан 30 November 2019 в 12:36
поделиться

Я бы посоветовал подумать об этом с другой стороны. Обычно вам нужен список, набор или любой другой тип коллекции - и вам действительно все равно в вашем коде, как именно это реализовано. Следовательно, ваш код просто работает со списком и делает все, что ему нужно (также это формулируется как «всегда кодировать интерфейс»).

Когда вы создаете список, вам нужно решить, какую реальную реализацию вы хочу. Для большинства целей ArrayList «достаточно хорош», но вашему коду все равно. Придерживаясь интерфейса, вы передадите это будущему читателю.

Например, у меня есть привычка иметь отладочный код в моем основном методе, который выгружает системные свойства в System.out - обычно намного лучше, если они отсортированы. Самый простой способ - просто разрешить «Map map = new TreeMap (properties);» и ЗАТЕМ перебирать их, поскольку TreeMap возвращает отсортированные ключи.

Когда вы узнаете больше о Java, вы также увидите, что интерфейсы очень полезны при тестировании и имитации, поскольку вы можете создавать объекты с поведением, указанным во время выполнения, в соответствии с данный интерфейс. Продвинутый (но простой) пример можно увидеть на http://www.exampledepot.com/egs/java.lang.reflect/ProxyClass.html

2
ответ дан 30 November 2019 в 12:36
поделиться

, если позже вы захотите изменить реализацию списка и использовать, например, LinkedList (возможно, для повышения производительности), вам не нужно менять весь код (и API, если его библиотека). если порядок не имеет значения, вы должны вернуть коллекцию, чтобы позже вы могли легко изменить его на «Установить», если вам нужно будет отсортировать элементы.

1
ответ дан 30 November 2019 в 12:36
поделиться

Лучшее объяснение, которое я могу придумать (потому что я не программирую на Java так часто, как на других языках), заключается в том, что это упрощает изменение типа списка "back-end" при сохранении того же кода / интерфейса все остальное полагается. Если вы сначала объявите его как более конкретный тип, а потом решите, что вам нужен другой тип ... если что-то случится с использованием метода, специфичного для ArrayList, это дополнительная работа.

Конечно, если вам действительно нужно Поведение, зависящее от ArrayList, вместо этого следует использовать конкретный тип переменной.

1
ответ дан 30 November 2019 в 12:36
поделиться

В основном это исходит от людей, которым приходится запускать большие проекты, возможно, по другим причинам - вы слышите это постоянно. Почему, вообще-то не знаю. Если вам нужен список массивов, или хэш-карта, или хеш-набор, или что-то еще, я не вижу смысла в устранении методов путем преобразования в интерфейс.

Скажем, например, недавно я научился использовать и реализовал HashSet в качестве основной структуры данных. Предположим, по какой-то причине я пошел работать в команду. Разве этому человеку не нужно знать, что данные были привязаны к хеш-методам, а не упорядочены по какой-либо основе? Бэкэнд-подход, отмеченный Twisol, работает на C / C ++, где вы можете выставлять заголовки и продавать библиотеку таким образом, Если кто-то знает, как это сделать на Java, я бы предположил, что они будут использовать JNI - в этот момент мне кажется проще использовать C / C ++, где вы можете открывать заголовки и создавать библиотеки с использованием установленных инструментов для этой цели.

К тому времени, когда вы найдете кого-нибудь, кто сможет установить jar-файл в каталог расширений, мне может показаться, что этот объект может быть в нескольких шагах от него - я сбросил несколько крипто-библиотек в каталог расширений, это было удобно, но я очень хотелось бы видеть ясную, лаконичную проясненную основу. Я полагаю, что они делают это все время.

На данный момент это звучит для меня как классическая обфускация, но будьте осторожны: вам нужно кое-что написать, прежде чем проблема станет серьезной.

К тому времени, когда вы найдете кого-нибудь, кто сможет установить jar-файл в каталог расширений, мне может показаться, что этот объект может быть в нескольких шагах от него - я сбросил несколько крипто-библиотек в каталог расширений, это было удобно, но я очень хотелось бы видеть ясную, лаконичную проясненную основу. Я полагаю, что они делают это все время.

На данный момент это звучит для меня как классическая обфускация, но будьте осторожны: вам нужно кое-что написать, прежде чем проблема станет серьезной.

К тому времени, когда вы найдете кого-нибудь, кто сможет установить jar-файл в каталог расширений, мне может показаться, что этот объект может быть в нескольких шагах от него - я сбросил несколько крипто-библиотек в каталог расширений, это было удобно, но я очень хотелось бы видеть ясную, лаконичную проясненную основу. Я полагаю, что они делают это все время.

На данный момент это звучит для меня как классическая обфускация, но будьте осторожны: вам нужно кое-что написать, прежде чем проблема станет серьезной.

-2
ответ дан 30 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: