Начало машинного обучения -- 1. Мой первый алгоритм машинного обучения

машинное обучение

предисловие

Раньше я имел общее представление о знаниях, связанных с машинным обучением, недавно в свободное время я официально смотрел NG Big в облачном классе NetEase.машинное обучение, в дополнение к сбору урожая, содержание обучения также будет ускорено и дано на практике.

Эта статья - первый алгоритм, который я изучил梯度下降算法.

градиентный спуск

Ссылка на вики:

梯度下降法(英语:Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。

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

Линейная регрессия

Ссылка на вики:

在统计学中,线性回归(英语:linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归(multivariate linear regression)

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

Базовые концепты

Для одного набора данных о ценах на жилье просто понимается, что соотношение между ценой и площадью комнаты изменяется линейно (предполагается), а затем сохраняет预测函数H:

вHypothesisЭто линейная функция нашего прогноза цены дома, переменная x — площадь комнаты, h — цена дома, которую мы предсказали, иParameters \theta0 \theta1Это параметр, который нам нужно рассчитать с помощью прогноза.Чтобы рассчитать параметры этих двух прогнозов, нам нужно сравнить прогнозируемую функцию со значением y, чтобы найти дисперсию, и проверить разрыв между прогнозируемым результатом и реальным результат--Функция стоимости.

В то же время мы хотим минимизировать стоимость функции стоимости, то есть сделать функцию предсказания бесконечно близкой к реальным данным, то есть минимизировать значение функции стоимости, чтобы функция предсказания была отличается от реальных данных.y 房价Значение данных ближе, поэтому необходим алгоритм для вычисления минимального значения функции стоимости, что приводит к алгоритму梯度下降(Gradient descent).

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

На рисунке ниже представлена ​​формула алгоритма для каждого параметра, где \alpha — скорость обучения, которая используется для расчета скорости снижения.

После нахождения частной производной, где X0 = 1 (определяется в конспектах лекций кактермин перехвата), m — количество обучающих данных

参数计算

Согласно формуле в конспекте лекций, нам нужно только повторять расчет до тех пор, пока частная производная функции стоимости не будет близка к малому значению, чтобы получить предсказанный нами параметр \thetaj

упражняться

1. Набор данных

На этот раз используется набор данных на kaggle, который называется набором данныхHouse Sales in King County, USAНабор данных представляет собой набор данных о ценах на жилье в городе США с мая 2014 года по май 2015 года.

2. Анализ данных

После загрузки данных используйте py для их просмотра.

import pandas as pd

df = pd.read_csv("input/kc_house_data.csv", )

print(df.shape)

结果

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

import matplotlib.pyplot as plt

df = df[['price', 'sqft_living']]

#1.绘制价格和房间规格大小的点图

alt = array(df)

x = []
y = []
for a in alt:
    x.append(a[1])
    y.append(a[0])
x, y = array(x),array(y)

plt.figure()

plt.scatter(x, y, s=5, c='red', label = 'Predicted Regression Line')

plt.xlabel('Living Space (sqft)')
plt.ylabel('Price ($)')
plt.show()

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

3.Coding

Некоторые данные необходимо предварительно определить: начальные значения двух параметров, скорость обучения, предельное значение функции стоимости, число m

# 定义预测函数 h = z + z1 * x 预测为线性
# 定义学习率 a
a = 0.01
# 定义初始值
z = 0
z1 = 50
# 数量长度
# 因数值太大 先缩小
x = x / 1000
y = y / 1000

m = len(x)
# 定义极限
min_limit = 1e-3

Определите функцию для получения h:

def getH(z, z1, x, y):
    return z + z1 * x - y

Определение для получения результата частной производной z:

def getZ(z, z1, x, y, m):
    sum = 0 
    for i in range(m):
        h = getH(z, z1, x[i], y[i])
        sum = sum + h
    sum = sum * (1./ m)
    # newZ = z - sum
    return sum
    

Определение Получите результат частной производной z1:

def getZ1(z, z1, x, y, m):
    sum = 0 
    for i in range(m):
        h = getH(z, z1, x[i], y[i])
        h = h * x[i]
        sum = sum + h
    sum = sum * (1./ m)
    # newZ1 = z1 - sum
    return sum

Получите в результате все Z:

def getAllZ(z, z1, x, y, m, a, min_limit):
    newZ = getZ(z, z1, x, y, m)
    newZ1 = getZ1(z, z1, x, y, m)
    #梯度下降操作 如果sum 结果比极限值大 则还未接近0,继续梯度下降
    while abs(newZ) >= min_limit and abs(newZ1) >= min_limit:
        print('z z1', z, z1)
        print('new z new z1', newZ, newZ1)
        z = z - a * newZ
        z1 = z1 - a * newZ1
        newZ = getZ(z, z1, x, y, m)
        newZ1 = getZ1(z, z1, x, y, m)
    print('new z', newZ)
    print('new z1', newZ1)
    print('z z1', z, z1)
    return [z, z1]

Наконец, вызовите метод, чтобы получить результат:


result = getAllZ(z, z1, x, y, m, a, min_limit)
#10条数据 z = -13.80519903101423 z1 = 225.65934680567906
#全部数据 z =  -43.56346904629207 280.61642450710656
def testY(x, result):
    return (result[0] + result[1] * x);
x = x * 1000
y = y * 1000
text_y = []
for i in x:
    # print(i)
    text_y.append(testY(i, result))
    
plt.figure()
plt.scatter(x, y, s=5, c='red', label='Data')
plt.plot(x, text_y, c='darkgreen', label='Predicted Regression Line')
plt.xlabel('Living Space (sqft)')
plt.ylabel('Price ($)')
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.legend()
plt.show()
    

Выведите получившийся график:

Когда 10 частей данных:

Все данные (ед/1000):

Наконец, функция предсказания получена,

h = -43.56346904629207 + 280.61642450710656 * x

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

4. Матричная форма

Обновление 2019.10.10

Основная формула матрицы разглашаться не будет.Фактически это расширение ее принципа.Известно,что существуют следующие методы решения параметров функции предсказания:

Функция стоимости:

можно преобразовать в матричную форму,

Выводы в нем публиковаться не будут.cs229соответствующие выводы После поиска частных производных:

Таким образом, для\thetaРасчетная функция (x,\thetaимеют матричную форму, а y — матричный вектор):


thea - a * x.T * (x * thea - y) * 1./ m

Под кодированием:

#梯度下降矩阵型式

import os
import sys
import math
import pandas as pd
import matplotlib.pyplot as plt
import numpy.matlib 
import numpy as np

#导入数据

df = pd.read_csv("../20190820/input/kc_house_data.csv")
#因是简单的一个线性回归 参数先使用2个 price 和 sqft_living
#需要以下矩阵 价格结果矩阵 面积矩阵
y = df[['price']]
x = df[['sqft_living']]
m = len(x)
a = 0.01 #学习率   
#将df 转换成矩阵
y = np.asmatrix(y) / 1000
x = np.asmatrix(x) / 1000
#因x0 默认为1 需要一个 1xm的 x0矩阵
x0 = np.matlib.ones((m, 1))
#合并矩阵 2 x m
x = np.concatenate([x0, x], 1)
#定义thea 目前设置为2个变量 默认为0
thea = np.matlib.zeros((2, 1))
diff = np.dot(x, thea) - y
diff = np.dot(np.transpose(x), diff) * (1./m)
while not np.all(np.absolute(diff) <= 1e-5):
	#loop
	thea = thea - a * diff
	diff = np.dot(x, thea) - y
	diff = np.dot(np.transpose(x), diff) * (1./m)
	print('thea: ', thea)
print('final thea', thea)

Когда частная производная (абсолютное значение) J очень мала, что в данной статье составляет 1e-5, можно считать, что точка локального минимума достигнута. После запуска вывод результата:

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

выше. Связанный адрес исходного кода:Gayhub