моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
линейная регрессия: В ограниченных данных путем настройки параметров устанавливается прямая линия, и эта прямая линия (модель) используется для проведения экспериментов с неизвестными данными.предсказывать。
Прямойобщая форма:
y = w × x + by = w умножить на x + bу=ж×Икс+б
Состояние всей прямой определяется выражением ш и чб и бжибРешать, ввжопределить прямую линиюсклон(то есть угол наклона), бббОпределить прямую по оси Yперехватывать(Управляйте перемещением прямой линии вверх и вниз, также известной какпредвзятость ).Поэтому нам нужно только вычислить ввжи бббЗначение можно определить по конкретной прямой. Далее мы изучим, как найти. ввжи ббб。
имя собственное
существительное | Определение |
---|---|
Обучающий набор | Набор данных, используемый для обучения модели |
тестовый набор | Набор данных, используемый для проверки качества модели. |
Обучающая выборка/Точка обучения (Обучающая выборка) | Каждый элемент данных в обучающем наборе |
Функции | Ввод данных в модель может быть числовыми значениями, метками категорий, значениями пикселей изображения и т. д. |
Этикетка | Модель должна прогнозировать целевое значение. Для задач классификации метка обычно представляет собой имя класса, для задач регрессии метка представляет собой непрерывное значение. |
Давайте сначала изучим одномерную линейную регрессию. Так называемая одномерная линейная регрессия относится к линейной функции только с одной независимой переменной, например: y = w ⋅ x + by = wcdot x +bу=ж⋅Икс+бТо естьОдномерная прямая, имеет только одну входную переменную ххИкс . Эту прямую линию можно выразить на двухмерной плоскости (горизонтальная ось — X, вертикальная ось — Y).
Когда мы получаем набор неразделенных данных, мы обычно разделяем данные на обучающий набор и тестовый набор. Простой метод деления таков: первые 80% выборок берут в качестве обучающего набора, а оставшиеся 20% — в качестве. тестовый набор.
Предположим, мы узнали ввжи ббб, то мы определили прямую линию и можем использовать эту прямую линию для прогнозирования, чтобы облегчить оценку прогнозируемого значения.у'с реальной стоимостьюумеждуошибкаСколько мы хотим определить *"линейку"*, используемую для измерения прогнозируемого значения у ′ у'у′с истинной ценностью ггу ошибка между.Здесь мы используемсреднеквадратическая ошибкаопределитьфункция стоимости:
J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sumlimits_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2Дж.(ж,б)=2м1я=1∑м(фж,б(Икс(я))−у(я))2
Формула демонтажа:
fw, b ( x ( i ) − y ( i ) f_{w,b}(x^{(i)}) - y^{(i)}фж,б(Икс(я))−у(я):в fw, b ( x ( i ) ) f_{w,b}(x^{(i)})фж,б(Икс(я))представляет значение, предсказанное с использованием обученной модели, а у ( я ) у^{(я)}у(я)представляет истинный результат каждой обучающей выборки, а разница между ними представляет собой ошибку между значением, предсказанным моделью, и истинным значением.
Зачем исправлять ошибку?
Во всех наборах выборок каждая ошибка может быть положительной или отрицательной, и в процессе суммирования будет определенная вероятность смещения. Это приведет к тому, что ошибка каждого элемента будет очень большой (например: -100, + 90, -25, +30), после суммирования получается небольшое значение (-5) и, наконец, получается неправильное суждение.
1 2 м фрак{1}{2м}2м1: представляет собой среднее значение суммы всех ошибок данных (это среднее значение может в некотором смысле представлять ошибку всей модели) и позволяет получить среднеквадратическую ошибку.
Зачем делить на 2?
Потому что при дальнейшем выполнении градиентного спуска при выводе индекс 2 будет разделен на коэффициенты, поскольку при большом объеме данных константа мало влияет на модель. Чтобы ввести формулу вывода, заранее разделите ее на 2. , для последующего смещения.
Зная функцию стоимости, нам нужно только найти способы снизить стоимость. Чем ниже стоимость, тем ближе наше прогнозируемое значение к реальному значению.
Наблюдая за функцией стоимости ошибки, мы видим, что функция стоимости ошибки является квадратичной функцией, то естьвыпуклая функция, свойство выпуклой функции:Крайняя точка – это максимальная точка , поскольку функция стоимости представляет собой квадратичную функцию, открывающуюся вверх (формулу можно расширить, и вы интуитивно почувствуете, что коэффициент при квадратном члене больше 0), поэтому выпуклая функция имеет только минимальное значение, и мы только нужно найти Минимальное значение — это минимальное значение.Для функции стоимости ошибки J ( ш , б ) J(ш, б)Дж.(ж,б) , его разложение по формуле можно записать как:
J ( w , b ) = 1 2 m ∑ i = 1 m ( ( wx ( i ) + b ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sumlimits_{i = 1}^m((wx^{(i)}+b) - y^{(i)})^2Дж.(ж,б)=2м1я=1∑м((жИкс(я)+б)−у(я))2
ДжДжДж.Размер зависит от параметров ввжи ббб, которую можно решить методом градиентного спуска. Форма функции стоимости примерно следующая:
Идея градиентного спуска в основном проходитНайдите частную производнуюметод, относящийся к биологическомууправляющие переменныеМетод очень похож, например: при контроле бббОбновление без изменений ввж(Видимый бббявляется константой), формула: w ′ = w − α ∂ J ( w ) ∂ ww' = w - альфа frac{partial J(w)}{partial w}ж′=ж−α∂ж∂Дж.(ж) Указывает, что он был обновлен последовательно ввж,в α альфаα представляетскорость обучения Используется для обозначения размера шага, который также можно понимать как скорость спуска. ∂ J ( w ) ∂ w frac{частичный J(w)}{частичный w}∂ж∂Дж.(ж) выражает право ввжИща частную производную, получаем В − ДжВ - ДжВт−Дж.(ВесВти ценаДж.функция) Касательная линия к выпуклой функции, используемая для обозначения наиболее быстро убывающего значения функции.направление, произведение этих двух представляетПереместитесь на один шаг в ту сторону, где значение функции уменьшается быстрее всего. .Это расстояние необходимо отрегулировать в соответствии с набором данных If. α альфаαЕсли он слишком велик (слишком велик размер шага), это приведет к ввжпроходит непосредственно через самую низкую точку к верхней точке на другой стороне, так что она никогда не приближается к минимуму, если α альфаαЕсли он слишком мал (размер шага слишком мал), это приведет к ввжПо мере приближения к минимуму он становится все медленнее и медленнее, что требует вычислительных затрат.
скорость обучения ( α альфаα) метод регулировки:
Сначала установите меньший α альфаα Например: 0,001.
Затем каждый раз увеличивается в 10 раз, максимум до 1.
После определения определенного значения, например: 0,01.
Затем выполните 3 раза обработку, например: 0,01 × 3 = 0,03, 0,03 × 3 = 0,09 0,01 умножить на 3 = 0,03, 0,03 умножить на 3 = 0,090.01×3=0.03,0.03×3=0.09 (Цель этого — ускорить сходимость).
Процесс решения частных производных (нахождение направления градиентного спуска):
очень прошу ∂ J ( w ) ∂ w frac{частичный J(w)}{частичный w}∂ж∂Дж.(ж) :
∂ J ( w ) ∂ w frac{частичный J(w)}{частичный w}∂ж∂Дж.(ж) = ∂ ∂ w 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{partial}{partial w}frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂ж∂2м1я=1∑м(фж,б(Икс(я))−у(я))2
= ∂ ∂ w 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{partial}{partial w}frac{1}{2m}sumlimits_{i = 1}^{m}wx^{(i)} - y^{(i)})^2∂ж∂2м1я=1∑мжИкс(я)−у(я))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 x ( i ) frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot2x^{(i)}2м1я=1∑м(фж,б(Икс(я))−у(я))⋅2Икс(я)
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) x ( i ) frac{1}{m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}м1я=1∑м(фж,б(Икс(я))−у(я))Икс(я)
очень прошу ∂ J ( w ) ∂ b frac{частичный J(w)}{частичный b}∂б∂Дж.(ж) :
∂ J ( w ) ∂ b frac{частичный J(w)}{частичный b}∂б∂Дж.(ж) = ∂ ∂ b 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{partial}{partial b}frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂б∂2м1я=1∑м(фж,б(Икс(я))−у(я))2
= ∂ ∂ b 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{partial}{partial b}frac{1}{2m}sumlimits_{i = 1}^{m}wx^{(i)} - y^{(i)})^2∂б∂2м1я=1∑мжИкс(я)−у(я))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 frac{1}{2m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot22м1я=1∑м(фж,б(Икс(я))−у(я))⋅2
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) frac{1}{m}sumlimits_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})м1я=1∑м(фж,б(Икс(я))−у(я))
Найдите конкретные с помощью итерации цикла ввжзначение с бббценить:
пока ( ) : пока():жприветле():
w ∗ = w − α ∂ ∂ w J ( w , b ) w^* = w - альфа frac{partial}{partial w}J(w,b)ж∗=ж−α∂ж∂Дж.(ж,б)
b ∗ = b − α ∂ ∂ b J ( w , b ) b^* = b - альфа frac{partial}{partial b}J(w,b)б∗=б−α∂б∂Дж.(ж,б)
ш = ш ∗ ш = ш^*ж=ж∗
б = б ∗ б = б^*б=б∗
Вначале мы случайным образом задаем значения w и b, а затем выполняем итерацию. Мы можем настроить выход градиентного спуска, когда ошибка меньше определенного порога, или настроить количество итераций, чтобы получить более идеальный результат. ввжсумма стоимости бббценить.
Многомерная линейная регрессия расширяет измерения до трехмерных и даже многомерных состояний, таких как у = w1 x 1 + w2 x 2 + by = w_1 x_1 + w_2 x_2 + bу=ж1Икс1+ж2Икс2+б можно понимать какИксОсь иИОси х 1 и х 2 х_1 и х_2Икс1иИкс2 ЗОсь ггу, это трехмерное состояние. Каждая обучающая выборка представляет собой точку в трехмерном пространстве. Необходимо найти подходящую прямую линию, соответствующую точке выборки в трехмерном пространстве.
Метод: Для каждой переменной отдельно ( ш 1 , ш 2 , … , ш н , б ш_1,ш_2,точки,ш_н,бж1,ж2,…,жн,б) для обработки градиентного спуска
Основные моменты: Для многомерной линейной регрессии диапазоны значений разных значений признака различны, например: диапазон значений возрастного признака: 0 0 0 ~ 100 100 100, площадь покрытия: 0 м 2 0м^20м2 ~ 10000 м2 10000м^210000м2 , также может бытьСтранный образец, существование единичных выборочных данных приведет к увеличению времени обучения, а также может привести к сбою сходимости. Поэтому при наличии единичных выборочных данных необходимо предварительно обработать данные перед обучением.Нормализованный ; Напротив, при отсутствии единичных выборочных данных нормализацию выполнять не требуется.Для решения этой проблемы нам необходимо выполнитьХарактеристики масштабированы (нормализованы)。
Обработка нормализации данных
выполнитьНормализация данныхСуществует три метода:
То же, что деление на максимальное значение:
Все значения каждого признака делятся на максимальное значение этого признака.
Средняя нормализация:
Вычтите значение каждой функции из значения этой функции.иметь в виду, а затем разделить на разницу между максимальным и минимальным значениями признака.
Нормализация Z-оценки:
Рассчитаем каждую функциюсреднеквадратичное отклонениеииметь в виду
Вычтите значение каждой функции из всех значений этой функции.Средняя стоимость, а затем разделить на объектиметь в виду
Если нормализацию не провести, функция стоимости изменится из-за больших различий в значениях разных признаков в векторе признаков. "плоский" .Таким образом, при выполнении градиентного спуска направление градиента будет отклоняться от направления минимального значения, и оно будет сильно уходить.объезд, что приведет к слишком длительному времени обучения.
После нормализации целевая функция покажет сравнение "круглый", так что скорость обучения значительно увеличивается и можно избежать многих обходных путей.
Преимущества нормализации данных:
J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}sumlimits_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2Дж.(ж,б)=2м1я=1∑м(фж,б(Икс(я))−у(я))2
Градиентный спуск для множественной линейной регрессии:
w 1 = W 1 − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) x 1 ( i ) w_1 = W_1 - альфа frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_1^{(i)}ж1=Вт1−αм1я=1∑м(фж,бИкс(я)−у(я))Икс1(я)
⋮ vdots⋮
wn = W n − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) xn ( i ) w_n = W_n - альфа frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_n^{(i)}жн=Втн−αм1я=1∑м(фж,бИкс(я)−у(я))Иксн(я)
b = b − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) b = b - альфа frac{1}{m}sumlimits_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})б=б−αм1я=1∑м(фж,бИкс(я)−у(я))
объяснять: w 1 ⋯ wn w_1cdots w_nж1⋯жн представляет коэффициент каждой переменной, а b представляет постоянный член линейной функции.
Пропускать...
Математический вывод:
J = 1 2 m ∑ i = 1 m ( θ ⃗ ix ⃗ i − yi ) 2 J = frac{1}{2m}sumlimits_{i = 1}^{m}(vec{theta}_i vec{x}_i - y_i)^2Дж.=2м1я=1∑м(θяИкся−уя)2
= 1 2 m ∣ ∣ θ ⃗ x ⃗ − y ∣ ∣ 2 frac{1}{2m}||vec{theta} vec{x} - y||^22м1∣∣θИкс−у∣∣2
= 1 2 m ( θ ⃗ x ⃗ − y ) T ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta} vec{x} - y)^T(vec{theta} vec{x} - y)2м1(θИкс−у)Т(θИкс−у)
= 1 2 m ( θ ⃗ T x ⃗ T − y T ) ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta}^T vec{x}^T - y^T)(vec{theta} vec{x} - y)2м1(θТИксТ−уТ)(θИкс−у)
= 1 2 m ( θ ⃗ T x ⃗ T x ⃗ θ ⃗ − y T x ⃗ θ ⃗ − θ ⃗ T x ⃗ T y + y T y ) frac{1}{2m}(vec{theta}^T vec{x}^Tvec{x}vec{theta} - y^Tvec{x}vec{theta} -vec{theta}^Tvec{x}^Ty +y^Ty )2м1(θТИксТИксθ−уТИксθ−θТИксТу+уТу)
верно θ тетаθНайдите частную производную: Δ = ∂ J ∂ θ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) Дельта =frac{partial J}{partial theta}= frac{1}{2m}(frac{partial vec{theta}^T vec{x}^Tvec{x}vec{theta}}{partial theta} - frac{partial y^Tvec{x}vec{theta}}{partial theta} - frac{partial vec{theta}^Tvec{x}^Ty}{частичная тета} + frac{y^Ty}{частичная тета})Δ=∂θ∂Дж.=2м1(∂θ∂θТИксТИксθ−∂θ∂уТИксθ−∂θ∂θТИксТу+∂θуТу)
Правило вывода матрицы:
∂ θ TA θ ∂ θ = ( A + AT ) θ frac{частичная тета^{T}Atheta}{частичная тета} = (A + A^T)theta∂θ∂θТАθ=(А+АТ)θ
∂ XTA ∂ X = A frac{partial X^{T}A}{partial X} = A∂Икс∂ИксТА=А
∂ AX ∂ X = AT frac{partial AX}{partial X} = A^T∂Икс∂АИкс=АТ
∂ A ∂ X = 0 frac{partial A}{partial X} = 0∂Икс∂А=0
Доступный Δ = 1 2 м ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) = 1 2 м ⋅ ( 2 x T x θ − 2 x T y ) = 1 м ⋅ ( x T x θ − x T y ) Дельта = frac{1}{2m}(frac{partial vec{theta}^T vec{x}^Tvec{x}vec{theta}}{partial theta} - frac{partial y^Tvec{x}vec{theta}}{частичная тета} - frac{partial vec{theta}^Tvec{x}^Ty}{частичная тета} + frac{y^Ty}{частичная тета}) = frac{1}{2m}cdot (2x^Txtheta - 2x^Ty) = frac{1}{m} cdot (x^Txtheta - x^Ty)Δ=2м1(∂θ∂θТИксТИксθ−∂θ∂уТИксθ−∂θ∂θТИксТу+∂θуТу)=2м1⋅(2ИксТИксθ−2ИксТу)=м1⋅(ИксТИксθ−ИксТу)
когда Δ = 0 Дельта = 0Δ=0 час: x T x θ = x T yx^Tx тета = x^TyИксТИксθ=ИксТу , θ = ( x T x ) − 1 x T y тета = (x^Tx)^{-1}x^Tyθ=(ИксТИкс)−1ИксТу можно рассчитать θ тетаθ ценить.
Сравнение градиентного спуска и нормальных уравнений:
градиентный спуск: необходимо выбрать скорость обучения α, которая требует нескольких итераций. Ее также лучше применять, когда количество признаков n велико, и она подходит для различных типов моделей.
нормальное уравнение: Нет необходимости выбирать скорость обучения α. Она рассчитывается один раз и ее необходимо рассчитать. ( х Т х ) − 1 (х^Тх)^{-1}(ИксТИкс)−1 , если количество признаков нннЕсли она больше, то стоимость операции будет выше, поскольку временная сложность вычисления обратной матрицы равна О (n3) О(n^3)О(н3) , обычно когда нннЭто все еще приемлемо, если оно меньше 10 000.Доступно только для линейных моделей., не подходит для других моделей, таких как модели логистической регрессии.
Поскольку в некоторых случаях прямым линиям сложно уместить все данные, для соответствия данным необходимы кривые, такие как квадратичные модели, кубические модели и т. д.
В общем, функция регрессии данных неизвестна, даже если она известна, ее сложно преобразовать в линейную модель с помощью простого преобразования функции, поэтому общий подход таков.полиномиальная регрессия(Полиномиальная регрессия), то есть использование полиномиальной функции для подбора данных.
Как выбрать степень многочлена:
Существует много типов полиномиальных функций. Вообще говоря, вам нужно сначала наблюдать за формой данных, а затем решить, какую форму полиномиальной функции использовать для решения проблемы. Например, из диаграммы рассеяния данных, если есть "сгибать ", вы можете рассмотреть возможность использования квадратичного полинома (то есть возведения характеристик в квадрат); есть два "сгибать ", вы можете рассмотреть возможность использования кубического полинома (взяв кубическую степень объекта); существует три "сгибать », затем рассмотрите возможность использования полинома четвертого порядка (взяв четвертую степень признака) и так далее.
Хотя реальная функция регрессии не обязательно является полиномом определенной степени, при условии хорошего соответствия можно использовать соответствующий полином для аппроксимации реальной функции регрессии.
Приложение в конце статьи содержит все исходные данные, использованные в эксперименте.ex1data1.txt
это связь между численностью населения и прибылью, ex1data2.txt
Это влияние размера дома и количества спален на цену дома.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = "ex1data1.txt"
data = pd.read_csv(path,header = None,names=['Population','Profit'])
data.head() # 预览数据
data.describe() # 更加详细的数据描述
# 可视化训练数据
data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (12,8))
plt.show()
def computerCost(X,y,theta): # 定义代价函数
inner = np.power(((X*theta.T)-y),2) # theta.T表示theta的转置
return np.sum(inner)/(2*len(X))
data.insert(0,"One",1) # 表示在第0列前面插入一列数,其表头为One,其值为1
Вставьте в первый столбец набора данных 1 1 1Функция состоит в том, чтобыОблегчает матричные вычисления, при умножении матриц участвуют веса ввжи предвзятость ббб,потому что бббне умножается на переменную, поэтому 1 1 1, используется с бббУмножить.
cols = data.shape[1]
X = data.iloc[:,0:cols - 1] #“,”前只有“:”,表示所有的行,“,”后表示抽取数据中第[0列~第cols-1列)(左闭右开),去掉最后一列,最后一列为预测值
y = data.iloc[:,cols - 1:cols] #只取最后一列的值,表示预测值
X.head()
y.head()
X = np.matrix(X.values)
y = np.matrix(y.values) #只将表格中的值装换为矩阵而不是包括序号与标题
#初始化theta
theta = np.matrix(np.array([0,0])) #先是一个一维的数据,然后在转换为一个二维的矩阵
theta
# => matrix([[0, 0]])
X.shape,theta.shape,y.shape # 此时theta为一行列,需要进行转置
# => ((97, 2), (1, 2), (97, 1))
computerCost(X,y,theta)
# => 32.072733877455676
def gradientDecent(X,y,theta,alpha,iters): #iters为迭代次数
temp = np.matrix(np.zeros(theta.shape)) #构造一个与theta大小一样的零矩阵,用于存储更新后的theta
parmaters = int (theta.ravel().shape[1]) #.ravel()的功能是将多维数组降至一维,用于求需要求的参数个数
cost = np.zeros(iters) #构建iters个0的数组,相当于对每次迭代的cost进行记录
for i in range(iters):
error = (X * theta.T - y) #记录误差值,结果为一个数组
for j in range(parmaters): #对每一个参数进行更新,j用于表示每一个参数
term = np.multiply(error,X[:,j]) #.multiply 是对矩阵当中的数对应相乘,这里表示与X矩阵的第j列相乘。
temp[0,j] = theta[0,j] - ((alpha/len(X))*np.sum(term)) #存储更行后的theta的值,.sum()表示将矩阵中的数进行求和
theta = temp #更新theta
cost[i] = computerCost(X,y,theta) #计算此时的代价,并记录在cost中。
return theta,cost
alpha = 0.01 # 学习率
iters = 1000 # 迭代次数
g,cost = gradientDecent(X,y,theta,alpha,iters)
g
# => matrix([[-3.24140214, 1.1272942 ]])
computerCost(X,y,g)
# => 4.515955503078914
x = np.linspace(data.Population.min(),data.Population.max(),100) #抽取100个样本 (从data数据集中的最小值到最大值之间抽取100个样本)
f = g[0,0] + (g[0,1] * x) #f = ax + b
fig,ax = plt.subplots(figsize = (12,8)) #figsize表示图的大小
ax.plot(x,f,'r',label = "Prediction") #绘制直线,横坐标,纵坐标,直线名称
ax.scatter(data.Population,data.Profit,label = 'Training data') #绘制点,横坐标,纵坐标,点的名称
ax.legend(loc = 4) #显示图例位置
ax.set_xlabel('Population') #设置x轴的名称
ax.set_ylabel('Profit') #设置y轴的名称
ax.set_title('Predicted Profit vs. Population Size') #设置标题的名称
plt.show()
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost,'r')
ax.set_xlabel('Interations')
ax.set_ylabel('Cost')
ax.set_title("Error vs. Training Epoc")
plt.show()
path = "ex1data2.txt"
data2 = pd.read_csv(path,header = None,names=["Size","Bedroom","Price"])
data2.head()
data2 = (data2 - data2.mean())/data2.std()
data2.head()
data2.insert(0,'Ones',1) #在x的第一列插入1
clos = data2.shape[1] #存储第二维(列)的数据量
X2 = data2.iloc[:,0:clos-1] #对X2进行赋值
y2 = data2.iloc[:,clos-1:clos] #对y2进行赋值
X2 = np.matrix(X2.values) #将X2转为矩阵
y2 = np.matrix(y2.values) #将y2转为矩阵
theta2 = np.matrix(np.array([0,0,0])) #初始化theta2为0矩阵
computerCost(X2, y2, theta2)
# => 0.48936170212765967
g2,cost2 = gradientDecent(X2,y2,theta2,alpha,iters) #记录放回值g2(theta2)和cost2
g2
# => matrix([[-1.10868761e-16, 8.78503652e-01, -4.69166570e-02]])
computerCost(X2,y2,g2)
# => 0.13070336960771892
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost2,'x')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()
#正规方程
def normalEqn(X,y):
theta = np.linalg.inv(X.T@X)@X.T@y #.linalg中包含线性代数中的函数,求矩阵的逆(inv)、特征值等。@表示矩阵相乘
return theta
final_theta2 = normalEqn(X,y)
final_theta2
# => matrix([[-3.89578088], [ 1.19303364]])
Общие шаги по обучению модели:
ex1data1.txt
6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705
ex1data2.txt
2104,3,399900
1600,3,329900
2400,3,369000
1416,2,232000
3000,4,539900
1985,4,299900
1534,3,314900
1427,3,198999
1380,3,212000
1494,3,242500
1940,4,239999
2000,3,347000
1890,3,329999
4478,5,699900
1268,3,259900
2300,4,449900
1320,2,299900
1236,3,199900
2609,4,499998
3031,4,599000
1767,3,252900
1888,2,255000
1604,3,242900
1962,4,259900
3890,3,573900
1100,3,249900
1458,3,464500
2526,3,469000
2200,3,475000
2637,3,299900
1839,2,349900
1000,1,169900
2040,4,314900
3137,3,579900
1811,4,285900
1437,3,249900
1239,3,229900
2132,4,345000
4215,4,549000
2162,4,287000
1664,2,368500
2238,3,329900
2567,4,314000
1200,3,299000
852,2,179900
1852,4,299900
1203,3,239500