线性回归计算回归系数

"""
线性回归:
    优点:结果易于理解,计算上不复杂
    缺点:对非线性的数据拟合不好
    适用数据类型:数值型和标称型数据
    标称型数据:一般在有限的数据中取,而且只存在“是”和“否”两种不同的结果(一般用于分类)
    数值型数据:可以在无线的数据中取,而且数值比较具体化,例如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)


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值