#!/usr/bin/env python # coding: utf-8 # # Интеллектуальный анализ данных. Введение в анализ данных # # ## Семинар 3. Библиотека Numpy # # ### 0. Полезная информация # - [Страница курса на вики](http://wiki.cs.hse.ru/Майнор_Интеллектуальный_анализ_данных/Введение_в_анализ_данных) # - [Страница семинаров на вики](http://wiki.cs.hse.ru/Майнор_Интеллектуальный_анализ_данных/Введение_в_анализ_данных/ИАД-11,12) # - [Таблица с оценками](https://docs.google.com/spreadsheets/d/1jZL_-ELf0Ogj2XHa6VVbkg8vrInycv2-Z9UR5keLDfM/edit?usp=sharing) # - Почта курса *hse.minor.dm@gmail.com* (Формат темы: "[ИАД-NN] - Вопрос - Фамилия Имя Отчество") # - Виртуальная машина для майнора (подробности см. на странице семинара) # - **Подписаться на рассылку**: написать пустое письмо на hse-minor-datamining-2+subscribe@googlegroups.com # - Первое ДЗ! # ### 1. Что было в прошлый раз # # **Типы ответов** # - вещественные ответы (регрессия) # - конечное число ответов (классификация: бинарная/многоклассовая/пересекающиеся классы) # - временной ряд # - ранжирование # - отсутствие ответа (кластеризация) # # **Типы признаков** # - бинарный ({0, 1}) # - вещественный # - категориальный (неупорядоченное конечное множество) # - порядковый (упорядоченное конечное множество) # - множественные признаки # # **Обобщающая способность** # - недообучение # - переобучение # # **Задачи анализа данных** # - медицинская диагностика: объект — пациент, ответ — диагноз, классификация с пересекающимися классами; признаки: бинарные (пол), порядковые (тяжесть состояния), вещественные (вес) # - кредитный скоринг # - предсказание оттока клиентов # - стоимость недвижимости # - прогнозированние продаж (временные ряды) # - рекомендательные системы # ## 2. Numpy # ### Полезная информация # - [Все numpy функции](http://docs.scipy.org/doc/numpy-1.10.0/reference/) # - [100 заданий по Numpy](http://www.labri.fr/perso/nrougier/teaching/numpy.100/) # - Попробуйте в ipython notebook: # - **'np.ar' + [Tab]** (autocompletion) # - **'np.arange()' + [Shift+Tab]** (docstring) # - **?np.arange** (object description) # In[3]: import numpy as np # ### Создание веторов: # In[16]: X = np.array([1, 2, 3, 4]) print X.shape X = np.array([[1, 2, 3, 4]]) print X.shape X = np.array([ [[1, 2], [3, 4]], [[1, 2], [3, 4]], [[1, 2], [3, 4]] ]) print X.shape # In[5]: A = np.arange(15) A # In[22]: A = np.arange(15).reshape(3, 5) A # Пустой массив, массив без инициализации # In[26]: X = np.array([]) X.shape # In[27]: X = np.array([]).reshape(2, 2) # In[30]: X = np.empty((2, 2)) X # #### Что еще: # - *np.ndarray.dtype*, *np.astype()* [data type conversion] # - *np.asarray()*, *np.ndarray.tolist()* [object type conversion] # - **Syntax{np.arange()}**: *np.linspace()*, *np.logspace()*; **Syntax{np.empty()}**: *np.ones()*, *np.eye()*; *np.diag()* [creation] # - *np.empty_like()*, *np.zeros_like()*, *np.ones_like()*, ***np.copy()*** [create_like, **deep copy** *vs* **view**] # ### Изменение размерностей # In[5]: A.T # In[6]: B = np.arange(6).reshape(2, 3) B # Конкатенация: # In[8]: np.concatenate((A.T, B), axis=0) # In[10]: np.concatenate((A, B.T), axis=1) # В чем разница между *concatenate* и *vstack*/*hstack*? [Stackoverflow!](http://stackoverflow.com/questions/33356442/when-should-i-use-hstack-vstack-vs-append-vs-concatenate-vs-column-stack) # Изменение размера матрицы (количество элементов должно оставаться тем же) # In[13]: np.arange(6).reshape(2, 3) # Если задать один один из параметров равным -1, то он будет вычислен автоматически # In[14]: np.arange(6).reshape(2, -1) # Вытягивание в вектор # In[16]: np.ravel(A) # In[18]: np.ravel(A, order='F') # In[9]: get_ipython().run_line_magic('pinfo', 'np.ravel') # [flatten vs ravel](http://stackoverflow.com/questions/28930465/what-is-the-difference-between-flatten-and-ravel-functions-in-numpy) # #### Что еще: # - *np.swapaxes()*, *np.transpose()* [reshape] # - *np.newaxis* [broadcasting], *np.split()*, *np.tile()*, *np.repeat()* [broadcast] # - **Syntax{np.concatenate()}**: *np.vstack()*, *np.hstack()*; *np.append()* [concatenate] # - *np.insert()*, *np.delete()*, *np.resize()* # - *np.unique()* # ### Выборки элементов # In[138]: A = np.arange(10).reshape(2, 5) A # Применить одно условие достаточно просто # In[135]: A[A > 4] # Если нужно сделать несколько условий? # In[44]: A[A > 4 and A < 6] # In[45]: A[np.logical_and(A > 4, A < 8)] # Чтобы найти все ненулевые элементы матрицы: # In[136]: A.nonzero() # In[48]: A[A.nonzero()] # In[38]: A[A.nonzero()] = 10 A # In[45]: A = np.arange(10).reshape(2, 5) B = np.arange(9, -1, -1).reshape(2, 5) # на заметку slicing через аргументы: start = 9, stop=-1, step=-1 # In[46]: B # In[47]: np.where(A>B, A, B) # Использование для индексации # In[48]: ind = np.where(A>5) # In[49]: A[ind[0], ind[1]] # In[50]: A[ind[0], ind[1]] = -3 A # #### Что еще: # - **Syntax{np.logical_and()}**: *np.logical_and()*, *np.logical_not()* [&&, ||, ~] # - *np.all*, *np.any()* [bool array check] # - *np.isnan()*, *np.isinf()* [NaNs, Infs check] # - *np.allclose()*, *np.isclose()*, *np.equal()* **[float comparison]** # #### Matrix # Ещё один тип данных в NumPy — matrix. Является производным классом от ndarray, в связи с чем можно использовать все методы и функции, применимые к array. Однако: # - matrix — строго 2мерные; # - матричное умножение осуществляется через * (в отличие от dot для array) # In[29]: A = np.arange(0, 4).reshape(2, 2) B = np.arange(3, 7).reshape(2, 2) # In[30]: A * B # In[31]: a = np.matrix(A) b = np.matrix(B) # In[32]: a * b # ## 3. Цель # # **Зачем** нам нужен NumPy, если есть вложенные списки/кортежи и циклы? # # Причина заключается в скорости работы: # In[56]: import time # Примечание: нет необходимости пользоваться модулем **random**, все есть в **numpy.random** # In[57]: A_quick_arr = np.random.normal(size = (100000,)) B_quick_arr = np.random.normal(size = (100000,)) A_slow_list, B_slow_list = list(A_quick_arr), B_quick_arr.tolist() # In[68]: N_repeat = 100 # In[73]: start = time.clock() for i in range(N_repeat): ans = 0 for i in range(100000): ans += A_slow_list[i] * B_slow_list[i] print (time.clock() - start) / N_repeat # время выполнения в секундах # In[74]: start = time.clock() for i in range(N_repeat): ans = sum([A_slow_list[i] * B_slow_list[i] for i in range(100000)]) print (time.clock() - start)/ N_repeat # In[75]: start = time.clock() for i in range(N_repeat): ans = np.sum(A_quick_arr * B_quick_arr) print (time.clock() - start)/ N_repeat # ## 4. Дома посмотреть: # - Все "Что еще" # - Модули **np.random**, **time** (Также полезно знать **%timeit**) # - **Indexing** ([basic](http://docs.scipy.org/doc/numpy-1.10.1/user/basics.indexing.html), [advanced](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)) # - Statistic funcs: *amin()*, *amax()*, *mean()*, *std()* # - Math funcs: *sum()*, *prod()*, *cumsum()*, *cumprod()*, *diff()* # - Можно короче? Да: *a.min()* и *np.min(a)* # - *nansum()*, *nanmin()*, *nanmax()*, *nanmean()* # - **Читайте Docstrings**: See Also раздел, Notes раздел # - **[Numpy Performance tricks](http://nbviewer.jupyter.org/gist/rossant/4645217)** **(!)**