文章目录
线性回归(原理)
1,简单线性回归
2,多元线性回归
3,线性回归损失函数
一,会用到的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 在 notebook 里,要设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
二,使用pandas读取数据
ex0 = pd.read_table('D:\Python\pycharm\机器学习\线性回归\实战—书\Data.txt',header=None)
# 预览前5行
ex0.head()
>>>
0 1 2
0 1.0 0.067732 3.176513
1 1.0 0.427810 3.816464
2 1.0 0.995731 4.550095
3 1.0 0.738336 4.256571
4 1.0 0.981083 4.560815
三,辅助函数
1,从文档中获取数据
def get_Mat(dataset):
xMat = np.mat(dataset.iloc[:,:-1].values)
yMat = np.mat(dataset.iloc[:,-1].values).T
return xMat,yMat
xMat, yMat = get_Mat(ex0)
2,数据分布可视化
def plotShow(dataset):
xMat, yMat = get_Mat(dataset)
"""Mat.A 表示:从matric格式转化为array格式"""
plt.scatter(xMat.A[:,1],yMat.A,c='b',s=5)
plt.show()
plotShow(ex0)
3,计算回归系数
xMat的第一列应该都为 1,这列对应截距
def standRegres(dataset):
xMat,yMat = get_Mat(dataset)
"""Mat.T 为转置矩阵:沿对角线翻折"""
xTx = xMat.T * xMat
"""np.linalg.det(M)计算行列式:|M|"""
if np.linalg.det(xTx) == 0:
print('矩阵为奇异矩阵,无法求逆')
return
"""Mat.I 求逆矩阵"""
ws = xTx.I * (xMat.T * yMat)
return ws
ws = standRegres(ex0)
ws
>>>matrix([[3.00774324],
[1.69532264]])
4,回归线的可视化
def plotReg(dataset):
xMat,yMat = get_Mat(dataset)
plt.scatter(xMat.A[:,1],yMat.A,c='b',s=5)
ws = standRegres(dataset)
"""矩阵乘法是有顺序的!!!"""
"""xMat(200,2) * ws(2,1) = yHat(200,1)"""
yHat = xMat * ws
plt.plot(xMat[:,1],yHat,c='r')
plt.show()
4,计算相关系数
yHat为预测结果
yMat为真值
**Px,y = Cov(X,Y) / (Var[X] * Var[Y])0.5
性质:
1,可以表征x和y之间线性关系紧密程度的量
2,越大,相关程度越大(=0时最低)
3,若X和Y不相关,Px,y=0,通常认为X和Y之间不存在线性关系
4,若X和Y独立,则必有Px,y=0,因而X和Y不相关;
5,若X和Y不相关,则仅仅是不存在线性关系,可能存在其他关系,如x2+y2=1,X和Y不独立。
6,因此,“不相关”是一个比“独立”要弱的概念。
xMat,yMat = get_Mat(ex0)
ws = standRegres(ex0)
yHat = xMat * ws
np.corrcoef(yHat.T, yMat.T)#保证两个都是行向量
>>>array([[1. , 0.98647356],
[0.98647356, 1. ]])
四,局部加权线性回归
原理
1,不同k值对应的高斯核
xMat,yMat = get_Mat(ex0)
x = 0.5
xi = np.arange(0,1.0,0.01)
# k 平滑参数
k1,k2,k3 = 0.5,0.1,0.01
# 不同k值所计算的权重(高斯核)
w1 = np.exp((xi-x)**2/(-2*k1**2))
w2 = np.exp((xi-x)**2/(-2*k2**2))
w3 = np.exp((xi-x