Лампочка на деревянной основе, освещающая темное помещение. Винтажный стиль, теплое свечение.

Линейная регрессия на самом деле является задачей прогнозирования (Часть 2: От прогнозов к предсказаниям)

Векторный вид метода наименьших квадратов.

Делиться

3eb4c5159b6fef637ceb15a19618534a
Фотография Бурака The Weekender: https://www.pexels.com/photo/light-bulb-on-white-desk-turned-on-1252807/

Мы считаем, что линейная регрессия — это построение прямой линии по данным.

Но с математической точки зрения это не так.

Речь идёт о поиске максимально близкого к цели вектора в пределах заданной области.
Пространство, образованное различными элементами.

Чтобы это понять, нам нужно изменить свой подход к анализу данных.

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

Теперь применим эти концепции для решения задачи линейной регрессии.

У нас есть эти данные.

66c237252bb3278e9493a02c49e86ef4
Изображение предоставлено автором.

Обычный способ: Пространство функций

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

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

Для математического решения этой задачи мы записываем уравнение целевой функции и применяем дифференцирование, чтобы найти точные формулы для наклона и точки пересечения с осью Y.

Как мы уже обсуждали в моем предыдущем блоге о множественной линейной регрессии (MLR), это стандартный способ понимания проблемы.

Это то, что мы называем пространством для демонстрации особенностей.

8747605f2c7643fe56814b8f222ec2e8
Изображение предоставлено автором.

После выполнения всех этих действий мы получаем значение наклона и точки пересечения с осью Y. Здесь нам нужно обратить внимание на одну вещь.

Допустим, ŷᵢ — это прогнозируемое значение в определенной точке. У нас есть значение наклона и значение пересечения с осью Y, и теперь, исходя из наших данных, нам нужно спрогнозировать цену.

Если ŷᵢ — прогнозируемая цена дома № 1, мы рассчитываем её, используя формулу:

[
beta_0 + beta_1 cdot text{size}
[

Что мы здесь сделали? У нас есть значение размера, и мы масштабируем его с помощью определенного числа, которое мы называем наклоном (β₁), чтобы получить значение, максимально приближенное к исходному.

Мы также добавляем свободный член (β₀) в качестве базового значения.

Давайте запомним этот момент и перейдем к следующей точке зрения.

Смена перспективы

Давайте посмотрим на наши данные.

Теперь, вместо того чтобы рассматривать цену и размер как оси, давайте будем рассматривать каждый дом как ось.

У нас три дома, а это значит, что дом А можно рассматривать как ось X, дом B как ось Y, а дом C как ось Z.

Затем мы просто наносим наши точки на карту.

a51b39a1f2f43b9706e833529f49d235
Изображение предоставлено автором.

Если рассматривать столбцы «Размер» и «Цена» как оси, то получим три точки, каждая из которых представляет размер и цену отдельного дома.

Однако, если рассматривать каждый дом как ось, мы получим две точки в трехмерном пространстве.

Одна точка обозначает размеры всех трех домов, а другая — цены на все три дома.

Это то, что мы называем столбцовым пространством, и именно здесь происходит линейная регрессия.

От точек к направлениям

Теперь соединим эти две точки с началом координат и назовем их векторами.

0fb14535bd25a2fd440167dc3fa3c2bd
Изображение предоставлено автором.

Хорошо, давайте замедлимся и посмотрим, что мы сделали и почему мы это сделали.

Вместо обычной диаграммы рассеяния, где размер и цена являются осями (пространство признаков), мы рассматривали каждый дом как ось и строили график по точкам (пространство столбцов).

Теперь мы утверждаем, что линейная регрессия происходит в этом столбцовом пространстве.

Возможно, вы подумаете: «Подождите, мы же изучаем и понимаем линейную регрессию, используя традиционный диаграмму рассеяния, где мы минимизируем остатки, чтобы найти линию наилучшего соответствия».

Да, это верно! Но в пространстве признаков линейная регрессия решается с помощью дифференциального исчисления. Формулы для наклона и точки пересечения с осью Y получаются с помощью частного дифференцирования.

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

Вы можете увидеть, насколько сложным было вычисление этих формул с помощью математического анализа. А теперь представьте, что у вас 50 или 100 признаков; это становится еще сложнее.

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

Мы рассматриваем наши данные как векторы и используем концепцию проекций. Геометрия остается неизменной независимо от того, имеем ли мы 2 объекта или 2000 объектов.

Итак, если математический анализ настолько запутан, в чем же реальная польза этой неизменной геометрии? Давайте обсудим, что именно происходит в пространстве столбцов.

Почему эта точка зрения важна

Теперь, когда мы имеем представление о том, что такое пространство признаков и пространство столбцов, давайте сосредоточимся на сюжете.

У нас есть две точки, одна из которых представляет размеры, а другая — цены домов.

Почему мы соединили их с началом координат и сочли векторами?

Потому что, как мы уже обсуждали, в линейной регрессии мы находим число (которое мы называем наклоном или весом), чтобы масштабировать нашу независимую переменную.

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

Визуально масштабировать число с плавающей запятой невозможно; масштабировать объект можно только тогда, когда он имеет длину и направление.

Соединив точки с началом координат, мы получаем векторы. Теперь они обладают и величиной, и направлением, а мы уже знаем, что векторы можно масштабировать.

a697a99fcb1b5d3964800b20068615e3
Изображение предоставлено автором.

Итак, мы выяснили, что рассматриваем эти столбцы как векторы, поскольку их можно масштабировать, но здесь есть кое-что еще более важное, чему нужно научиться.

Рассмотрим два наших вектора: вектор размера и вектор цены.

Во-первых, если мы посмотрим на вектор размера (1, 2, 3), то увидим, что он указывает в очень конкретном направлении, исходя из закономерности его чисел.

Из этого вектора следует, что Дом 2 в два раза больше Дома 1, а Дом 3 в три раза больше.

Существует определённое соотношение 1:2:3, которое заставляет вектор размера указывать в одном точном направлении.

Теперь, если мы посмотрим на вектор «Цена», мы увидим, что он указывает в несколько ином направлении, чем вектор «Размер», исходя из своих собственных значений.

Направление стрелки просто показывает нам чистую, лежащую в основе закономерность расположения элемента во всех наших домах.

Если бы наши цены были точно (2, 4, 6), то наш вектор цен лежал бы точно в том же направлении, что и наш вектор размеров. Это означало бы, что размер является идеальным, прямым индикатором цены.

4bc90b6debf4ad623e8810ecccad8256
Изображение предоставлено автором.

Но в реальной жизни это редко возможно. Цена дома зависит не только от размера; на нее влияют и другие факторы, поэтому вектор цены немного отклоняется от него.

Угол между двумя векторами (1,2,3) и (4,8,9) представляет собой шум реального мира.

Геометрия, лежащая в основе регрессии

26d49aa74b5d5c2cc73957de6c81471a
Изображение предоставлено автором.

Теперь мы применим концепцию проекций, которую изучили в первой части.

Рассмотрим наш вектор Цены (4, 8, 9) как конечную цель. Однако у нас есть только одно направление движения — путь нашего вектора Размера (1, 2, 3).

Если мы будем двигаться в направлении вектора размера, мы не сможем точно достичь пункта назначения, потому что он указывает в другом направлении.

Но мы можем добраться до определенной точки на нашем пути, которая максимально приблизит нас к месту назначения.

Кратчайший путь от пункта назначения вниз до этой точки образует идеальный угол в 90 градусов.

В первой части мы обсудили эту концепцию, используя аналогию «шоссе и дом».

Здесь мы применяем ту же самую концепцию. Единственное отличие заключается в том, что в первой части мы находились в двумерном пространстве, а здесь — в трехмерном.

Я назвал этот объект «дорогой» или «шоссе», потому что у нас есть только одно направление движения.

Различие между «путью» и «направлением» станет гораздо яснее позже, когда мы добавим несколько направлений!

Простой способ это увидеть

Мы уже можем заметить, что это в точности та же концепция, что и векторные проекции.

В первой части мы вывели для этого формулу. Так зачем ждать?

Давайте просто применим формулу, верно?

Нет. Пока нет.

Для начала нам необходимо понять кое-что очень важное.

В первой части мы работали в двумерном пространстве, поэтому использовали аналогию с шоссе и домом. Но здесь мы находимся в трехмерном пространстве.

Чтобы лучше это понять, давайте воспользуемся новой аналогией.

Представьте это трехмерное пространство как физическую комнату. В комнате, в точке с координатами (4, 8, 9), парит лампочка.

Путь от начала координат до этой лампочки — это наш вектор цены, который мы называем целевым вектором.

Мы хотим добраться до этой луковицы, но наши возможности передвижения ограничены.

Мы можем двигаться только в направлении вектора размера (1, 2, 3), перемещаясь либо вперед, либо назад.

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

И вы будете правы. Это самое близкое расстояние, на которое мы можем приблизиться к лампочке в этом направлении.

Зачем нам нужна базовая величина?

Но прежде чем двигаться дальше, следует отметить еще одну вещь.

Мы уже обсуждали, что нам нужно найти одно число (наклон), чтобы масштабировать наш вектор размера и максимально приблизиться к вектору цены. Это можно понять с помощью простого уравнения:

Цена = β₁ × Размер

Но что, если размер равен нулю? Каким бы ни было значение β₁, мы получаем прогнозируемую цену, равную нулю.

Но правильно ли это? Мы утверждаем, что если площадь дома равна 0 квадратным футам, то и цена дома равна 0 долларам.

Это неверно, потому что для каждого дома должна быть базовая стоимость. Почему?

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

Мы называем это базовым значением β0. В традиционной алгебре мы уже знаем это как точку пересечения с осью Y, то есть член, который сдвигает прямую вверх и вниз.

Итак, как же добавить базовое значение в нашу 3D-комнату? Мы делаем это, добавляя базовый вектор.

Объединение направлений

a686c603b5af273d4ef9fd0c12a197ca
GIF от автора

Теперь мы добавили базовый вектор (1, 1, 1), но что именно делается с использованием этого базового вектора?

Из приведенного выше графика видно, что добавление базисного вектора дает нам еще одно направление для движения в этом пространстве.

Мы можем двигаться в обоих направлениях: по вектору размера и по базовому вектору.

Не стоит воспринимать их как «пути»; это направления, и все станет ясно, когда мы доберемся до точки, двигаясь по обоим направлениям.

Без базового вектора наше базовое значение было равно нулю. Мы начали с нулевого базового значения для каждого дома. Теперь, когда у нас есть базовый вектор, давайте сначала перейдем к его построению.

Например, давайте переместимся на 3 шага в направлении базового вектора. Таким образом, мы достигнем точки (3, 3, 3). В данный момент мы находимся в точке (3, 3, 3) и хотим приблизиться как можно ближе к нашему вектору цены.

Это означает, что базовая стоимость каждого дома составляет 3 доллара, а наша новая отправная точка — (3, 3, 3).

Далее, перейдем на 2 шага в направлении нашего вектора размеров (1, 2, 3). Это означает вычисление 2 * (1, 2, 3) = (2, 4, 6).

Следовательно, из (3, 3, 3) мы перемещаемся на 2 шага вдоль оси Дома А, на 4 единицы вдоль оси Дома В и на 6 шагов вдоль оси Дома С.

По сути, мы просто складываем векторы, и порядок не имеет значения.

Независимо от того, движемся ли мы сначала вдоль базового вектора или вдоль вектора размеров, мы приходим к одной и той же точке. Мы просто сначала двигались вдоль базового вектора, чтобы лучше понять идею!

deb98f0cea081dd75e0922e39667f931

Пространство всех возможных предсказаний

Таким образом, мы используем оба направления, чтобы максимально приблизиться к нашему вектору цены. В предыдущем примере мы масштабировали базовый вектор на 3, что означает здесь β0 = 3, и масштабировали вектор размера на 2, что означает β1 = 2.

Из этого следует, что нам нужна наилучшая комбинация β0 и β1, чтобы определить, сколько шагов мы пройдем вдоль базового вектора и сколько шагов мы пройдем вдоль вектора размера, чтобы достичь точки, наиболее близкой к нашему вектору цены.

Таким образом, если мы перепробуем все различные комбинации β0 и β₁, то получим бесконечное количество точек, и давайте посмотрим, как это будет выглядеть.

f4f46aabe60d04420b6e287fe15e06ab
GIF от автора

Мы видим, что все точки, образованные различными комбинациями β0 и β1 вдоль направлений базового вектора и вектора размера, образуют плоскую двумерную плоскость в нашем трехмерном пространстве.

Теперь нам нужно найти точку на этой плоскости, которая находится ближе всего к нашему вектору цены.

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

Теперь нам нужно найти точную точку на плоскости, которая находится ближе всего к вектору Прайса.

Мы уже обсуждали это в первой части, используя аналогию «дом и шоссе», где кратчайший путь от шоссе к дому образовывал угол в 90 градусов с шоссе.

Там мы двигались в одном измерении, а здесь — в двумерной плоскости. Однако правило остается тем же.

Кратчайшее расстояние между вершиной нашего ценового вектора и точкой на плоскости — это расстояние, при котором траектория между ними образует идеальный угол в 90 градусов с плоскостью.

fbd4b7253422c421a7d8f2e72eeabd9c
GIF от автора

От точки к вектору

Прежде чем углубиться в математику, давайте уточним, что именно происходит, чтобы было легче понять суть.

До сих пор мы говорили о поиске конкретной точки на нашей плоскости, которая находится ближе всего к вершине вектора целевой цены. Но что мы на самом деле подразумеваем под этим?

Чтобы добраться до этой точки, нам нужно пересечь нашу плоскость.

Мы делаем это, перемещаясь вдоль двух доступных нам направлений, которыми являются векторы основания и размера, и масштабируя их.

При масштабировании и сложении двух векторов результат всегда будет вектором!

Если провести прямую линию от центра в начале координат непосредственно до этой точки на плоскости, мы получим так называемый вектор прогнозирования .

Перемещение вдоль этого единственного вектора прогнозирования приводит нас к той же самой цели, что и масштабирование вдоль направлений основания и размера.

Вычитание векторов

Теперь у нас есть два вектора.

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

Когда мы вычитаем наше предсказание из нашего целевого значения, результатом является наш вектор остатков , также известный как вектор ошибок.

Вот почему эта пунктирная красная линия — это не просто измерение расстояния. Это сам по себе вектор!

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

Линейная регрессия — это проекция.

А теперь начнём вычисления.

[
Начнём с представления всего в матричной форме.
[

[
X =
begin{bmatrix}
1 и 1 \
1 и 2
1 и 3
end{bmatrix}
quad
y =
begin{bmatrix}
4 \
8 \
9
end{bmatrix}
quad
β =
begin{bmatrix}
b_0 \
б_1
end{bmatrix}
] [
Здесь столбцы матрицы X представляют собой направления основания и размера.
] [
И мы пытаемся объединить их, чтобы достичь } y.
] [
hat{y} = Xbeta
] [
= b_0
begin{bmatrix}
1 \
1 \
1
end{bmatrix}
+
б_1
begin{bmatrix}
1 \
2 \
3
end{bmatrix}
] [
Каждое предсказание — это всего лишь комбинация этих двух направлений.
] [
e = y – Xbeta
] [
Этот вектор ошибки представляет собой разрыв между тем местом, где мы хотим оказаться.
] [
И вот куда мы в итоге приходим.
] [
Чтобы этот промежуток был как можно короче,
] [
Оно должно быть идеально перпендикулярно плоскости.
] [
Эта плоскость образована столбцами } X.
] [
X^T e = 0
] [
Теперь подставим 'e' в это условие.
] [
X^T (y – Xbeta) = 0
] [
X^T y – X^TX beta = 0
] [
X^TX beta = X^T y
] [
Упростив уравнение, получаем следующее.
] [
β = (X^TX)^{-1} X^T y
] [
Теперь мы вычисляем каждую часть шаг за шагом.
] [
X^T =
begin{bmatrix}
1 & 1 & 1 \
1, 2 и 3
end{bmatrix}
] [
X^TX =
begin{bmatrix}
3 и 6
6 и 14
end{bmatrix}
] [
X^T y =
begin{bmatrix}
21 \
47
end{bmatrix}
] [
text{вычисление обратной величины } X^T X.
] [
(X^TX)^{-1}
=
frac{1}{(3 times 14 – 6 times 6)}
begin{bmatrix}
14 и -6 \
-6 и 3
end{bmatrix}
] [
=
frac{1}{42 – 36}
begin{bmatrix}
14 и -6 \
-6 и 3
end{bmatrix}
] [
=
frac{1}{6}
begin{bmatrix}
14 и -6 \
-6 и 3
end{bmatrix}
] [
Теперь умножьте это на } X^T y.
] [
β =
frac{1}{6}
begin{bmatrix}
14 и -6 \
-6 и 3
end{bmatrix}
begin{bmatrix}
21 \
47
end{bmatrix}
] [
=
frac{1}{6}
begin{bmatrix}
14 cdot 21 – 6 cdot 47 \
-6 · 21 + 3 · 47
end{bmatrix}
] [
=
frac{1}{6}
begin{bmatrix}
294 – 282 \
-126 + 141
end{bmatrix}
=
frac{1}{6}
begin{bmatrix}
12 \
15
end{bmatrix}
] [
=
begin{bmatrix}
2 \
2.5
end{bmatrix}
] [
Используя эти значения, мы наконец сможем вычислить точную точку на плоскости.
] [
hat{y} =
2
begin{bmatrix}
1 \
1 \
1
end{bmatrix}
+
2.5
begin{bmatrix}
1 \
2 \
3
end{bmatrix}
=
begin{bmatrix}
4.5 \
7.0 \
9.5
end{bmatrix}
] [
Эта точка является ближайшей возможной точкой на плоскости к нашей цели.
[

Мы получили точку (4,5, 7,0, 9,5). Это наш прогноз.

Эта точка находится ближе всего к вершине вектора цены, и чтобы достичь её, нам нужно пройти 2 шага вдоль базового вектора, который является нашей точкой пересечения с осью Y, и 2,5 шага вдоль вектора размера, который является нашим наклоном.

Изменилась лишь точка зрения.

Давайте вспомним, что мы уже сделали в этом блоге. Мы не использовали стандартный метод решения задачи линейной регрессии, который представляет собой метод математического анализа, где мы пытаемся продифференцировать уравнение функции потерь, чтобы получить уравнения для наклона и точки пересечения с осью Y.

Вместо этого мы выбрали другой метод решения задачи линейной регрессии — метод векторов и проекций.

Мы начали с вектора цен, и нам нужно было построить модель, которая предсказывает цену дома в зависимости от его размера.

С точки зрения векторов, это означало, что изначально у нас был только один путь для прогнозирования цены дома.

Затем мы добавили базовый вектор, поняв, что должно быть базовое начальное значение.

Теперь у нас было два направления, и вопрос заключался в том, насколько близко мы можем приблизиться к вершине вектора цены, двигаясь в этих двух направлениях?

Мы не просто прокладываем линию; мы работаем внутри пространства.

В пространстве признаков мы минимизируем ошибку.

В столбцовом пространстве: мы опускаем перпендикуляры.

Используя различные комбинации наклона и точки пересечения с осью Y, мы получили бесконечное количество точек, образующих плоскость.

Ближайшая точка, которую нам нужно было найти, находится где-то на этой плоскости, и мы нашли её, используя концепцию проекций и скалярного произведения.

С помощью этой геометрической модели мы нашли идеальную точку и вывели уравнение нормали!

Вы можете спросить: «Разве мы не получаем это нормальное уравнение, используя также дифференциальное и интегральное исчисление?» Вы совершенно правы! Это и есть подход дифференциального и интегрального исчисления, но здесь мы имеем дело с геометрическим и линейным алгебраическим подходом, чтобы по-настоящему понять геометрию, лежащую в основе математики.

Линейная регрессия — это не просто оптимизация.

Это проекция.

Надеюсь, вы узнали что-то новое из этого блога!

Если вы считаете, что чего-то не хватает или что можно улучшить, не стесняйтесь оставлять комментарии.

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

Спасибо за чтение!

Нихил Дасари Посмотреть все от Нихила Дасари

Источник: towardsdatascience.com

✅ Найденные теги: Задача, Линейная, Линейная Регрессия, новости, Предсказания, Прогнозирование

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

3D модель белка и РНК на темном фоне, взаимодействие молекул для анализа биологических структур.
Летающая тарелка над пустынными горами на закате с красными оттенками неба.
Промышленный завод, выбросы в атмосферу, сухая земля на переднем плане. Экологические проблемы.
Обломки разбитого самолета на пустынной местности, обугленные остатки и дым на горизонте.
Ракета на стартовой площадке космодрома под голубым небом перед запуском в космос.
Цифровое дерево и поток данных, символизирующие анализ больших данных и технологии.
Абстрактное изображение долларов в ярких цветах на синем фоне.
Абстрактные разноцветные банкноты на синем фоне с яркими красками и каплями.
5 полезных скриптов на Python для автоматизации рутинных задач в Excel
Image Not Found
Ракета на стартовой площадке космодрома под голубым небом перед запуском в космос.

«Прогресс МС-33» успешно стартовал к МКС

Ракета-носитель перед пуском © Артем Пылаев Сегодня в 15.01 по московскому времени с космодрома Байконур на орбиту искусственного спутника Земли ракетой-носителем «Союз-2.1а» успешно выведен транспортный космический корабль «Прогресс МС-33». Трансляция пуска велась на сайте и в телеграм-канале…

Апр 9, 2026
Цифровое дерево и поток данных, символизирующие анализ больших данных и технологии.

Прокси-указатель RAG: достижение безвекторной точности в масштабе и по стоимости векторного RAG

Новый способ построения векторного RAG — учитывающий структуру и способный к логическому осмыслению. Делиться Недавний запуск PageIndex является частью более широкого сдвига в архитектуре ИИ в сторону «Vectorless RAG» или «Reasoning-Based Retrieval» (поиска на основе логических рассуждений).…

Апр 9, 2026
Абстрактные разноцветные банкноты на синем фоне с яркими красками и каплями.

Компания Firmus, разработчик центров обработки данных на основе искусственного интеллекта под брендом Southgate, поддерживаемая Nvidia, достигла рыночной капитализации в 5,5 млрд долларов.

Вкратце Кредиты изображений: Ольга Арсентьева / Getty Images В понедельник азиатский поставщик услуг центров обработки данных для ИИ, компания Firmus, объявила о новом раунде привлечения инвестиций в размере 505 миллионов долларов, возглавляемом компанией Coatue, при оценке компании…

Апр 9, 2026
Абстрактное изображение долларов в ярких цветах на синем фоне.

Компания Firmus, разработчик центров обработки данных на основе искусственного интеллекта под брендом Southgate, поддерживаемая Nvidia, достигла рыночной капитализации в 5,5 млрд долларов.

Вкратце Кредиты изображений: Ольга Арсентьева / Getty Images В понедельник азиатский поставщик услуг центров обработки данных для ИИ, компания Firmus, объявила о новом раунде привлечения инвестиций в размере 505 миллионов долларов, возглавляемом компанией Coatue, при оценке компании…

Апр 9, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых