Меню

Реализуйте функцию mserror среднеквадратичную ошибку прогноза

# coding: utf-8 # # Линейная регрессия и стохастический градиентный спуск # Задание основано на материалах лекций по линейной регрессии и градиентному спуску. Вы будете прогнозировать выручку компании в зависимости от уровня ее инвестиций в рекламу по TV, в газетах и по радио. # ## Вы научитесь: # — решать задачу восстановления линейной регрессии # — реализовывать стохастический градиентный спуск для ее настройки # — решать задачу линейной регрессии аналитически # ## Введение # Линейная регрессия — один из наиболее хорошо изученных методов машинного обучения, позволяющий прогнозировать значения количественного признака в виде линейной комбинации прочих признаков с параметрами — весами модели. Оптимальные (в смысле минимальности некоторого функционала ошибки) параметры линейной регрессии можно найти аналитически с помощью нормального уравнения или численно с помощью методов оптимизации. # Линейная регрессия использует простой функционал качества — среднеквадратичную ошибку. Мы будем работать с выборкой, содержащей 3 признака. Для настройки параметров (весов) модели решается следующая задача: # $$frac{1}{ell}sum_{i=1}^ell{{(y_i — (w_0 + w_1x_{i1} + w_2x_{i2} + w_3x_{i3}))}^2} rightarrow min_{w_0, w_1, w_2, w_3},$$ # где $x_{i1}, x_{i2}, x_{i3}$ — значения признаков $i$-го объекта, $y_i$ — значение целевого признака $i$-го объекта, $ell$ — число объектов в обучающей выборке. # ## Градиентный спуск # Параметры $w_0, w_1, w_2, w_3$, по которым минимизируется среднеквадратичная ошибка, можно находить численно с помощью градиентного спуска. # Градиентный шаг для весов будет выглядеть следующим образом: # $$w_0 leftarrow w_0 + frac{2eta}{ell} sum_{i=1}^ell{{(y_i — (w_0 + w_1x_{i1} + w_2x_{i2} + w_3x_{i3}))}}$$ # $$w_j leftarrow w_j + frac{2eta}{ell} sum_{i=1}^ell{{x_{ij}(y_i — (w_0 + w_1x_{i1} + w_2x_{i2} + w_3x_{i3}))}}, j in {1,2,3}$$ # Здесь $eta$ — параметр, шаг градиентного спуска. # ## Стохастический градиентный спуск # У градиентного спуска, описанного выше, есть один недостаток. На больших выборках вычисление градиента по всем имеющимся данным на каждом шаге может быть вычислительно сложно. # В стохастическом варианте градиентного спуска поправки для весов вычисляются только с учетом одного случайно взятого объекта обучающей выборки: # $$w_0 leftarrow w_0 + frac{2eta}{ell} {(y_k — (w_0 + w_1x_{k1} + w_2x_{k2} + w_3x_{k3}))}$$ # $$w_j leftarrow w_j + frac{2eta}{ell} {x_{kj}(y_k — (w_0 + w_1x_{k1} + w_2x_{k2} + w_3x_{k3}))}, j in {1,2,3},$$ # где $k$ — случайный индекс, $k in {1, ldots, ell}$. # ## Нормальное уравнение # Нахождение вектора оптимальных весов $w$ может быть сделано и аналитически. # Мы хотим найти такой вектор весов $w$, чтобы вектор $y$, соответствующий целевому признаку, получался умножением матрицы $X$ (состоящей из всех признаков объектов обучающей выборки, кроме целевого) на вектор весов $w$. То есть, чтобы выполнялось матричное уравнение: # $$y = Xw$$ # Домножением слева на $X^T$ получаем: # $$X^Ty = X^TXw$$ # Это хорошо, поскольку теперь матрица $X^TX$ — квадратная, и можно найти решение (вектор $w$) в виде: # $$w = {(X^TX)}^{-1}X^Ty$$ # Матрица ${(X^TX)}^{-1}X^T$ — [*псевдообратная*](https://ru.wikipedia.org/wiki/Псевдообратная_матрица) для матрицы $X$. В NumPy такую матрицу можно вычислить с помощью функции [numpy.linalg.pinv](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.pinv.html). # # Однако, нахождение псевдообратной матрицы — операция вычислительно сложная и нестабильная в случае малого определителя матрицы $X$ (проблема мультиколлинеарности). # На практике лучше находить вектор весов $w$ решением матричного уравнения # $$X^TXw = X^Ty$$Это может быть сделано с помощью функции [numpy.linalg.solve](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linalg.solve.html). # # Но все же на практике для больших матриц $X$ быстрее работает градиентный спуск, особенно его стохастическая версия. # ## Инструкции по выполнению # В начале напишем простую функцию для записи ответов в текстовый файл. Ответами будут числа, полученные в ходе решения этого задания, округленные до 3 знаков после запятой. Полученные файлы после выполнения задания надо отправить в форму на странице задания на Coursera.org. # In[1]: def write_answer_to_file(answer, filename): with open(filename, ‘w’) as f_out: f_out.write(str(round(answer, 3))) # **1. Загрузите данные из файла *advertising.csv* в объект pandas DataFrame. [Источник данных](http://www-bcf.usc.edu/~gareth/ISL/data.html).** # In[2]: import pandas as pd adver_data = pd.read_csv(‘advertising.csv’) # **Посмотрите на первые 5 записей и на статистику признаков в этом наборе данных.** # In[3]: adver_data.head(n=5) # In[4]: adver_data.describe() # **Создайте массивы NumPy *X* из столбцов TV, Radio и Newspaper и *y* — из столбца Sales. Используйте атрибут *values* объекта pandas DataFrame.** # In[5]: X = adver_data[[«TV»,«Radio», «Newspaper»]].values Y = adver_data[[«Sales»]].values # **Отмасштабируйте столбцы матрицы *X*, вычтя из каждого значения среднее по соответствующему столбцу и поделив результат на стандартное отклонение.** # In[6]: import numpy as np means, stds = np.mean(X, axis=0), np.std(X, axis=0) # In[7]: X = (X means)/stds # **Добавьте к матрице *X* столбец из единиц, используя методы *hstack*, *ones* и *reshape* библиотеки NumPy. Вектор из единиц нужен для того, чтобы не обрабатывать отдельно коэффициент $w_0$ линейной регрессии.** # In[8]: import numpy as np X = np.hstack([X, np.ones((X.shape[0],1))]) # **2. Реализуйте функцию *mserror* — среднеквадратичную ошибку прогноза. Она принимает два аргумента — объекты Series *y* (значения целевого признака) и *y_pred* (предсказанные значения).** # In[9]: def mserror(y, y_pred): return round((sum((y y_pred)**2)[0])/float(y.shape[0]), 3) # **Какова среднеквадратичная ошибка прогноза значений Sales, если всегда предсказывать медианное значение Sales по исходной выборке? Запишите ответ в файл ‘1.txt’.** # In[10]: eye = np.array([np.median(Y)]*Y.shape[0]).reshape((Y.shape[0], 1)) answer1 = mserror(Y, eye) print(answer1) write_answer_to_file(answer1, ‘1.txt’) # **3. Реализуйте функцию *normal_equation*, которая по заданным матрицам (массивам NumPy) *X* и *y* вычисляет вектор весов $w$ согласно нормальному уравнению линейной регрессии.** # In[11]: def normal_equation(X, y): return np.dot(np.dot(np.linalg.pinv(np.dot(X.T, X)), X.T), y) # In[12]: norm_eq_weights = normal_equation(X, Y) print(norm_eq_weights) # **Какие продажи предсказываются линейной моделью с весами, найденными с помощью нормального уравнения, в случае средних инвестиций в рекламу по ТВ, радио и в газетах? (то есть при нулевых значениях масштабированных признаков TV, Radio и Newspaper). Запишите ответ в файл ‘2.txt’.** # In[13]: answer2 = np.dot(np.mean(X, axis=0), norm_eq_weights)[0] print(answer2) write_answer_to_file(answer2, ‘2.txt’) # **4. Напишите функцию *linear_prediction*, которая принимает на вход матрицу *X* и вектор весов линейной модели *w*, а возвращает вектор прогнозов в виде линейной комбинации столбцов матрицы *X* с весами *w*.** # In[14]: def linear_prediction(X, w): return np.dot(X, w) # **Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью нормального уравнения? Запишите ответ в файл ‘3.txt’.** # In[15]: answer3 = mserror(Y, linear_prediction(X, norm_eq_weights)) print(answer3) write_answer_to_file(answer3, ‘3.txt’) # **5. Напишите функцию *stochastic_gradient_step*, реализующую шаг стохастического градиентного спуска для линейной регрессии. Функция должна принимать матрицу *X*, вектора *y* и *w*, число *train_ind* — индекс объекта обучающей выборки (строки матрицы *X*), по которому считается изменение весов, а также число *$eta$* (eta) — шаг градиентного спуска (по умолчанию *eta*=0.01). Результатом будет вектор обновленных весов.** # In[16]: def stochastic_gradient_step(X, y, w, train_ind, eta=0.01): x_k = X[train_ind, :] y_k = y[train_ind] y_pred = np.dot(x_k, w) l = X.shape[0] return w + (2*eta/l)*(y_k y_pred)*x_k # **6. Напишите функцию *stochastic_gradient_descent*, реализующую стохастический градиентный спуск для линейной регрессии. Функция принимает на вход следующие аргументы:** # — X — матрица, соответствующая обучающей выборке # — y — вектор значений целевого признака # — w_init — вектор начальных весов модели # — eta — шаг градиентного спуска (по умолчанию 0.01) # — max_iter — максимальное число итераций градиентного спуска (по умолчанию 10000) # — max_weight_dist — минимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска, # при котором алгоритм прекращает работу (по умолчанию 1e-8) # — seed — число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42) # — verbose — флаг печати информации (например, для отладки, по умолчанию False) # # **На каждой итерации в вектор (список) должно записываться текущее значение среднеквадратичной ошибки. Функция должна возвращать вектор весов $w$, а также вектор (список) ошибок.** # In[40]: def stochastic_gradient_descent(X, y, w_init, eta=1e-2, max_iter=1e4, min_weight_dist=1e-8, seed=42, verbose=False): # Инициализируем расстояние между векторами весов на соседних # итерациях большим числом. weight_dist = np.inf # Инициализируем вектор весов w = w_init # Сюда будем записывать ошибки на каждой итерации errors = [] # Счетчик итераций iter_num = 0 # Будем порождать псевдослучайные числа # (номер объекта, который будет менять веса), а для воспроизводимости # этой последовательности псевдослучайных чисел используем seed. np.random.seed(seed) # Основной цикл while weight_dist > min_weight_dist and iter_num < max_iter: # порождаем псевдослучайный # индекс объекта обучающей выборки random_ind = np.random.randint(X.shape[0]) # Ваш код здесь old_w = w w = stochastic_gradient_step(X, y, w, random_ind, eta=eta) weight_dist = np.linalg.norm(w old_w) errors.append(mserror(y, np.dot(X, w))) iter_num += 1 if iter_num % 10000 == 0 and verbose: print «Iteration: «, iter_num return w, errors # **Запустите $10^5$ итераций стохастического градиентного спуска. Укажите вектор начальных весов *w_init*, состоящий из нулей. Оставьте параметры *eta* и *seed* равными их значениям по умолчанию (*eta*=0.01, *seed*=42 — это важно для проверки ответов).** # In[41]: get_ipython().run_cell_magic(u’time’, , u’stoch_grad_desc_weights, stoch_errors_by_iter = stochastic_gradient_descent(X, Y, np.ones((X.shape[1])), eta=1e-2, max_iter=10**5, verbose = True)’) # In[42]: get_ipython().magic(u’pylab inline’) plot(range(len(stoch_errors_by_iter)), stoch_errors_by_iter) xlabel(‘Iteration number’) ylabel(‘MSE’) # **Посмотрим на вектор весов, к которому сошелся метод.** # In[43]: stoch_grad_desc_weights # **Посмотрим на среднеквадратичную ошибку на последней итерации.** # In[44]: stoch_errors_by_iter[1] # **Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью градиентного спуска? Запишите ответ в файл ‘4.txt’.** # In[61]: print sum((Y np.dot(X, stoch_grad_desc_weights).reshape((Y.shape[0], 1)))**2)/float(Y.shape[0]) answer4 = round(np.mean((Y np.dot(X, stoch_grad_desc_weights).reshape((Y.shape[0], 1)))**2), 3) print(answer4) write_answer_to_file(answer4, ‘4.txt’) # **Ответами к заданию будут текстовые файлы, полученные в ходе этого решения. Обратите внимание, что отправленные файлы не должны содержать пустую строку в конце. Данный нюанс является ограничением платформы Coursera. Мы работаем над исправлением этого ограничения.**

4 / 3 / 2

Регистрация: 19.07.2015

Сообщений: 120

1

26.01.2018, 11:39. Показов 10415. Ответов 6


Всем привет!
Прохожу на Курсере *Обучение на размеченных данных*. Сейчас начинаю уже последнюю 5ю неделю, почти всё понятно, всё решаю.
Кроме 1й недели! Она так и осталась несданной, а сроки поджимают.
Там в первом и втором задании ошибиться невозможно, кода на 3 строчки. Но мой ответ почти в 20 раз больше требуемого!!!

Вот первое задание:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# импорт модулей
import pandas as pd
import numpy as np
 
# Взяли данные
adver_data = pd.read_csv('advertising.csv')  
 
# Разбили на 2 выборки
X = adver_data[['TV', 'Radio', 'Newspaper']].values 
y = adver_data[['Sales']].values 
 
# Отмасштабируйте столбцы матрицы X, вычтя из каждого значения среднее по соответствующему столбцу
#  и поделив результат на стандартное отклонение. 
means, stds = np.mean(X, axis=0), np.std(X, axis=0) 
X = (X - means)/stds
 
# Добавьте к матрице X столбец из единиц
X = np.hstack([X, np.ones((X.shape[0], 1))]) 
 
#  -----Задание-----
# 2. Реализуйте функцию mserror - среднеквадратичную ошибку прогноза.
#  Она принимает два аргумента - объекты Series y (значения целевого признака) и y_pred (предсказанные значения). 
# Не используйте в этой функции циклы - тогда она будет вычислительно неэффективной.
def mserr(y, y_pred):
return np.mean((y - y_pred) ** 2)  
answer1 = np.mean((y - np.median(y))**2)

Ответ будет 495.0152, хотя должен быть 28.ххххх — РАСХОЖДЕНИЕ АДОВО!
Пробовал использовать ‘родную’ функцию sklearn.metrics.mean_squared_error — результат ровно такой же 495.0152, т.е. неверный.
Похожая картина во втором задании — вроде бы всё несложно, но ответ совершенно другой!
Все остальные задания в этой неделе основаны на пунктах 1и 2.

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

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



  1. # coding: utf-8

  2. # # Линейная регрессия и стохастический градиентный спуск

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

  4. # ## Вы научитесь:

  5. # — решать задачу восстановления линейной регрессии

  6. # — реализовывать стохастический градиентный спуск для ее настройки

  7. # — решать задачу линейной регрессии аналитически

  8. # ## Введение

  9. # Линейная регрессия — один из наиболее хорошо изученных методов машинного обучения, позволяющий прогнозировать значения количественного признака в виде линейной комбинации прочих признаков с параметрами — весами модели. Оптимальные (в смысле минимальности некоторого функционала ошибки) параметры линейной регрессии можно найти аналитически с помощью нормального уравнения или численно с помощью методов оптимизации.  

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

  11. # $$frac{1}{ell}sum_{i=1}^ell{{(y_i — (w_0 + w_1x_{i1} + w_2x_{i2} +  w_3x_{i3}))}^2} rightarrow min_{w_0, w_1, w_2, w_3},$$

  12. # где $x_{i1}, x_{i2}, x_{i3}$ — значения признаков $i$-го объекта, $y_i$ — значение целевого признака $i$-го объекта, $ell$ — число объектов в обучающей выборке.

  13. # ## Градиентный спуск

  14. # Параметры $w_0, w_1, w_2, w_3$, по которым минимизируется среднеквадратичная ошибка, можно находить численно с помощью градиентного спуска.

  15. # Градиентный шаг для весов будет выглядеть следующим образом:

  16. # $$w_0 leftarrow w_0 + frac{2eta}{ell} sum_{i=1}^ell{{(y_i — (w_0 + w_1x_{i1} + w_2x_{i2} +  w_3x_{i3}))}}$$

  17. # $$w_j leftarrow w_j + frac{2eta}{ell} sum_{i=1}^ell{{x_{ij}(y_i — (w_0 + w_1x_{i1} + w_2x_{i2} +  w_3x_{i3}))}}, j in {1,2,3}$$

  18. # Здесь $eta$ — параметр, шаг градиентного спуска.

  19. # ## Стохастический градиентный спуск

  20. # У градиентного спуска, описанного выше, есть один недостаток. На больших выборках вычисление градиента по всем имеющимся данным на каждом шаге может быть вычислительно сложно.

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

  22. # $$w_0 leftarrow w_0 + frac{2eta}{ell} {(y_k — (w_0 + w_1x_{k1} + w_2x_{k2} +  w_3x_{k3}))}$$

  23. # $$w_j leftarrow w_j + frac{2eta}{ell} {x_{kj}(y_k — (w_0 + w_1x_{k1} + w_2x_{k2} +  w_3x_{k3}))}, j in {1,2,3},$$

  24. # где $k$ — случайный индекс, $k in {1, ldots, ell}$.

  25. # ## Нормальное уравнение

  26. # Нахождение вектора оптимальных весов $w$ может быть сделано и аналитически.

  27. # Мы хотим найти такой вектор весов $w$, чтобы вектор $y$, соответствующий целевому признаку, получался умножением матрицы $X$ (состоящей из всех признаков объектов обучающей выборки, кроме целевого) на вектор весов $w$. То есть, чтобы выполнялось матричное уравнение:

  28. # $$y = Xw$$

  29. # Домножением слева на $X^T$ получаем:

  30. # $$X^Ty = X^TXw$$

  31. # Это хорошо, поскольку теперь матрица $X^TX$ — квадратная, и можно найти решение (вектор $w$) в виде:

  32. # $$w = {(X^TX)}^{-1}X^Ty$$

  33. # Матрица ${(X^TX)}^{-1}X^T$ — [*псевдообратная*](https://ru.wikipedia.org/wiki/Псевдообратная_матрица) для матрицы $X$. В NumPy такую матрицу можно вычислить с помощью функции [numpy.linalg.pinv](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.pinv.html).

  34. #

  35. # Однако, нахождение псевдообратной матрицы — операция вычислительно сложная и нестабильная в случае малого определителя матрицы $X$ (проблема мультиколлинеарности).

  36. # На практике лучше находить вектор весов $w$ решением матричного уравнения

  37. # $$X^TXw = X^Ty$$Это может быть сделано с помощью функции [numpy.linalg.solve](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linalg.solve.html).

  38. #

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

  40. # ## Инструкции по выполнению

  41. # В начале напишем простую функцию для записи ответов в текстовый файл. Ответами будут числа, полученные в ходе решения этого задания, округленные до 3 знаков после запятой. Полученные файлы после выполнения задания надо отправить в форму на странице задания на Coursera.org.

  42. # In[1]:

  43. def write_answer_to_file(answer, filename):

  44. with open(filename, ‘w’) as f_out:

  45.         f_out.write(str(round(answer, 3)))

  46. # **1. Загрузите данные из файла *advertising.csv* в объект pandas DataFrame. [Источник данных](http://www-bcf.usc.edu/~gareth/ISL/data.html).**

  47. # In[2]:

  48. import pandas as pd

  49. adver_data = pd.read_csv(‘advertising.csv’)

  50. # **Посмотрите на первые 5 записей и на статистику признаков в этом наборе данных.**

  51. # In[3]:

  52. adver_data.head(n=5)

  53. # In[4]:

  54. adver_data.describe()

  55. # **Создайте массивы NumPy *X* из столбцов TV, Radio и Newspaper и *y* — из столбца Sales. Используйте атрибут *values* объекта pandas DataFrame.**

  56. # In[5]:

  57. X = adver_data[[«TV»,«Radio», «Newspaper»]].values

  58. Y = adver_data[[«Sales»]].values

  59. # **Отмасштабируйте столбцы матрицы *X*, вычтя из каждого значения среднее по соответствующему столбцу и поделив результат на стандартное отклонение.**

  60. # In[7]:

  61. import numpy as np

  62. means, stds = np.mean(X, axis=0), np.std(X, axis=0)

  63. # In[8]:

  64. X = (X — means)/stds

  65. # **Добавьте к матрице *X* столбец из единиц, используя методы *hstack*, *ones* и *reshape* библиотеки NumPy. Вектор из единиц нужен для того, чтобы не обрабатывать отдельно коэффициент $w_0$ линейной регрессии.**

  66. # In[9]:

  67. import numpy as np

  68. X = np.hstack([X, np.ones((X.shape[0],1))])

  69. # **2. Реализуйте функцию *mserror* — среднеквадратичную ошибку прогноза. Она принимает два аргумента — объекты Series *y* (значения целевого признака) и *y_pred* (предсказанные значения).**

  70. # In[15]:

  71. def mserror(y, y_pred):

  72. return np.mean((y — y_pred)**2)

  73. # **Какова среднеквадратичная ошибка прогноза значений Sales, если всегда предсказывать медианное значение Sales по исходной выборке? Запишите ответ в файл ‘1.txt’.**

  74. # In[16]:

  75. eye = np.array([np.median(Y)]*Y.shape[0]).reshape((Y.shape[0], 1))

  76. answer1 = mserror(Y, eye)

  77. print(answer1)

  78. write_answer_to_file(answer1, ‘1.txt’)

  79. # **3. Реализуйте функцию *normal_equation*, которая по заданным матрицам (массивам NumPy) *X* и *y* вычисляет вектор весов $w$ согласно нормальному уравнению линейной регрессии.**

  80. # In[17]:

  81. def normal_equation(X, y):

  82. return np.dot(np.dot(np.linalg.pinv(np.dot(X.T, X)), X.T), y)

  83. # In[18]:

  84. norm_eq_weights = normal_equation(X, Y)

  85. print(norm_eq_weights)

  86. # **Какие продажи предсказываются линейной моделью с весами, найденными с помощью нормального уравнения, в случае средних инвестиций в рекламу по ТВ, радио и в газетах? (то есть при нулевых значениях масштабированных признаков TV, Radio и Newspaper). Запишите ответ в файл ‘2.txt’.**

  87. # In[19]:

  88. answer2 = np.dot(np.mean(X, axis=0), norm_eq_weights)[0]

  89. print(answer2)

  90. write_answer_to_file(answer2, ‘2.txt’)

  91. # **4. Напишите функцию *linear_prediction*, которая принимает на вход матрицу *X* и вектор весов линейной модели *w*, а возвращает вектор прогнозов в виде линейной комбинации столбцов матрицы *X* с весами *w*.**

  92. # In[20]:

  93. def linear_prediction(X, w):

  94. return np.dot(X, w)

  95. # **Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью нормального уравнения? Запишите ответ в файл ‘3.txt’.**

  96. # In[21]:

  97. answer3 = mserror(Y, linear_prediction(X, norm_eq_weights))

  98. print(answer3)

  99. write_answer_to_file(answer3, ‘3.txt’)

  100. # **5. Напишите функцию *stochastic_gradient_step*, реализующую шаг стохастического градиентного спуска для линейной регрессии. Функция должна принимать матрицу *X*, вектора *y* и *w*, число *train_ind* — индекс объекта обучающей выборки (строки матрицы *X*), по которому считается изменение весов, а также число *$eta$* (eta) — шаг градиентного спуска (по умолчанию *eta*=0.01). Результатом будет вектор обновленных весов.**

  101. # In[29]:

  102. def stochastic_gradient_step(X, y, w, train_ind, eta=0.01):

  103.     x_k = X[train_ind, :]

  104.     y_k = y[train_ind]

  105.     y_pred = np.dot(x_k, w)

  106.     l = X.shape[0]

  107. return w + (2*eta/l)*(y_k — y_pred)*x_k

  108. # **6. Напишите функцию *stochastic_gradient_descent*, реализующую стохастический градиентный спуск для линейной регрессии. Функция принимает на вход следующие аргументы:**

  109. # — X — матрица, соответствующая обучающей выборке

  110. # — y — вектор значений целевого признака

  111. # — w_init — вектор начальных весов модели

  112. # — eta — шаг градиентного спуска (по умолчанию 0.01)

  113. # — max_iter — максимальное число итераций градиентного спуска (по умолчанию 10000)

  114. # — max_weight_dist — минимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска,

  115. # при котором алгоритм прекращает работу (по умолчанию 1e-8)

  116. # — seed — число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42)

  117. # — verbose — флаг печати информации (например, для отладки, по умолчанию False)

  118. #

  119. # **На каждой итерации в вектор (список) должно записываться текущее значение среднеквадратичной ошибки. Функция должна возвращать вектор весов $w$, а также вектор (список) ошибок.**

  120. # In[30]:

  121. def stochastic_gradient_descent(X, y, w_init, eta=1e-2, max_iter=1e4,

  122.                                 min_weight_dist=1e-8, seed=42, verbose=False):

  123. # Инициализируем расстояние между векторами весов на соседних

  124. # итерациях большим числом.

  125.     weight_dist = np.inf

  126. # Инициализируем вектор весов

  127.     w = w_init

  128. # Сюда будем записывать ошибки на каждой итерации

  129.     errors = []

  130. # Счетчик итераций

  131.     iter_num = 0

  132. # Будем порождать псевдослучайные числа

  133. # (номер объекта, который будет менять веса), а для воспроизводимости

  134. # этой последовательности псевдослучайных чисел используем seed.

  135.     np.random.seed(seed)

  136. # Основной цикл

  137. while weight_dist > min_weight_dist and iter_num < max_iter:

  138. # порождаем псевдослучайный

  139. # индекс объекта обучающей выборки

  140.         random_ind = np.random.randint(X.shape[0])

  141. # Ваш код здесь

  142.         old_w = w

  143.         w = stochastic_gradient_step(X, y, w, random_ind, eta=eta)

  144.         weight_dist = np.linalg.norm(w — old_w)

  145.         errors.append(mserror(y, np.dot(X, w)))

  146.         iter_num += 1

  147. if iter_num % 10000 == 0 and verbose:

  148. print «Iteration: «, iter_num

  149. return w, errors

  150. #  **Запустите $10^5$ итераций стохастического градиентного спуска. Укажите вектор начальных весов *w_init*, состоящий из нулей. Оставьте параметры  *eta* и *seed* равными их значениям по умолчанию (*eta*=0.01, *seed*=42 — это важно для проверки ответов).**

  151. # In[31]:

  152. get_ipython().run_cell_magic(u‘time’, u», u‘stoch_grad_desc_weights, stoch_errors_by_iter = stochastic_gradient_descent(X, Y, np.ones((X.shape[1])), eta=1e-2, max_iter=10**5, verbose = True)’)

  153. # In[32]:

  154. get_ipython().magic(u‘pylab inline’)

  155. plot(range(len(stoch_errors_by_iter)), stoch_errors_by_iter)

  156. xlabel(‘Iteration number’)

  157. ylabel(‘MSE’)

  158. # **Посмотрим на вектор весов, к которому сошелся метод.**

  159. # In[33]:

  160. stoch_grad_desc_weights

  161. # **Посмотрим на среднеквадратичную ошибку на последней итерации.**

  162. # In[34]:

  163. stoch_errors_by_iter[1]

  164. # **Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью градиентного спуска? Запишите ответ в файл ‘4.txt’.**

  165. # In[38]:

  166. Y_pred = np.dot(X, stoch_grad_desc_weights).reshape((Y.shape[0], 1))

  167. answer4 = mserror(Y, Y_pred)

  168. print(answer4)

  169. write_answer_to_file(answer4, ‘4.txt’)

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


  Перевод


  Ссылка на автора

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

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

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

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

После завершения этого урока вы узнаете:

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

Давайте начнем.

Ошибка прогноза (или остаточная ошибка прогноза)

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

Это называется остаточной ошибкой прогноза.

forecast_error = expected_value - predicted_value

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

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

expected = [0.0, 0.5, 0.0, 0.5, 0.0]
predictions = [0.2, 0.4, 0.1, 0.6, 0.2]
forecast_errors = [expected[i]-predictions[i] for i in range(len(expected))]
print('Forecast Errors: %s' % forecast_errors)

При выполнении примера вычисляется ошибка прогноза для каждого из 5 прогнозов. Список ошибок прогноза затем печатается.

Forecast Errors: [-0.2, 0.09999999999999998, -0.1, -0.09999999999999998, -0.2]

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

Средняя ошибка прогноза (или ошибка прогноза)

Средняя ошибка прогноза рассчитывается как среднее значение ошибки прогноза.

mean_forecast_error = mean(forecast_error)

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

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

Ошибка прогноза может быть рассчитана непосредственно как среднее значение прогноза. В приведенном ниже примере показано, как среднее значение ошибок прогноза может быть рассчитано вручную.

expected = [0.0, 0.5, 0.0, 0.5, 0.0]
predictions = [0.2, 0.4, 0.1, 0.6, 0.2]
forecast_errors = [expected[i]-predictions[i] for i in range(len(expected))]
bias = sum(forecast_errors) * 1.0/len(expected)
print('Bias: %f' % bias)

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

Bias: -0.100000

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

Средняя абсолютная ошибка

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

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

mean_absolute_error = mean( abs(forecast_error) )

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

Мы можем использовать mean_absolute_error () функция из библиотеки scikit-learn для вычисления средней абсолютной ошибки для списка прогнозов. Пример ниже демонстрирует эту функцию.

from sklearn.metrics import mean_absolute_error
expected = [0.0, 0.5, 0.0, 0.5, 0.0]
predictions = [0.2, 0.4, 0.1, 0.6, 0.2]
mae = mean_absolute_error(expected, predictions)
print('MAE: %f' % mae)

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

MAE: 0.140000

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

Средняя квадратическая ошибка

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

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

mean_squared_error = mean(forecast_error^2)

Мы можем использовать mean_squared_error () функция из scikit-learn для вычисления среднеквадратичной ошибки для списка прогнозов. Пример ниже демонстрирует эту функцию.

from sklearn.metrics import mean_squared_error
expected = [0.0, 0.5, 0.0, 0.5, 0.0]
predictions = [0.2, 0.4, 0.1, 0.6, 0.2]
mse = mean_squared_error(expected, predictions)
print('MSE: %f' % mse)

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

MSE: 0.022000

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

Среднеквадратическая ошибка

Средняя квадратичная ошибка, описанная выше, выражается в квадратах единиц прогнозов.

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

rmse = sqrt(mean_squared_error)

Это можно рассчитать с помощьюSQRT ()математическая функция среднего квадрата ошибки, рассчитанная с использованиемmean_squared_error ()функция scikit-learn.

from sklearn.metrics import mean_squared_error
from math import sqrt
expected = [0.0, 0.5, 0.0, 0.5, 0.0]
predictions = [0.2, 0.4, 0.1, 0.6, 0.2]
mse = mean_squared_error(expected, predictions)
rmse = sqrt(mse)
print('RMSE: %f' % rmse)

При выполнении примера вычисляется среднеквадратичная ошибка.

RMSE: 0.148324

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

Дальнейшее чтение

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

  • Раздел 3.3 Измерение прогнозирующей точности, Практическое прогнозирование временных рядов с помощью R: практическое руководство,
  • Раздел 2.5 Оценка точности прогноза, Прогнозирование: принципы и практика
  • scikit-Learn Metrics API
  • Раздел 3.3.4. Метрики регрессии, scikit-learn API Guide

Резюме

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

В частности, вы узнали:

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

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

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In this article, we discussed the implementation of weighted mean square error using python.

    Mean squared error is a vital statistical concept, that is nowadays widely used in Machine learning and Deep learning algorithm. Mean squared error is basically a measure of the average squared difference between the estimated values and the actual value. It is also called a mean squared deviation and is most of the time used to calibrate the accuracy of the predicted output. In this article, let us discuss a variety of mean squared errors called weighted mean square errors. 

    Weighted mean square error enables to provide more importance or additional weightage for a particular set of points (points of interest) when compared to others. When handling imbalanced data, a weighted mean square error can be a vital performance metric. Python provides a wide variety of packages to implement mean squared and weighted mean square at one go, here we can make use of simple functions to implement weighted mean squared error.

    Formula to calculate the weighted mean square error:

    Implementation of Weighted Mean Square Error

    • For demonstration purposes let us create a sample data frame, with augmented actual and predicted values, as shown.
    • Calculate the squared difference between actual and predicted values.
    • Define the weights for each data point based on the importance
    • Now, use the weights  to calculate the weighted mean square error as shown

    Code Implementation:

    Python3

    import pandas as pd

    import numpy as np

    import random

    d = {'Actual': np.arange(0, 20, 2)*np.sin(2),

         'Predicted': np.arange(0, 20, 2)*np.cos(2)}

    data = pd.DataFrame(data=d)

    y_weights = np.arange(2, 4, 0.2)

    diff = (data['Actual']-data['Predicted'])**2

    weighted_mean_sq_error = np.sum(diff * y_weights) / np.sum(y_weights)

    Output:

    Weighted Mean Square Error

    Let us cross verify the result with the result of the scikit-learn package. to verify the correctness,

    Code:

    Python3

    weighted_mean_sq_error_sklearn = np.average(

        (data['Actual']-data['Predicted'])**2, axis=0, weights=y_weights)

    weighted_mean_sq_error_sklearn

    Output:

     verify the result 

    Improve Article

    Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In this article, we discussed the implementation of weighted mean square error using python.

    Mean squared error is a vital statistical concept, that is nowadays widely used in Machine learning and Deep learning algorithm. Mean squared error is basically a measure of the average squared difference between the estimated values and the actual value. It is also called a mean squared deviation and is most of the time used to calibrate the accuracy of the predicted output. In this article, let us discuss a variety of mean squared errors called weighted mean square errors. 

    Weighted mean square error enables to provide more importance or additional weightage for a particular set of points (points of interest) when compared to others. When handling imbalanced data, a weighted mean square error can be a vital performance metric. Python provides a wide variety of packages to implement mean squared and weighted mean square at one go, here we can make use of simple functions to implement weighted mean squared error.

    Formula to calculate the weighted mean square error:

    Implementation of Weighted Mean Square Error

    • For demonstration purposes let us create a sample data frame, with augmented actual and predicted values, as shown.
    • Calculate the squared difference between actual and predicted values.
    • Define the weights for each data point based on the importance
    • Now, use the weights  to calculate the weighted mean square error as shown

    Code Implementation:

    Python3

    import pandas as pd

    import numpy as np

    import random

    d = {'Actual': np.arange(0, 20, 2)*np.sin(2),

         'Predicted': np.arange(0, 20, 2)*np.cos(2)}

    data = pd.DataFrame(data=d)

    y_weights = np.arange(2, 4, 0.2)

    diff = (data['Actual']-data['Predicted'])**2

    weighted_mean_sq_error = np.sum(diff * y_weights) / np.sum(y_weights)

    Output:

    Weighted Mean Square Error

    Let us cross verify the result with the result of the scikit-learn package. to verify the correctness,

    Code:

    Python3

    weighted_mean_sq_error_sklearn = np.average(

        (data['Actual']-data['Predicted'])**2, axis=0, weights=y_weights)

    weighted_mean_sq_error_sklearn

    Output:

     verify the result 

    • Редакция Кодкампа

    17 авг. 2022 г.
    читать 1 мин


    Среднеквадратическая ошибка (MSE) — это распространенный способ измерения точности предсказания модели. Он рассчитывается как:

    MSE = (1/n) * Σ(фактическое – прогноз) 2

    куда:

    • Σ — причудливый символ, означающий «сумма».
    • n – размер выборки
    • фактический – фактическое значение данных
    • прогноз – прогнозируемое значение данных

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

    Как рассчитать MSE в Python

    Мы можем создать простую функцию для вычисления MSE в Python:

    import numpy as np
    
    def mse(actual, pred): 
     actual, pred = np.array(actual), np.array(pred)
     return np.square(np.subtract(actual,pred)).mean()
    

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

    actual = [12, 13, 14, 15, 15, 22, 27]
    pred = [11, 13, 14, 14, 15, 16, 18]
    
    mse(actual, pred)
    
    17.0
    

    Среднеквадратическая ошибка (MSE) для этой модели оказывается равной 17,0 .

    На практике среднеквадратическая ошибка (RMSE) чаще используется для оценки точности модели. Как следует из названия, это просто квадратный корень из среднеквадратичной ошибки.

    Мы можем определить аналогичную функцию для вычисления RMSE:

    import numpy as np
    
    def rmse(actual, pred): 
     actual, pred = np.array(actual), np.array(pred)
     return np.sqrt(np.square(np.subtract(actual,pred)).mean())
    

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

    actual = [12, 13, 14, 15, 15, 22, 27]
    pred = [11, 13, 14, 14, 15, 16, 18]
    
    rmse(actual, pred)
    
    4.1231
    

    Среднеквадратическая ошибка (RMSE) для этой модели оказывается равной 4,1231 .

    Дополнительные ресурсы

    Калькулятор среднеквадратичной ошибки (MSE)
    Как рассчитать среднеквадратичную ошибку (MSE) в Excel

    Я пытаюсь сделать функцию, которая будет вычислять среднеквадратичную ошибку от y (истинные значения) и y_pred (предсказанные), не используя sklearn или другие реализации.

    Я попробую следующее:

    def mserror(y, y_pred):
        i=0
        for i in range (len(y)):
            i+=1
            mse = ((y - y_pred) ** 2).mean(y)   
            return mse
    

    Можете ли вы, пожалуйста, исправить меня, что я делаю неправильно с расчетом, и кто это может быть исправлен?

    21 авг. 2016, в 16:06

    Поделиться

    Источник

    3 ответа

    Вы изменяете индекс без причины. Цикл for все равно увеличивает его. Кроме того, вы не используете индекс, например, вы не используете y[i] - y_pred[i], поэтому вам вообще не нужен цикл.

    Использовать массивы

    mse = np.mean((y - y_pred)**2)
    

    percusse
    21 авг. 2016, в 13:14

    Поделиться

    Я бы сказал:

    def get_mse(y, y_pred):
    d1 = y - y_pred
    mse = (1/N)*d1.dot(d1) # N is int(len(y))
    return mse
    

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

    Функция numpy dot() представляет собой произведение точек на 2 numpy массива (вы также можете написать np.dot(d1, d1))

    rotem
    01 май 2019, в 19:17

    Поделиться

    во-первых, вы многократно используете я и увеличиваете его, но в диапазоне он автоматически итеративен для следующего числа. Поэтому не используйте снова. Другое дело, что вы принимаете среднее значение y, но вместо того, чтобы принимать значение этого, возьмите среднее значение ((y — y_pred) ** 2). Надеюсь, вы поняли.

    Ramzan Shahid
    30 янв. 2018, в 09:27

    Поделиться

    Ещё вопросы

    • 0функция перегрузки, почему она всегда вызывает функцию с целочисленным вводом, когда происходит неправильный тип
    • 1Добавление пользовательского ImageView в основной макет
    • 1Android: как расшифровать зашифрованный файл openssl с помощью ключа RSA?
    • 0Как использовать аутентифицированные функции мыла в PHP, приведите любой рабочий пример.
    • 1Мне нужна ссылка, которая сначала сохраняет переменную в сессии, а затем открывает новую вкладку
    • 0Измените содержимое страницы в зависимости от того, какой URL используется для доступа к вашему домену.
    • 0OnsenUI: объединить панель вкладок, слайд-меню и диалоги
    • 0Spring 4 и Hibernate 4 Session error
    • 1Как создать класс Arraylist, который может хранить несколько объектов типа данных в Java
    • 1HttpRuntime.AppDomainAppPath в Azure
    • 0выполнение одного и того же кода на нескольких страницах с переменными сеанса
    • 1Найти место, где произошел сбой приложения
    • 1положение значков на рабочем столе
    • 1Изменение загруженных данных с помощью D3
    • 1Установите радиус границы влево / вправо для столбцов в Highcharts
    • 1Android: невозможно щелкнуть нижний TextView после перевода анимации в FrameLayout
    • 0Слушатель событий для CSS в директиве AngularJS не запускается и не перехватывается
    • 0Угловое отображение вложенного значения JSON
    • 0используя фокус на моем CSS, но некоторые теги не отображаются на Chrome
    • 0Как установить точку хоста для файла app.php в Symfony2
    • 1Жизненный цикл сервиса и лучший способ отменить регистрацию слушателей
    • 1Заменить регулярное выражение в JavaScript
    • 1Лучшая практика очистки ViewModelLocator
    • 0использование jQuery .each в переменной javascript перед добавлением на экран
    • 1Android WebView Перезагрузить при загрузке приложения
    • 0горизонтальное подменю css не работает
    • 0Как вставить данные в базу данных MySQL, используя laravel
    • 1как получить аргумент String внутри функции, возвращаемой как кортеж
    • 1Как определить ширину результата codePointAt?
    • 1Как изменить альфа шестнадцатеричного значения ARGB, используя целочисленные значения в Java
    • 1Как правильно заменить существующую JPanel в JFrame на другую?
    • 0_mysql_exceptions.ProgrammingError 1064, «У вас есть ошибка в синтаксисе SQL; проверьте
    • 0Javascript: Почему мой JavaScript не запускает обе анимации?
    • 0Почему эта * простая * KnockoutJS страница не работает?
    • 0Как Сортировать A -> Z при чтении / выборе имен файлов из папки
    • 0Импорт Geo Point (Lat, Lng) из MySQL в Elasticsearch
    • 1python matplotlib.patches: нарисуйте патч круга, но оставьте только часть круга
    • 1Список классов
    • 0нужно применить без переноса и отключить правый контроль карусели в Angularjs ui carousel
    • 1Ошибка восстановления с использованием кода C #
    • 0Добавить маску для ввода
    • 1Ошибка при получении данных счетчика из базы данных
    • 0Не могу найти строку char * в моем коде
    • 0Перезапись URL отключить открытие файлов
    • 0Отправить FlashMessenger
    • 1узел-мандрил, отправляющий почту через сервер
    • 1Возможно ли иметь десятичную ось X для линейного графика?
    • 0Получение Uncaught TypeError: Невозможно прочитать свойство ‘push’ из неопределенного
    • 1Проблема ответа с обратным вызовом

    Сообщество Overcoder

    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии

    А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Реализовать возможность лексическая ошибка
  • Расшифровка кодов ошибок ваз 2123 инжектор