Regression算法

简介: Regression算法

用线性回归找到最佳拟合直线

from google.colab import drive
drive.mount("/content/drive")
Mounted at /content/drive
from numpy import *
def loadDataSet(fileName):
  numFeat = len(open(fileName).readline().split('\t')) - 1
  dataMat = []
  labelMat = []
  fr = open(fileName)
  for line in fr.readlines():
    lineArr = []
    curLine = line.strip().split('\t')
    for i in range(numFeat):
      lineArr.append(float(curLine[i]))
    dataMat.append(lineArr)
    labelMat.append(float(curLine[-1]))
  return dataMat, labelMat

这段代码定义了一个名为loadDataSet的函数,用于加载数据集并将其分为特征矩阵和标签向量。以下是对该函数的代码分析:

def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split('\t')) - 1
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat, labelMat

1.numFeat = len(open(fileName).readline().split('\t')) - 1


通过打开文件并读取第一行,计算特征的数量。这里假设数据集是用 tab 分隔的文本文件,每一行的最后一个元素是标签。

2.dataMat = [] 和 labelMat = []


创建空列表,用于存储特征矩阵和标签向量。

3.fr = open(fileName)


打开文件以供读取。

4.for line in fr.readlines():


遍历文件的每一行。

5.lineArr = []


创建一个空列表,用于存储每行的特征数据。

curLine = line.strip().split('\t')


去除行首尾的空白符,然后按制表符分割字符串,得到当前行的特征和标签。

6.for i in range(numFeat):


遍历特征的数量。

7.lineArr.append(float(curLine[i]))


将当前行的特征值转换为浮点数并添加到 lineArr 中。

8.dataMat.append(lineArr) 和 labelMat.append(float(curLine[-1]))


将特征数据添加到 dataMat 列表中,将标签值添加到 labelMat 列表中。

9.return dataMat, labelMat


返回特征矩阵和标签向量作为元组。

该函数的作用是从文件中读取数据集,并将其分为特征矩阵和标签向量。

标准回归函数

def standRegres(xArr, yArr):
  xMat = mat(xArr)
  yMat = mat(yArr).T
  xTx = xMat.T * xMat
  if linalg.det(xTx) == 0:
    print("This matrix is singular, cannot do inverse")
    return
  ws = xTx.I * (xMat.T * yMat)
  return ws

这段代码是用于实现普通最小二乘线性回归(OLS)的 Python 函数。下面是对函数的代码分析:


1.def standRegres(xArr, yArr):


函数的定义,它接受两个参数:xArr是一个列表或数组,包含输入特征的数据集;yArr是一个列表或数组,包含对应的目标变量值。

2.xMat = mat(xArr)


将输入特征数据集转换为一个 NumPy 矩阵。

3.yMat = mat(yArr).T


将目标变量数据集转换为一个 NumPy 矩阵,并且将其转置,以确保其为列向量。

4.xTx = xMat.T * xMat


计算特征数据矩阵的转置与其自身的乘积。这是用来计算线性回归系数的一个步骤。

5.if linalg.det(xTx) == 0:


使用线性代数库(linalg)中的det()函数计算矩阵xTx的行列式(Determinant)。如果行列式为0,则说明矩阵不可逆(singular),这种情况下无法求解线性回归,因此打印错误消息并返回。

6.ws = xTx.I * (xMat.T * yMat)


如果矩阵可逆,那么使用矩阵的逆(I)乘以特征矩阵转置与目标变量矩阵的乘积来计算回归系数(weights)。

7.return ws


返回计算得到的回归系数。

该函数实现了基本的线性回归,通过计算输入特征与目标变量之间的关系,得出一个线性模型,用于预测目标变量的值。

xArr, yArr = loadDataSet('/content/drive/MyDrive/Colab Notebooks/MachineLearning/《机器学习实战》/06丨预测数值型数据:回归/用线性回归找到最佳拟合直线/ex0.txt')
xArr[:2]
[[1.0, 0.067732], [1.0, 0.42781]]
ws = standRegres(xArr, yArr)
ws
matrix([[3.00774324],
        [1.69532264]])
xMat = mat(xArr)
yMat = mat(yArr)
yHat = xMat * ws
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xMat[:,1].flatten().A[0], yMat.T[:,0].flatten().A[0])
xCopy = xMat.copy()
xCopy.sort(0)
yHat = xCopy*ws
ax.plot(xCopy[:,1], yHat)
plt.show()

yHat = xMat*ws
yHat.shape
(200, 1)
yMat.shape
(1, 200)
corrcoef(yHat.T, yMat)
array([[1.        , 0.98647356],
       [0.98647356, 1.        ]])

局部加权线性回归函数

def lwlr(testPoint, xArr, yArr, k=1.0):
  xMat = mat(xArr)
  yMat = mat(yArr).T
  m = shape(xMat)[0]
  weights = mat(eye(m))
  for j in range(m):
    diffMat = testPoint - xMat[j, :]
    weights[j, j] = exp(diffMat*diffMat.T/(-2.0*k**2))
  xTx = xMat.T * (weights * xMat)
  if linalg.det(xTx) == 0.0:
    print("This matrix is singular, cannot do inverse")
    return
  ws = xTx.I * (xMat.T * (weights * yMat))
  return testPoint * ws

这段代码实现了局部加权线性回归(Locally Weighted Linear Regression,LWLR)的函数。以下是对该函数的代码分析:


def lwlr(testPoint, xArr, yArr, k=1.0):


函数的定义,它接受四个参数:testPoint是待预测的数据点;xArr是一个列表或数组,包含输入特征的数据集;yArr是一个列表或数组,包含对应的目标变量值;k是一个可选参数,控制权重的带宽,默认为1.0。

xMat = mat(xArr)


将输入特征数据集转换为一个 NumPy 矩阵。

yMat = mat(yArr).T


将目标变量数据集转换为一个 NumPy 矩阵,并且将其转置,以确保其为列向量。

m = shape(xMat)[0]


获取输入特征矩阵的行数,即数据集中样本的数量。

weights = mat(eye(m))


创建一个单位矩阵作为权重矩阵,其大小为m × m m \times mm×m,其中m mm为数据集中样本的数量。

for j in range(m):


遍历数据集中的每个样本。

diffMat = testPoint - xMat[j, :]


计算测试点与当前样本之间的差值。

weights[j, j] = exp(diffMat*diffMat.T/(-2.0*k**2))


计算当前样本的权重,利用高斯核函数,其中 e x p expexp 是指数函数,k kk 是带宽参数。

xTx = xMat.T * (weights * xMat)


计算加权的特征矩阵的转置与自身的乘积。

if linalg.det(xTx) == 0.0:


检查加权特征矩阵的行列式是否为0,如果是则无法求逆,打印错误消息并返回。

ws = xTx.I * (xMat.T * (weights * yMat))


如果加权特征矩阵可逆,那么使用矩阵的逆(I)乘以加权特征矩阵转置与目标变量矩阵的乘积来计算回归系数。

return testPoint * ws


返回测试点与计算得到的回归系数的乘积,即用局部加权线性回归模型对测试点进行预测。


该函数实现了局部加权线性回归,它对于每个测试点都会根据其附近的数据点赋予不同的权重,以更好地拟合局部数据。

def lwlrTest(testArr, xArr, yArr, k=1.0):
  m = shape(testArr)[0]
  yHat = zeros(m)
  for i in range(m):
    yHat[i] = lwlr(testArr[i], xArr, yArr, k)
  return yHat
xArr, yArr = loadDataSet('/content/drive/MyDrive/Colab Notebooks/MachineLearning/《机器学习实战》/06丨预测数值型数据:回归/用线性回归找到最佳拟合直线/ex0.txt')
yArr[0]
3.176513
lwlr(xArr[0], xArr, yArr, 1.0)
<ipython-input-27-f0eaaa458f3a>:8: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
  weights[j, j] = exp(diffMat*diffMat.T/(-2.0*k**2))

matrix([[3.12204471]])
lwlr(xArr[0], xArr, yArr, 0.001)
<ipython-input-27-f0eaaa458f3a>:8: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
  weights[j, j] = exp(diffMat*diffMat.T/(-2.0*k**2))

matrix([[3.20175729]])
yHat = lwlrTest(xArr, xArr, yArr, 0.01)
<ipython-input-27-f0eaaa458f3a>:8: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
  weights[j, j] = exp(diffMat*diffMat.T/(-2.0*k**2))
<ipython-input-28-3481d8d2a021>:5: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
  yHat[i] = lwlr(testArr[i], xArr, yArr, k)
xMat = mat(xArr)
srtInd = xMat[:,1].argsort(0)
xSort = xMat[srtInd][:,0,:]
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xSort[:,1], yHat[srtInd])
ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0], s=2, c='red')
plt.show()

目录
相关文章
|
机器学习/深度学习 算法
线性回归(Linear regression)算法
属于有监督学习、判别模型、有预测函数、有优化目标,有优化求解算法
266 0
|
机器学习/深度学习 算法
ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图
ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图
ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图
|
机器学习/深度学习 算法 搜索推荐
深入理解逻辑回归算法(Logistic Regression)
在继续学习 GBDT(Gradient Boosting Decision Tree) 决策树前,我们需要先来了解下逻辑回归算法(Logistic Regression),因为 GBDT 较为复杂,但在逻辑回归的基础上,理解起来会容易些。 逻辑回归是机器学习中最为基础的算法,也是工业界使用得最多的算法之一,究其原因,在于其简单、高效以及实用。 虽然线性回归也很简单,但却不实用,是因
|
算法
Logistic Regression 分类算法
<div style="margin:0px; padding:0px; border:0px; line-height:1.6; font-family:'Helvetica Neue',Arial,'Hiragino Sans GB',STHeiti,'Microsoft YaHei','WenQuanYi Micro Hei',SimSun,Song,sans-serif; font
1537 0
|
1天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
4天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
19 6
|
1天前
|
缓存 算法
基于机会网络编码(COPE)的卫星网络路由算法matlab仿真
**摘要:** 该程序实现了一个基于机会网络编码(COPE)的卫星网络路由算法,旨在提升无线网络的传输效率和吞吐量。在MATLAB2022a中测试,结果显示了不同数据流个数下的网络吞吐量。算法通过Dijkstra函数寻找路径,计算编码机会(Nab和Nx),并根据编码机会减少传输次数。当有编码机会时,中间节点执行编码和解码操作,优化传输路径。结果以图表形式展示,显示数据流与吞吐量的关系,并保存为`R0.mat`。COPE算法预测和利用编码机会,适应卫星网络的动态特性,提高数据传输的可靠性和效率。
|
4天前
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。