机器学习算法总结--线性回归和逻辑回归
Posted spearhead_cai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习算法总结--线性回归和逻辑回归相关的知识,希望对你有一定的参考价值。
1. 线性回归
简述
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合(自变量都是一次方)。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
优点:结果易于理解,计算上不复杂。
缺点:对非线性数据拟合不好。
适用数据类型:数值型和标称型数据。
算法类型:回归算法
线性回归的模型函数如下:
h
θ
=
θ
T
x
h_\\theta = \\theta ^T x
hθ=θTx
它的损失函数如下:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\\theta) = 1\\over 2m \\sum_i=1^m (h_\\theta(x^(i)) - y^(i))^2
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
通过训练数据集寻找参数的最优解,即求解可以得到
m
i
n
J
(
θ
)
minJ(\\theta)
minJ(θ)的参数向量
θ
\\theta
θ,其中这里的参数向量也可以分为参数
和
w
和
b
和w和b
和w和b,分别表示权重和偏置值。
求解最优解的方法有最小二乘法和梯度下降法。
梯度下降法
梯度下降算法的思想如下(这里以一元线性回归为例):
首先,我们有一个代价函数,假设是 J ( θ 0 , θ 1 ) J(\\theta_0,\\theta_1) J(θ0,θ1),我们的目标是 m i n θ 0 , θ 1 J ( θ 0 , θ 1 ) min_\\theta_0,\\theta_1J(\\theta_0,\\theta_1) minθ0,θ1J(θ0,θ1)。
接下来的做法是:
- 首先是随机选择一个参数的组合 ( θ 0 , θ 1 ) (\\theta_0,\\theta_1) (θ0,θ1),一般是设 θ 0 = 0 , θ 1 = 0 \\theta_0 = 0,\\theta_1 = 0 θ0=0,θ1=0;
- 然后是不断改变 ( θ 0 , θ 1 ) (\\theta_0,\\theta_1) (θ0,θ1),并计算代价函数,直到一个局部最小值。之所以是局部最小值,是因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值,选择不同的初始参数组合,可能会找到不同的局部最小值。
下面给出梯度下降算法的公式:
repeat until convergence
θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) ( f o r j = 0 a n d j = 1 ) \\theta_j := \\theta_j - \\alpha \\frac\\partial\\partial \\theta_j J(\\theta_0,\\theta_1)\\quad (for\\quad j=0 \\quad and\\quad j=1) θj:=θj−α∂θj∂J(θ0,θ1)(forj=0andj=1)
也就是在梯度下降中,不断重复上述公式直到收敛,也就是找到
局
部
最
小
值
局
部
最
小
值
局部最小值\\colorred局部最小值
局部最小值局部最小值。其中符号:=
是赋值符号的意思。
而应用梯度下降法到线性回归,则公式如下:
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
θ
1
:
=
θ
1
−
α
1
m
∑
i
=
1
m
(
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
(
i
)
)
\\theta_0 := \\theta_0 - \\alpha \\frac1m\\sum_i=1^m (h_\\theta(x^(i)) - y^(i))\\ \\\\ \\theta_1 := \\theta_1 - \\alpha \\frac1m\\sum_i=1^m ((h_\\theta(x^(i)) - y^(i)) \\cdot x^(i))
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i)) θ1:=θ1−αm1i=1∑m((hθ(x(i))−y(i))⋅x(i))
公式中的
α
\\alpha
α称为学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈进的步子有多大。
在梯度下降中,还涉及都一个参数更新的问题,即更新 ( θ 0 , θ 1 ) (\\theta_0,\\theta_1) (θ0,θ1),一般我们的做法是同步更新。
最后,上述梯度下降算法公式实际上是一个叫批量梯度下降(batch gradient descent),即它在每次梯度下降中都是使用整个训练集的数据,所以公式中是带有 ∑ i = 1 m \\sum_i=1^m ∑i=1m。
岭回归(ridge regression):
岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价,获得回归系数更为符合实际、更可靠的回归方法,对病态数据的耐受性远远强于最小二乘法。
岭回归分析法是从根本上消除复共线性影响的统计方法。岭回归模型通过在相关矩阵中引入一个很小的岭参数K(1>K>0),并将它加到主对角线元素上,从而降低参数的最小二乘估计中复共线特征向量的影响,减小复共线变量系数最小二乘估计的方法,以保证参数估计更接近真实情况。岭回归分析将所有的变量引入模型中,比逐步回归分析提供更多的信息。
其他回归还可以参考这篇文章。
代码实现
Python实现的代码如下:
#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import linear_model
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train=input_variables_values_training_datasets
y_train=target_variables_values_training_datasets
x_test=input_variables_values_test_datasets
# Create linear regression object
linear = linear_model.LinearRegression()
# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)
#Equation coefficient and Intercept
print('Coefficient: \\n', linear.coef_)
print('Intercept: \\n', linear.intercept_)
#Predict Output
predicted= linear.predict(x_test)
上述是使用sklearn
包中的线性回归算法的代码例子,下面是一个实现的具体例子。
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 17 10:36:06 2016
@author: cai
"""
import os
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
from sklearn import linear_model
# 计算损失函数
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
# 梯度下降算法
def gradientDescent(X, y, theta, alpha, iters):
temp = np.matrix(np.zeros(theta.shape))
parameters = int(theta.ravel().shape[1])
cost = np.zeros(iters)
for i in range(iters):
error = (X * theta.T) - y
for j in range(parameters):
# 计算误差对权值的偏导数
term = np.multiply(error, X[:, j])
# 更新权值
temp[0, j] = theta[0, j] - ((alpha / len(X)) * np.sum(term))
theta = temp
cost[i] = computeCost(X, y, theta)
return theta, cost
dataPath = os.path.join('data', 'ex1data1.txt')
data = pd.read_csv(dataPath, header=None, names=[python机器学习回归算法-线性回归