当前位置:   article > 正文

头歌机器学习实验 第7次实验 局部加权线性回归

头歌机器学习实验 第7次实验 局部加权线性回归

任务描述

本关任务:编写一个利用局部加权计算回归系数的小程序。

相关知识

为了完成本关任务,你需要掌握:1.局部加权算法的思想;2.局部加权的核心算法。

局部加权算法的思想

在局部加权算法中 ,我们给待预测点附近的每个点赋予一定的权重;然后与前面的类似,在这个子集上基于最小均方差来进行普通的回归。与kNN一样,这种算法每次预测均需要事先选取出对应的数据子集。 该算法解出回归系数w的形式如下:

,

其中w是一个矩阵,用来给每个数据点赋予权重。

局部加权的核心算法
 
  1. def lwlr(testPoint,xArr,yArr,k=1.0):
  2. xMat = np.mat(xArr); yMat = np.mat(yArr).T
  3. m = np.shape(xMat)[0]
  4. weights = np.mat(np.eye((m)))
  5. for j in range(m): #next 2 lines create weights matrix
  6. diffMat = testPoint - xMat[j,:] #difference matrix
  7. weights[j,j] = np.exp(diffMat*diffMat.T/(-2.0*k**2)) #weighted matrix
  8. xTx = xMat.T * (weights * xMat)
  9. if np.linalg.det(xTx) == 0.0:
  10. print ("This matrix is singular, cannot do inverse")
  11. return
  12. ws = xTx.I * (xMat.T * (weights * yMat)) #normal equation
  13. return testPoint * w

编程要求

根据提示,在右侧编辑器补充代码,利用局部加权计算回归系数。

测试说明

根据所学完成右侧编程题。

  1. from matplotlib.font_manager import FontProperties
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 加载数据
  5. def loadDataSet(fileName):
  6. """
  7. Parameters:
  8. fileName - 文件名
  9. Returns:
  10. xArr - x数据集
  11. yArr - y数据集
  12. """
  13. numFeat = len(open(fileName).readline().split('\t')) - 1
  14. xArr = []; yArr = []
  15. fr = open(fileName)
  16. for line in fr.readlines():
  17. lineArr =[]
  18. curLine = line.strip().split('\t')
  19. for i in range(numFeat):
  20. lineArr.append(float(curLine[i]))
  21. xArr.append(lineArr)
  22. yArr.append(float(curLine[-1]))
  23. return xArr, yArr
  24. # 使用局部加权线性回归计算回归系数w
  25. def lwlr(testPoint, xArr, yArr, k = 1.0):
  26. """
  27. Parameters:
  28. testPoint - 测试样本点
  29. xArr - x数据集
  30. yArr - y数据集
  31. k - 高斯核的k,自定义参数
  32. Returns:
  33. ws - 回归系数
  34. """
  35. xMat = np.mat(xArr); yMat = np.mat(yArr).T
  36. m = np.shape(xMat)[0]
  37. weights = np.mat(np.eye((m))) #创建权重对角矩阵
  38. for j in range(m): #遍历数据集计算每个样本的权重
  39. ##########
  40. diffMat = testPoint - xMat[j,:] #difference matrix
  41. weights[j,j] = np.exp(diffMat*diffMat.T/(-2.0*k**2)) #weighted matrix
  42. ##########
  43. xTx = xMat.T * (weights * xMat)
  44. if np.linalg.det(xTx) == 0.0:
  45. print("矩阵为奇异矩阵,不能求逆")
  46. return
  47. ws = xTx.I * (xMat.T * (weights * yMat)) #计算回归系数
  48. return testPoint * ws
  49. # 局部加权线性回归测试
  50. def lwlrTest(testArr, xArr, yArr, k=1.0):
  51. """
  52. Parameters:
  53. testArr - 测试数据集,测试集
  54. xArr - x数据集,训练集
  55. yArr - y数据集,训练集
  56. k - 高斯核的k,自定义参数
  57. Returns:
  58. ws - 回归系数
  59. """
  60. m = np.shape(testArr)[0] #计算测试数据集大小
  61. yHat = np.zeros(m)
  62. for i in range(m): #对每个样本点进行预测
  63. yHat[i] = lwlr(testArr[i],xArr,yArr,k)
  64. return yHat
  65. # 计算回归系数w
  66. def standRegres(xArr,yArr):
  67. """
  68. Parameters:
  69. xArr - x数据集
  70. yArr - y数据集
  71. Returns:
  72. ws - 回归系数
  73. """
  74. xMat = np.mat(xArr); yMat = np.mat(yArr).T
  75. xTx = xMat.T * xMat #根据文中推导的公示计算回归系数
  76. if np.linalg.det(xTx) == 0.0:
  77. print("矩阵为奇异矩阵,不能求逆")
  78. return
  79. ws = xTx.I * (xMat.T*yMat)
  80. return ws
  81. def rssError(yArr, yHatArr):
  82. """
  83. 误差大小评价函数
  84. Parameters:
  85. yArr - 真实数据
  86. yHatArr - 预测数据
  87. Returns:
  88. 误差大小
  89. """
  90. return ((yArr - yHatArr) **2).sum()
  91. if __name__ == '__main__':
  92. abX, abY = loadDataSet('./机器学习第8章/abalone.txt')
  93. print('训练集与测试集相同:局部加权线性回归,核k的大小对预测的影响:')
  94. yHat01 = lwlrTest(abX[0:99], abX[0:99], abY[0:99], 0.1)
  95. yHat1 = lwlrTest(abX[0:99], abX[0:99], abY[0:99], 1)
  96. yHat10 = lwlrTest(abX[0:99], abX[0:99], abY[0:99], 10)
  97. print('k=0.1时,误差大小为:',rssError(abY[0:99], yHat01.T))
  98. print('k=1 时,误差大小为:',rssError(abY[0:99], yHat1.T))
  99. print('k=10 时,误差大小为:',rssError(abY[0:99], yHat10.T))
  100. print('')
  101. print('训练集与测试集不同:局部加权线性回归,核k的大小是越小越好吗?更换数据集,测试结果如下:')
  102. yHat01 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 0.1)
  103. yHat1 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 1)
  104. yHat10 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 10)
  105. print('k=0.1时,误差大小为:',rssError(abY[100:199], yHat01.T))
  106. print('k=1 时,误差大小为:',rssError(abY[100:199], yHat1.T))
  107. print('k=10 时,误差大小为:',rssError(abY[100:199], yHat10.T))
  108. print('')
  109. print('训练集与测试集不同:简单的线性归回与k=1时的局部加权线性回归对比:')
  110. print('k=1时,误差大小为:', rssError(abY[100:199], yHat1.T))
  111. ws = standRegres(abX[0:99], abY[0:99])
  112. yHat = np.mat(abX[100:199]) * ws
  113. print('简单的线性回归误差大小:', rssError(abY[100:199], yHat.T.A))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/411630
推荐阅读
相关标签
  

闽ICP备14008679号