1. 程式人生 > >機器學習演算法總結--線性迴歸和邏輯迴歸

機器學習演算法總結--線性迴歸和邏輯迴歸

1. 線性迴歸

簡述

在統計學中,線性迴歸(Linear Regression)是利用稱為線性迴歸方程的最小平方函式對一個或多個自變數和因變數之間關係進行建模的一種迴歸分析。這種函式是一個或多個稱為迴歸係數的模型引數的線性組合(自變數都是一次方)。只有一個自變數的情況稱為簡單迴歸,大於一個自變數情況的叫做多元迴歸。

優點:結果易於理解,計算上不復雜。
缺點:對非線性資料擬合不好。
適用資料型別:數值型和標稱型資料。
演算法型別:迴歸演算法

線性迴歸的模型函式如下:

hθ=θTx
它的損失函式如下:
J(θ)=12mi=1m(hθ(x(i))y(i))2
通過訓練資料集尋找引數的最優解,即求解可以得到m
inJ(θ)
的引數向量θ,其中這裡的引數向量也可以分為引數wb,分別表示權重和偏置值。

求解最優解的方法有最小二乘法和梯度下降法

梯度下降法

梯度下降演算法的思想如下(這裡以一元線性迴歸為例):

首先,我們有一個代價函式,假設是J(θ0,θ1),我們的目標是minθ0,θ1J(θ0,θ1)
接下來的做法是:

  • 首先是隨機選擇一個引數的組合(θ0,θ1),一般是設θ0=0,θ1=0;
  • 然後是不斷改變(θ0,θ1),並計算代價函式,直到一個區域性最小值。之所以是區域性最小值,是因為我們並沒有嘗試完所有的引數組合,所以不能確定我們得到的區域性最小值是否便是全域性最小值
    ,選擇不同的初始引數組合,可能會找到不同的區域性最小值。
    下面給出梯度下降演算法的公式:

repeat until convergence{

θj:=θjαθjJ(θ0,θ1)(forj=0andj=1)

}

也就是在梯度下降中,不斷重複上述公式直到收斂,也就是找到。其中符號:=是賦值符號的意思。

而應用梯度下降法到線性迴歸,則公式如下:

θ0:=θ0α1mi=1m(hθ(x(i))y(i))θ1:=θ1α1mi=1m((hθ(x(i))y(i))x(i))
公式中的α稱為學習率(learning rate),它決定了我們沿著能讓代價函式下降程度最大的方向向下邁進的步子有多大。

在梯度下降中,還涉及都一個引數更新的問題,即更新(

θ0,θ1),一般我們的做法是同步更新。

最後,上述梯度下降演算法公式實際上是一個叫批量梯度下降(batch gradient descent),即它在每次梯度下降中都是使用整個訓練集的資料,所以公式中是帶有mi=1

嶺迴歸(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=['Population', 'Profit'])
# print(data.head())
# print(data.describe())
# data.plot(kind='scatter', x='Population', y='Profit', figsize=(12, 8))
# 在資料起始位置新增1列數值為1的資料
data.insert(0, 'Ones', 1)
print(data.shape)

cols = data.shape[1]
X = data.iloc[:, 0:cols-1]
y = data.iloc[:, cols-1:cols]

# 從資料幀轉換成numpy的矩陣格式
X = np.matrix(X.values)
y = np.matrix(y.values)
# theta = np.matrix(np.array([0, 0]))
theta = np.matrix(np.zeros((1, cols-1)))
print(theta)
print(X.shape, theta.shape, y.shape)
cost = computeCost(X, y, theta)
print("cost = ", cost)

# 初始化學習率和迭代次數
alpha = 0.01
iters = 1000

# 執行梯度下降演算法
g, cost = gradientDescent(X, y, theta, alpha, iters)
print(g)

# 視覺化結果
x = np.linspace(data.Population.min(),data.Population.max(),100)
f = g[0, 0] + (g[0, 1] * x)

fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Training Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')

fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(np.arange(iters), cost, 'r')
ax.set_xlabel('Iteration')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')


# 使用sklearn 包裡面實現的線性迴歸演算法
model = linear_model.LinearRegression()
model.fit(X, y)

x = np.array(X[:, 1].A1)
# 預測結果
f = model.predict(X).flatten()
# 視覺化
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Training Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size(using sklearn)')
plt.show()

2. 邏輯迴歸

簡述

Logistic迴歸演算法基於Sigmoid函式,或者說Sigmoid就是邏輯迴歸函式。Sigmoid函式定義如下:
11+ez。函式值域範圍(0,1)。

因此邏輯迴歸函式的表示式如下:

hθ(x)=g(θTX