Вы практиковали сознательно?
В «Преднамеренной практике» автор использует множество данных и примеров, чтобы проиллюстрировать идею о том, что любой, кто усердно практикуется с правильным методом, может преуспеть в своей области. Одним из примеров является опрос студентов-скрипачей. Он разделил студентов на три группы (т. е. три группы «отличники», «отличники» и «самые выдающиеся») и обнаружил, что наиболее важным различием между ними была продолжительность практики, хотя природный талант вначале намеренно заставлял людей учиться быстрее. в конечном итоге это не сыграло решающей роли. До 18 лет лучшие ученики в среднем практиковались 3420 часов, лучшие ученики - 5301 час, а лучшие ученики - 7401 час практики. Автор использует это, чтобы доказать, что каждый может достичь совершенства с упорной практикой.
Линейная регрессия
Затем мы предполагаем, что выводы в преднамеренной практике верны, и мы предполагаем, что имеется набор данных о времени практики и успеваемости по математике. Время практики (ч/б)|Оценка
Итак, как мы находим взаимосвязь между временем практики и оценками? Если эта взаимосвязь обнаружена, можно предсказать оценку ученика, исходя из того, как долго он практиковался. Предположим, что существует линейная зависимость между временем практики и производительностью, тогда гипотетическая функция зависимости может быть выражена следующим образом:
Если количество выборок равно m, то мы можем найти дисперсию относительно этого отношения
Взяв его среднее значение, его можно выразить как
Чем меньше J(θ), тем точнее будет наш прогноз. Таким образом, решение проблемы превращается в поиск значения θ, которое минимизирует J(θ), то есть minJ(θ)
Мы можем произвольно задать значение θ, а затем постепенно сузить диапазон.Когда значение θ стабильно на значении, это означает, что можно найти значение, которое может минимизировать θ. Шаги для сужения области могут быть выполнены следующим образом:
После того, как значение θ получено этим методом, определяется h(θ), определенное в начале, и с помощью этой функции можно предсказать взаимосвязь между временем практики и производительностью. Этот метод называется линейной регрессией в машинном обучении. Процесс решения θ — это алгоритм градиентного спуска.
Найдя θ, вы можете подставить θ в h(θ), чтобы получить связь между производительностью и временем практики.
Реализация линейной регрессии Python
Сначала реализуем $J(\theta)$.В качестве библиотеки для численных расчетов автор использует Numpy, а для визуализации данных использует matplotlib.
функция стоимости
Согласно упомянутому выше
Давайте определим функцию calculate_cost, просто преобразуем ее в матричную операцию по формуле.
def compute_cost(X, y, theta):
m = y.size
prediction = X.dot(theta) - y
sqr = np.power(prediction, 2)
cost = (1 / (2 * m)) * np.sum(sqr)
return cost
Мы можем визуализировать взаимосвязь между функцией стоимости и тета:
def plot_J_history(X, y):
theta0_vals = np.linspace(-10, 10, 100)
theta1_vals = np.linspace(-1, 4, 100)
J_vals = np.zeros((theta0_vals.size, theta1_vals.size))
for i in range(theta0_vals.size):
for j in range(theta1_vals.size):
theta = np.array([theta0_vals[i], theta1_vals[j]])
t = compute_cost(X, y, theta)
J_vals[i, j] = t
theta_x, theta_y = np.meshgrid(theta0_vals, theta1_vals)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(theta_x, theta_y, J_vals)
ax.set_xlabel(r'$\theta$0')
ax.set_ylabel(r'$\theta$1')
plt.show()
plotData.plot_J_history(X, y)
Полученное изображение примерно такое:
А нижняя точка этого изображения и есть та точка, которую нужно получить алгоритмом рекурсивного спуска.
рекурсивный спуск
Приведенное выше дифференциальное выражение рекурсивного спуска можно преобразовать в числовое выражение
В питоне это можно выразить так:
def gradient_descent(X, y, theta, alpha, num_iters):
m = y.size
J_history = np.zeros((num_iters))
for i in range(0, num_iters):
prediction = X.dot(theta) - y
delta = prediction.dot(X)
theta = theta - alpha * (1 / m) * delta
J_history[i] = compute_cost(X, y, theta)
return theta, J_history
Мы можем вызвать эту функцию для решения $\theta$
theta = np.zeros((2,))
iterations = 1500
alpha = 0.01
theta, J_history = gradient_descent(X, y, theta, alpha, iterations)
Чтобы найти потомка $\theta$ и ввести $h(\theta)$, вы можете получить соотношение между счетом и временем практики.
Наконец
На самом деле это выглядит очень хлопотно, но с помощью алгоритма, упакованного sklearn, линейную регрессию можно сделать всего за несколько строк.
from sklearn.linear_model import LinearRegression
... 导入训练数据
regressor = LinearRegression()
regressor = regressor.fit(X_train, Y_train)
Это нормально, эммм...