《机器学习实战》线性回归python3源码

打开pycharm创建一个regression.py文件,输入如下代码:

#coding:utf-8

from numpy import *
seterr(divide='ignore',invalid='ignore')

"""------------------------普通线性回归------------------------------"""
def loadData(filename):
    # 打开一个用逗号“,”分隔的文本文件,该文件的第一列数值全为1.0,即设置X0=1.0。
    # 默认文件每行最后一个值是目标值,计算每行数据(非目标值)的个数numFeat
    # 该文本文件每行都需要有数据,若没有数据也会报错,所以不要用回车键在文本下面弄非常多的空格
    numFeat=len(open(filename).readline().split(','))-1
    print("每行非目标值的数据个数:",numFeat)
    dataMat=[];labelMat=[]
    fr=open(filename)
    for line in fr.readlines():
        lineArr=[]
        curline=line.strip('\n').split(',')
        for i in range(numFeat):
            lineArr.append(float(curline[i]))  #append是List的一个操作
        dataMat.append(lineArr)
        labelMat.append(float(curline[-1]))
    print("r1:",shape(labelMat))
    #print(labelMat)
    return dataMat,labelMat
    #dataMat,labelMat都是list类型,传给standRegression函数的两个形参xArr,yArr


def standRegression(xArr,yArr):
    #xArr,yArr都是List类型,xArr是多维的mat转置后就是一个矩阵,
    # 而yMAt是一维的list,mat后变成1*2的矩阵,必须转置一下变成列向量,因为y本身就是个列向量
    xMat=mat(xArr);yMat=mat(yArr).T
    xTx=xMat.T*xMat
    if linalg.det(xTx)==0.0:
        print("This matrix is singular,cannot do inverse")
        return
    ws=xTx.I*(xMat.T*yMat)
    return ws

"""--------------------------岭回归(正则化线性回归)---------------------------"""
def ridgeRegression(xMat,yMat,lam=0.2):
    xTx = xMat.T*xMat
    denom = xTx +eye(shape(xMat)[1])*lam  #lam就是兰木塔
    if linalg.det(denom) == 0:
        print("This matrix is singular,cannot do inverese")
        return
    ws = denom.I * (xMat.T*yMat)  #岭回归下求得的最佳回归系数ws
    return ws

def ridgeTest(xArr,yArr):
    xMat = mat(xArr); yMat = mat(yArr).T

    #数据标准化
    yMean = mean(yMat,0)
    yMat=(yMat-yMean) #yMat只有一列,不需要再除以方差
    xMeans=mean(xMat,0)
    xVar=var(xMat,0) #方差
    xMat=(xMat-xMeans)/xVar

    numTestPts=30
    wMat=zeros((numTestPts,shape(xMat)[1]))
    for i in range(numTestPts):
        ws=ridgeRegression(xMat,yMat,exp(i-10))
        #print(ws)
        wMat[i,:]=ws.T
    return wMat

重新创建一个python文件,用于调用regression.py文件中的函数并进行验证以及画出拟合的曲线

注释掉的代码并非错误,是运行时怕同一文件下相同变量名给出不同的定义而报错。

#coding:utf-8
from numpy import *
import regression  #导入regression这个已经写好的文件
import matplotlib.pyplot as plt

"""*********************普通线性回归拟合曲线********************************"""
xArr,yArr=regression.loadData("D:\PycharmProjects\exo.txt")
ws=regression.standRegression(xArr,yArr)

xMat=mat(xArr)
yMat=mat(yArr).T
print("r2:",shape(yMat))
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(xMat[:,3].flatten().A[0],yMat[:,0].flatten().A[0])

xCopy=xMat.copy()
xCopy.sort(0)
yHat=xCopy*ws
ax.plot(xCopy[:,3],yHat)
plt.show()

"""**************************岭回归lamda函数曲线***********************"""
# abX,abY=regression.loadData("D:\PycharmProjects\exo.txt")
# ridgeWeights=regression.ridgeTest(abX,abY)
# fig=plt.figure()
# ax=fig.add_subplot(111)
# ax.plot(ridgeWeights)
# ax.set_xlabel("log(lambda)")
# plt.show()


"""************************岭回归拟合曲线*************************"""

# xArr,yArr=regression.loadData("D:\PycharmProjects\exo.txt")
# xMat=mat(xArr)
# yMat=mat(yArr).T
# ws=regression.ridgeRegression(xMat,yMat)
#
# fig=plt.figure()
# ax=fig.add_subplot(111)
# ax.scatter(xMat[:,3].flatten().A[0],yMat[:,0].flatten().A[0])
#
# xCopy=xMat.copy()
# xCopy.sort(0)
# yHat=xCopy*ws
# ax.plot(xCopy[:,3],yHat)
#
# plt.show()

猜你喜欢

转载自blog.csdn.net/jiangsujiangjiang/article/details/83713758
今日推荐