线性回归的理解和实现

linear_regression_example


线性回归示例

In [1]:

# 加载工具类库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression
from mpl_toolkits.mplot3d import axes3d

pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', 150)
pd.set_option('display.max_seq_items', None)
 
%matplotlib inline  

import seaborn as sns
sns.set_context('notebook')
sns.set_style('white')

熟悉numpy

In [2]:

# 预热练习
def warmUpExercise():    
    return(np.identity(5))

In [3]:

warmUpExercise()

Out[3]:

array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

单变量线性回归

In [4]:

# 加载线性回归的数据
data = np.loadtxt('linear_regression_data1.txt', delimiter=',')

In [5]:

# 查看数据data

Out[5]:

array([[ 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 ],
             ......
       [ 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]])

In [6]:

# 获取X, y的数据集X = np.c_[np.ones(data.shape[0]),data[:,0]]y = np.c_[data[:,1]]

In [7]:

# 查看XX

Out[7]:

array([[ 1.    ,  6.1101],
       [ 1.    ,  5.5277],
       [ 1.    ,  8.5186],
       [ 1.    ,  7.0032],
       [ 1.    ,  5.8598],
       [ 1.    ,  8.3829],
       [ 1.    ,  7.4764],
       [ 1.    ,  8.5781],
       [ 1.    ,  6.4862],
       [ 1.    ,  5.0546],
       [ 1.    ,  5.7107],
       [ 1.    , 14.164 ],
       [ 1.    ,  5.734 ],
       [ 1.    ,  8.4084],
       [ 1.    ,  5.6407],
       [ 1.    ,  5.3794],
       [ 1.    ,  6.3654],
       [ 1.    ,  5.1301],
       [ 1.    ,  6.4296],
       [ 1.    ,  7.0708],
       [ 1.    ,  6.1891],
       [ 1.    , 20.27  ],
       [ 1.    ,  5.4901],
       [ 1.    ,  6.3261],
       [ 1.    ,  5.5649],
       [ 1.    , 18.945 ],
       [ 1.    , 12.828 ],
       [ 1.    , 10.957 ],
       [ 1.    , 13.176 ],
       [ 1.    , 22.203 ],
       [ 1.    ,  5.2524],
       [ 1.    ,  6.5894],
       [ 1.    ,  9.2482],
       [ 1.    ,  5.8918],
       [ 1.    ,  8.2111],
       [ 1.    ,  7.9334],
       [ 1.    ,  8.0959],
       [ 1.    ,  5.6063],
       [ 1.    , 12.836 ],
       [ 1.    ,  6.3534],
       [ 1.    ,  5.4069],
       [ 1.    ,  6.8825],
       [ 1.    , 11.708 ],
       [ 1.    ,  5.7737],
       [ 1.    ,  7.8247],
       [ 1.    ,  7.0931],
       [ 1.    ,  5.0702],
       [ 1.    ,  5.8014],
       [ 1.    , 11.7   ],
       [ 1.    ,  5.5416],
       [ 1.    ,  7.5402],
       [ 1.    ,  5.3077],
       [ 1.    ,  7.4239],
       [ 1.    ,  7.6031],
       [ 1.    ,  6.3328],
       [ 1.    ,  6.3589],
       [ 1.    ,  6.2742],
       [ 1.    ,  5.6397],
       [ 1.    ,  9.3102],
         ......
       [ 1.    ,  5.1884],
       [ 1.    ,  6.3557],
       [ 1.    ,  9.7687],
       [ 1.    ,  6.5159],
       [ 1.    ,  8.5172],
       [ 1.    ,  9.1802],
       [ 1.    ,  6.002 ],
       [ 1.    ,  5.5204],
       [ 1.    ,  5.0594],
       [ 1.    ,  5.7077],
       [ 1.    ,  7.6366],
       [ 1.    ,  5.8707],
       [ 1.    ,  5.3054],
       [ 1.    ,  8.2934],
       [ 1.    , 13.394 ],
       [ 1.    ,  5.4369]])

In [8]:

y

Out[8]:

array([[17.592  ],
       [ 9.1302 ],
       [13.662  ],
       [11.854  ],
       [ 6.8233 ],
       [11.886  ],
       [ 4.3483 ],
       [12.     ],
       [ 6.5987 ],
       [ 3.8166 ],
       [ 3.2522 ],
       ......
       [ 7.5435 ],
       [ 5.3436 ],
       [ 4.2415 ],
       [ 6.7981 ],
       [ 0.92695],
       [ 0.152  ],
       [ 2.8214 ],
       [ 1.8451 ],
       [ 4.2959 ],
       [ 7.2029 ],
       [ 1.9869 ],
       [ 0.14454],
       [ 9.0551 ],
       [ 0.61705]])

In [9]:

# 查看下数据的分布plt.scatter(X[:,1], y, s=30, c='g', marker='*', linewidths=1)plt.xlim(4,24)plt.xlabel('Population of City in 10,000s')plt.ylabel('Profit in $10,000s');

In [10]:

# y 的维度y.size

Out[10]:

97

梯度下降

In [11]:

# 计算损失函数
def computeCost(X, y, theta=[[0],[0]]):
    m = y.size
    J = 0
    
    h = X.dot(theta)
    
    J = 1.0/(2*m)*(np.sum(np.square(h-y)))
    
    return J

In [12]:

computeCost(X,y)

Out[12]:

32.072733877455676

In [13]:

# 梯度下降 求 y = theta * x
def gradientDescent(X, y, theta=[[0],[0]], alpha=0.01, num_iters=1500):
    m = y.size
    J_history = np.zeros(num_iters)
    
    for iter in np.arange(num_iters):
        h = X.dot(theta)
        
        theta = theta - alpha*(1.0/m)*(X.T.dot(h-y))
        J_history[iter] = computeCost(X, y, theta)
    return(theta, J_history)

In [14]:

# 画出每一次迭代和损失函数变化
theta , Cost_J = gradientDescent(X, y)
print('theta: ',theta.ravel())
theta:  [-3.63029144  1.16636235]

In [15]:

Cost_J.size

Out[15]:

1500

In [16]:

# 看下损失的数据for item in  Cost_J:
    print(item)
6.737190464870003
5.9315935686049555
5.901154707081388
5.895228586444221
5.8900949431173295
5.885004158443647
5.879932480491418
5.874879094762575
5.869843911806385
......
4.483505082115583
4.48348154808312
4.483458098818883
4.483434734017543
4.483411453374869
4.483388256587725

In [17]:

Cost_J.shape

Out[17]:

(1500,)

In [18]:

plt.plot(Cost_J)
plt.ylabel('Cost J')
plt.xlabel('Iterations');

In [19]:

xx = np.arange(5,23)xx

Out[19]:

array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
       22])

In [20]:

yy = theta[0] + theta[1] * xxyy

Out[20]:

array([ 2.20152031,  3.36788266,  4.53424501,  5.70060736,  6.86696971,
        8.03333206,  9.19969441, 10.36605676, 11.53241911, 12.69878147,
       13.86514382, 15.03150617, 16.19786852, 17.36423087, 18.53059322,
       19.69695557, 20.86331792, 22.02968027])

In [21]:

xx = np.arange(5,23)yy = theta[0] + theta[1] * xx
# 画出我们自己写的线性回归梯度下降收敛的情况
plt.scatter(X[:,1], y, s=30, c='b', marker='x', linewidths=1)
plt.plot(xx,yy, label='Linear regression (Gradient descent)')

# 和Scikit-learn中的线性回归对比一下 
regr = LinearRegression()regr.fit(X[:,1].reshape(-1,1), y.ravel())
plt.plot(xx, regr.intercept_ + regr.coef_ * xx, label='Linear regression (Scikit-learn GLM)')
plt.xlim(4,24)
plt.xlabel('Population of City in 10,000s')
plt.ylabel('Profit in $10,000s')
plt.legend(loc=4);

In [22]:

# Scikit-learn 算出的 theta , b[regr.intercept_, regr.coef_[0]]

Out[22]:

[-3.89578087831185, 1.1930336441895935]

In [23]:

# 预测一下人口为35000和70000的城市的结果
print(theta.T.dot([1, 3.5])*10000)
print(theta.T.dot([1, 4])*10000)
print(theta.T.dot([1, 5])*10000)
print(theta.T.dot([1, 15]) * 10000)
[4519.7678677]
[10351.57961938]
[22015.20312274]
[138651.43815629]

本文于 2019-11-27 15:21 由作者进行过修改

本文链接:https://itarvin.com/detail-24.aspx

登录或者注册以便发表评论

登录

注册