Пользователь
0,0
рейтинг
15 марта 2013 в 20:01

Разработка → Корреляции для начинающих tutorial

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

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


Введение


Зачем это вообще надо? В науке и около нее очень часто возникает задача предсказания какого-то неизвестного параметра объекта исходя из известных параметров этого объекта (предикторов) и большого набора похожих объектов, так называемой учебной выборки. Пример. Вот мы выбираем на базаре яблоко. Его можно описать такими предикторами: красность, вес, количество червяков. Но как потребителей нас интересует вкус, измеренный в попугаях по пятибалльной шкале. Из жизненного опыта нам известно, что вкус с приличной точностью равен 5*красность+2*вес-7*количество червяков. Вот про поиск такого рода зависимостей мы и побеседуем. Чтобы обучение пошло легче, попробуем предсказать вес девушки исходя из ее 90/60/90 и роста.


Исходные данные


В качестве объекта исследования возьму данные о параметрах фигуры девушек месяца Плейбоя. Источник — www.wired.com/special_multimedia/2009/st_infoporn_1702, слегка облагородил и перевел из дюймов в сантиметры. Вспоминается анекдот про то, что 34 дюйма — это как два семнадцатидюймовых монитора. Также отделил записи с неполной информацией. При работе с реальными объектами их можно использовать, но сейчас они нам только мешают. Зато их можно использовать для проверки адекватности полученных результатов. Все данные у нас непрерывные, то есть грубо говоря типа float. Они приведены к целым числам только чтобы не загромождать экран. Есть способы работы и с дискретными данными — в нашем примере это например может быть цвет кожи или национальность, которые принимают одно из фиксированного набора значений. Это больше имеет отношение к методам классификации и принятия решений, что тянет еще на один мануал. Data.xls В файле два листа. На первом собственно данные, на втором — отсеянные неполные данные и набор для проверки нашей модели.

Обозначения


W — вес реальный
W_p — вес, предсказанный нашей моделью
S — бюст
T — талия
B — бедра
L — рост
E — ошибка модели

Как оценить качество модели?


Задача нашего упражнения — получить некую модель, которая описывает какой-либо объект. Способ получения и принцип работы конкретной модели нас пока не волнует. Это просто функция f(S, T, B, L), которая выдает вес девушки. Как понять, какая функция хорошая и качественная, а какая не очень? Для этого используется так называемая fitness function. Самая классическая и часто используемая — это сумма квадратов разницы предсказанного и реального значения. В нашем случае это будет сумма (W_p — W)^2 для всех точек. Собственно, отсюда и пошло название «метод наименьших квадратов». Критерий не лучший и не единственный, но вполне приемлемый как метод по умолчанию. Его особенность в том, что он чувствителен по отношению к выбросам и тем самым, считает такие модели менее качественными. Есть еще всякие методы наименьших модулей итд, но сейчас нам это пока не надо.

Простая линейная регрессия


Самый простой случай. У нас одна переменная-предиктор и одна зависимая переменная. В нашем случае это может быть например рост и вес. Нам надо построить уравнение W_p = a*L+b, т.е. найти коэффициенты a и b. Если мы проведем этот расчет для каждого образца, то W_p будет максимально совпадать с W для того же образца. То есть у нас для каждой девушки будет такое уравнение:
W_p_i = a*L_i+b
E_i = (W_p-W)^2

Общая ошибка в таком случае составит sum(E_i). В результате, для оптимальных значений a и b sum(E_i) будет минимальным. Как же найти уравнение?

Матлаб


Для упрощения очень рекомендую поставить плагин для Excel под названием Exlink. Он в папке matlab/toolbox/exlink. Очень облегчает пересылку данных между программами. После установки плагина появляется еще одно меню с очевидным названием, и автоматически запускается Матлаб. Переброс информации из Экселя в Матлаб запускается командой «Send data to MATLAB», обратно, соответственно, — «Get data from MATLAB». Пересылаем в Матлаб числа из столбца L и отдельно из W, без заголовков. Переменные назовем так же. Функция расчета линейной регрессии — polyfit(x,y,1). Единица показывает степень аппроксимационного полинома. У нас он линейный, поэтому единица. Получаем наконец-то коэффициенты регрессии: regr=polyfit(L,W,1). a мы можем получить как regr(1), b — как regr(2). То есть мы можем получить наши значения W_p: W_p=L*repr(1)+repr(2). Вернем их назад в Эксель.

Графичек



Мда, негусто. Это график W_p(W). Формула на графике показывает связь W_p и W. В идеале там будет W_p = W*1 + 0. Вылезла дискретизация исходных данных — облако точек клетчатое. Коэффициент корреляции ни в дугу — данные слабо коррелированы между собой, т.е. наша модель плохо описывает связь веса и роста. По графику это видно как точки, расположенные в форме слабо вытянутого вдоль прямой облака. Хорошая модель даст облако растянутое в узкую полосу, еще более плохая — просто хаотичный набор точек или круглое облако. Модель необходимо дополнить. Про коэффициент корреляции стоит рассказать отдельно, потому что его часто используют абсолютно неправильно.

Расчет в матричном виде


Можно и без всяких полифитов справиться с построением регрессии, если слегка дополнить столбец с величинами роста еще одним столбцом, заполненным единицами: L(:,2)=1. Двойка показывает номер столбца, в который пишутся единицы. Тогда коэффициенты регрессии можно будет найти по такой формуле: repr=inv(L'*L)*L'*W. И обратно, найти W_p: W_p=L*repr. Когда осознаешь магию матриц, пользоваться функциями становится неприкольно. Единичный столбец нужен для расчета свободного члена регрессии, то есть просто слагаемого без умножения на параметр. Если его не добавлять, то в регрессии будет всего один член: W_p=a*L. Достаточно очевидно, что она будет хуже по качеству, чем регрессия с двумя слагаемыми. В целом, избавляться от свободного члена надо только в том случае, если он точно не нужен. По умолчанию он все-таки присутствует.

Мультилинейная регрессия


В русскоязычной литературе прошлых лет упоминается как ММНК — метод множественных наименьших квадратов. Это расширение метода наименьших квадратов для нескольких предикторов. То есть у нас в дело идет не только рост, но и все остальные, так сказать, горизонтальные размеры. Подготовка данных точно такая же: обе матрицы в матлаб, добавление столбца единиц, расчет по той же самой формуле. Для любителей функций есть b = regress(y,X). Эта функция также требует добавления столбца единиц. Повторяем расчет по формуле из раздела про матрицы, пересылаем в Эксель, смотрим.

Попытка номер два



А так получше, но все равно не очень. Как видим, клетчатость осталась только по горизонтали. Никуда не денешься, исходные веса были целыми числами в фунтах. То есть после конверсии в килограммы они ложатся на сетку с шагом около 0.5. Итого финальный вид нашей модели:

W_p = 0.2271*S + 0.1851*T + 0.3125*B + 0.3949*L — 72.9132

Объемы в сантиметрах, вес в кг. Поскольку у нас все величины кроме роста в одних единицах измерения и примерно одного порядка по величине (кроме талии), то мы можем оценить их вклады в общий вес. Рассуждения примерно в таком духе: коэффициент при талии самый маленький, равно как и сами величины в сантиметрах. Значит, вклад этого параметра в вес минимален. У бюста и особенно у бедер он больше, т.е. сантиметр на талии дает меньшую прибавку к массе, чем на груди. А больше всего на вес влияет объем задницы. Впрочем, это знает любой интересующийся вопросом мужчина. То есть как минимум, наша модель реальной жизни не противоречит.

Валидация модели


Название громкое, но попробуем получить хотя бы ориентировочные веса тех девушек, для которых есть полный набор размеров, но нет веса. Их 7: с мая по июнь 1956 года, июль 1957, март 1987, август 1988. Находим предсказанные по модели веса: W_p=X*repr

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

Применимость


Если вкратце — полученная модель годится для объектов, подобных нашему набору данных. То есть по полученным корреляциям не стоит считать параметры фигур женщин с весом 80+, возрастом, сильно отличающимся от среднего по больнице итд. В реальных применениях можно считать, что модель пригодна, если параметры изучаемого объекта не слишком отличаются от средних значений этих же параметров для исходного набора данных. Могут возникнуть (и возникнут) проблемы, если у нас предикторы сильно коррелированы между собой. То есть, например это рост и длина ног. Тогда коэффициенты для соответствующих величин в уравнении регрессии будут определены с малой точностью. В таком случае надо выбросить один из параметров, или воспользоваться методом главных компонент для снижения количества предикторов. Если у нас малая выборка и/или много предикторов, то мы рискуем попасть в переопределенность модели. То есть если мы возьмем 604 параметра для нашей выборки (а в таблице всего 604 девушки), то сможем аналитически получить уравнение с 604+1 слагаемым, которое абсолютно точно опишет то, что мы в него забросили. Но предсказательная сила у него будет весьма невелика. Наконец, далеко не все объекты можно описать мультилинейной зависимостью. Бывают и логарифмические, и степенные, и всякие сложные. Их поиск — это уже совсем другой вопрос.

Планы на будущее


Если хорошо пойдет, то постараюсь в том же стиле изложить метод главных компонент для снижения размерности данных, регрессию на главные компоненты, метод PLS, начала кластерного анализа и методов классификации объектов. Если хабрапублика не очень хорошо примет, то буду стараться учесть замечания. Если вообще никак — то забью на просвещение ширнармасс вообще, мне и своих студентов хватит. До новых встреч!
Вадим Марков @BubaVV
карма
99,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (44)

  • +1
    С многомерной корреляцией хорошо справляются также нейронные сети.
    Например, для библиотеки FANN есть много примеров.
    • +4
      Если человек знает слова «нейронная сеть», то он и сам с этим разберется. Этим материалом я пытаюсь снизить порог вхождения в тему для изначально далеких от этого людей
      • 0
        Тогда 1 картинка вызывает диссонанс с последующими иллюстрациями
  • +3
    Спасибо большое. Посоветуйте, с чего стоит начать и какие книги почитать человеку у которого по высшей математике только школьный курс.
    • +1
      Не за что! Я даже и не знаю что посоветовать, хотя сам какое-то время назад был таким же. Если бы что-то было, сам бы не писал. Рыскал по просторам интернета, натыкался на опубликованные англоязычные курсы по мат. статистике.
    • +2
      Для практики есть святая буква R. В самой википедии тема раскрыта плохо, но ссылки на книги прилагаются
      • +1
        По Матлабу документации для старта все-таки больше. Плюс Эксель для визуальной подготовки данных тоже большое подспорье для начинающего. Мануал решил писать не на ровном месте, а в ходе проработки этого вопроса со студентами-нематематиками. Все-таки лучше всего пошла указанная в статье связка
    • +12
      У меня есть пара рекомендаций специально для Вас (я сам Московский Экономико-статистический Институт закончил, поэтому мальца разбираюсь, больше 10 курсов по математике и статистике дают о себе знать):
      image

      image

      Не смотрите, что это комиксы. Уровень для начинающих очень приличный. В обоих книгах математика на уровне интегралов и производных, но на простых примерах. ^_^
      • +4
        Зря такого нету о линейной алгебре и теор. вероятности
        • 0
          На японском есть. На русский пока не перевели.
    • +2
      В первую очередь, Playboy!
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Имея диплом мехмата, прочел с удовольствием. Изложено популярно, язык живой, примеры жизненные! :) Пишите еще обязательно! Доступно и интересно излагать математику дано немногим.
    • 0
      Спасибо! Потихоньку отрос скилл просто рассказывать о сложных вещах. Для местной публики, похоже, это слишком примитивно
  • +23
    Зашёл посмотреть на картинку.
    • +6
      А удивительно то, что это не КДПВ, а реальное отображение сущности статьи… не ну надо же было так вывернуться =) круто!
  • +3
    «вкус [яблока] с приличной точностью равен 5*красность+2*вес-7*количество червяков»
    Я понимаю, что шутка и пример от балды, но как раз жизненный опыт говорит, что червяки выбирают самые спелые/вкусные яблоки — так что коэффициент перед ними должен быть +
    • +3
      яблоко с червяком мы субъективно оценим как невкусное, даже если оно на самом деле вкусное
      • 0
        Т.е. есть заставят прямо с червяками, да?
  • +2
    Позанудствую малость, хоть пятница и картинки этому не способствуют )

    Все-таки вы каким-то окольным путем идете.
    У нас есть две колонки с данными, W и L. Предполагаем прямую зависимость (строка 1, где кси — некая случайная величина).
    Можно напрямую рассчитать корреляцию C1 между ними (см. строка 2).
    Вы же предлагаете по уже посчитанной модели рассчитать еще один набор данных, и уже для него считать корреляцию C2. Понятно, что результат тот же, но этот шаг лишний, имхо.


    *угрюмо уткнулся опять в монитор в этот пятничный вечер*
    • +1
      Тогда надо глубоко копнуть в сторону корреляций вообще и интеркорреляций между предикторами в частности
  • +5
    Я один открыл статью не из-за статьи?
  • +2
    Хорошо даете материал :)

    Единственное, моя практика аналитической работы показывает, что привычная для математиков однобуквенная или чуть менее компактная нотация (со всякими перфиксами и пи-с-душками) переменных — это источник дикого количества ошибок. Как только формулы начинают носить прикладной характер лучше писать их названия более развернуто.
    • 0
      Вот 20 лет занимаюсь тем, что программирую разную математику и физику. Не знаю почему, но неоднобуквенные обозначения во-первых жутко раздражают, а, во-вторых (почему-то) являются хорошим индикатором статей, которые не стоит читать.
      • +1
        Рейнольдс очень расстраивается от ваших слов…
      • 0
        Я глянул, над чем вы работаете, у вас большинство функций имеют не так много вводных, компактные обозначения пекрасно подходят и служат благой цели — спасти от искушения опредмечивания.

        В прикладном анализе данных или, например, оценочных моделях, количество вводных переменных может быть несколько десятоков. Бывает и несколько сотен, например данные опросника на 50 страниц или количественные показатели собранные во время аудита. (ну да, это 100-мерные пространства, выраженные в разношерстных шкалах, что само по себе гемморой) И они, в большинстве своем, предметно привязанные. Так что нужна другая практика.
        • 0
          В каждой конкретной прикладной задаче удобными оказываются свои специфичные обозначения и соглашения. Я же говорил про математический текст, который предназначен для чтения. Вы же не будете ожидать, что в случае 100-мерного вектора наличие у отдельных его компонент уникальных имен поможет читателю больше, чем знание того факта, что это просто вектор x из Rn?
  • +5
    Пятница, boobs, отличная статья.
  • +4
    Залип на картинке.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Нет
  • +1
    сейчас как раз на coursera заканчивается курс про анализ данных — это все там есть, в т.ч. применение линейной регрессии для дискретных переменных или перечислений :)
    кому интересно — велком, лекции вроде не стирают, проф излагает интересно и понятно, в общем отличное введение для новичков

    … и действительно, все это легко и просто делается на R
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Все же без коэффициента корреляции рассказ про линейную регрессию выглядит очень неполным. Ведь основной смысл коэффициента корреляции как раз и состоит в оценке качества линейной регрессии, а не в выяснении наличия зависимости между рядами данных, как часто неправильно думают.
    • 0
      Подробнее об этом написано у меня вот в этой короткой заметке: sites.google.com/site/ltwood/projects/stataddons/corrmyth, может и пригодится, если соберетесь продолжать свою статью.
  • 0
    Очень интересная статья. Положил в избранное. Быть может даже прочитаю… :)
  • +3
    Спасибо, интересно что математика пользуется спросом на Хабре, хотя что-то мне подсказывает что картинка с девушками многое определила.
  • +1
    Интересное исследование. Подобную штуку, но с практическим применением используют для оценки массы плода по данным УЗИ. Массу напрямую посчитать нельзя, но можно измерить, например, окружность головы. Имеется эмпирическая формула, предложенная Шепардом и соавторами [1] всего от двух параметров:
    Log10(eFW)= -1.7492+(0.0166*BPD)+(0.0046*AC)-2.646*(BPD*AC)/1000
    eFW — оценочная масса плода в килограммах
    BPD — Biparietal diameter, бипариетальный диаметр черепа (расстояние между теменными буграми) в миллиметрах
    AC — Abdominal circumference, окружность живота в миллиметрах

    Заметьте, что формула имеет билинейный вид, причём лучшая корреляция была достигнута с логарифмом массы, а не с самой массой. Имеются и другие вариации формул на эту тему [2,3].

    [1] Shepard MJ, Richards VA, Berkowitz RL, et al: An evaluation of two equations for predicting fetal weight by ultrasound. Am J Obstet Gynecol 142:47, 1982
    [2] Hadlock FP, Harrist RB, Carpenter RJ, et al: Sonographic estimation of fetal weight: The value of femur length in addition to head and abdominal measurements. Radiology 150:535, 1984
    [3] Michael G. Pinette, MD, Yuqun Pan, MD, et al: Estimation of Fetal Weight: Mean Value from Multiple Formulas. Ultrasound Med 18:813–817, 1999
    • 0
      Мне как химику со специализацией на аналитике и расчетных методах это близко и приятно. Есть кое-какие мысли по применению генерации очень нелинейных зависимостей типа уравнения Армстронга для МЖХ: 1/k¢ = [n • (KMW-1)/(f • KSW)] • CM +1/(f • KSW). Но мой низкий программерский скилл пока не позволяет реализовать такое

      dx.doi.org/10.1016%2FS0378-3812(98)00242-8
  • +1
    Говоря о корреляции, нельзя не процитировать XKCD:

  • 0
    посередке самая красивая и вторая справа…
  • 0
    Цитата: «Коэффициент корреляции ни в дугу» — это сколько в граммах? Мне как начинающему статистику интересно какой коэфф еще в дугу, а когда надо искать другие методы…
    • 0
      В целом, это сильно зависит от задачи. В этом примере строго на глаз. Я бы постарался понять, какой разброс предсказанной величины выходил с данным коэффициентом корреляции, и смотрел, насколько меня это устроит
  • 0
    Измерения, кроме роста, влияют на вес не линейно. В идеально-круглом случае — пропорционально квадрату радиуса, в остальных случаях — степень между 1 (плоская) до 2 (круглая).

    Для таких случаев удобно использовать логарифмы, позволяющие перевести мультипликативные модели в аддитивные.

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