打开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()