"""
线性回归:
优点:结果易于理解,计算上不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型数据
标称型数据:一般在有限的数据中取,而且只存在“是”和“否”两种不同的结果(一般用于分类)
数值型数据:可以在无线的数据中取,而且数值比较具体化,例如4.02, 6.23这种值(一般用于回归分析)
回归的一般方法:
1收集数据:采用任意方法收集数据
2准备数据:回归需要数值型数据,标称型数据将被转换成二值型数据
3分析数据:会出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归系数之后,可以将新拟合线绘在图上作为对比
4训练算法:找到回归系数
5测试算法:使用R^2或者预测值和数据的拟合度,来分析模型的效果
6使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签
"""
from numpy import *
def loadDataSet(fileName):
"""
该函数打开一个用tab键分隔的文本文件,这里仍然默认文件每行的最后一个值是目标值
readline():该方法每次读取一行内容,所以读取时占用内存小,比较适合大文件,该方法返回一个字符串对象
readlines():该方法读取整个文件的所有行,保存在一个列表变量中,每行作为一个元素,但读取大文件比较占用内存
该函数第一个返回值返回列表中的自变量第一列和第二列, 第二个返回值返回结果,最后一列
:param fileName:
:return:
"""
numFeat = len(open(fileName).readline().split("\t")) - 1
dataMat = []
labelMat = []
fr = open(fileName)
for line in fr.readlines(): # readlines()读取整个文件保存在列表变量中
lineArr = []
curLine = line.strip().split("\t") # strip()返回移除字符串头尾制定的字符生成的新字符串, split():通过指定分隔符对字符串进行切片 curLine:每一行元素切分成的列表
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat, labelMat
def standRegres(xArr, yArr):
"""
该函数用来计算最佳拟合直线,函数首先读入x和y,并将他们保存到矩阵中,然后计算x的转置与x的乘积
然后判断他的行列式是否为零,如果行列式为零,那么计算逆矩阵就会出现错误NumPy提供一个线性代数
的库linalg,可以通过linalg.det()来计算行列式,最后,如果行列式非零,计算并返回w
:param xArr:
:param yArr:
:return:
"""
xMat = mat(xArr) # 列表类型转换为矩阵类型
yMat = mat(yArr).T
xTx = xMat.T * xMat # 求x的转置与x相乘的结果
# 判断矩阵的行列式是否为零,如果为零,则无法计算逆矩阵
if linalg.det(xTx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T * yMat) # xTx.I 为xTx的逆,计算得出未知量的系数
return ws
if __name__ == '__main__':
xArr, yArr = loadDataSet("ex0.txt")
ws = standRegres(xArr, yArr)
print(ws)
线性回归计算回归系数
最新推荐文章于 2024-05-23 23:21:46 发布