这部分由于书上提供的Google的购物API已经关闭,所以只能在实验楼上完成了这个实验(这一次,我只是代码的搬运工)

完整的代码及注释:

#-*- coding: utf-8 -*-
from numpy import *
from BeautifulSoup import BeautifulSoup# 从页面读取数据,生成retX和retY列表
def scrapePage(retX, retY, inFile, yr, numPce, origPrc):# 打开并读取HTML文件fr = open(inFile);soup = BeautifulSoup(fr.read())i=1# 根据HTML页面结构进行解析currentRow = soup.findAll('table', r="%d" % i)while(len(currentRow)!=0):currentRow = soup.findAll('table', r="%d" % i)title = currentRow[0].findAll('a')[1].textlwrTitle = title.lower()# 查找是否有全新标签if (lwrTitle.find('new') > -1) or (lwrTitle.find('nisb') > -1):newFlag = 1.0else:newFlag = 0.0# 查找是否已经标志出售,我们只收集已出售的数据soldUnicde = currentRow[0].findAll('td')[3].findAll('span')if len(soldUnicde)==0:print "item #%d did not sell" % ielse:# 解析页面获取当前价格soldPrice = currentRow[0].findAll('td')[4]priceStr = soldPrice.textpriceStr = priceStr.replace('$','') #strips out $priceStr = priceStr.replace(',','') #strips out ,if len(soldPrice)>1:priceStr = priceStr.replace('Free shipping', '')sellingPrice = float(priceStr)# 去掉不完整的套装价格if  sellingPrice > origPrc * 0.5:print "%d\t%d\t%d\t%f\t%f" % (yr,numPce,newFlag,origPrc, sellingPrice)retX.append([yr, numPce, newFlag, origPrc])retY.append(sellingPrice)i += 1currentRow = soup.findAll('table', r="%d" % i)# 依次读取六种乐高套装的数据,并生成数据矩阵
def setDataCollect(retX, retY):scrapePage(retX, retY, '/home/shiyanlou/mylab10/setHtml/lego8288.html', 2006, 800, 49.99)scrapePage(retX, retY, '/home/shiyanlou/mylab10/setHtml/lego10030.html', 2002, 3096, 269.99)scrapePage(retX, retY, '/home/shiyanlou/mylab10/setHtml/lego10179.html', 2007, 5195, 499.99)scrapePage(retX, retY, '/home/shiyanlou/mylab10/setHtml/lego10181.html', 2007, 3428, 199.99)scrapePage(retX, retY, '/home/shiyanlou/mylab10/setHtml/lego10189.html', 2008, 5922, 299.99)scrapePage(retX, retY, '/home/shiyanlou/mylab10/setHtml/lego10196.html', 2009, 3263, 249.99)# 计算给定lambda值得回归系数
def ridgeRegres(xMat,yMat,lam=0.2):# 使用矩阵运算实现146页的回归系数计算公式xTx = xMat.T*xMatdenom = xTx + eye(shape(xMat)[1])*lam# 判断是否为奇异矩阵if linalg.det(denom) == 0.0:print "This matrix is singular, cannot do inverse"returnws = denom.I * (xMat.T*yMat)return ws# 计算回归系数矩阵
def ridgeTest(xArr,yArr):# 初始化X和Y矩阵xMat = mat(xArr); yMat=mat(yArr).T# 对X和Y矩阵进行标准化# 计算所有特征的均值yMean = mean(yMat,0)# 特征值减去各自的均值yMat = yMat - yMean# 标准化X矩阵数据# 获得均值xMeans = mean(xMat,0)# 获得方差xVar = var(xMat,0)# 标准化方法:减去均值除以方差xMat = (xMat - xMeans)/xVar# 计算回归系数30次numTestPts = 30wMat = zeros((numTestPts,shape(xMat)[1]))for i in range(numTestPts):ws = ridgeRegres(xMat,yMat,exp(i-10))wMat[i,:]=ws.Treturn wMat# 交叉验证测试岭回归
def crossValidation(xArr,yArr,numVal=10):# 获得数据点个数,xArr和yArr具有相同长度m = len(yArr)indexList = range(m)errorMat = zeros((numVal,30))# 主循环 交叉验证循环for i in range(numVal):# 随机拆分数据,将数据分为训练集(90%)和测试集(10%)trainX=[]; trainY=[]testX = []; testY = []# 对数据进行混洗操作random.shuffle(indexList)# 切分训练集和测试集for j in range(m):if j < m*0.9: trainX.append(xArr[indexList[j]])trainY.append(yArr[indexList[j]])else:testX.append(xArr[indexList[j]])testY.append(yArr[indexList[j]])# 获得回归系数矩阵wMat = ridgeTest(trainX,trainY)# 循环遍历矩阵中的30组回归系数for k in range(30):# 读取训练集和数据集matTestX = mat(testX); matTrainX=mat(trainX)# 对数据进行标准化meanTrain = mean(matTrainX,0)varTrain = var(matTrainX,0)matTestX = (matTestX-meanTrain)/varTrain# 测试回归效果并存储yEst = matTestX * mat(wMat[k,:]).T + mean(trainY)# 计算误差errorMat[i,k] = ((yEst.T.A-array(testY))**2).sum()# 计算误差估计值的均值meanErrors = mean(errorMat,0)minMean = float(min(meanErrors))bestWeights = wMat[nonzero(meanErrors==minMean)]# 不要使用标准化的数据,需要对数据进行还原来得到输出结果xMat = mat(xArr); yMat=mat(yArr).TmeanX = mean(xMat,0); varX = var(xMat,0)unReg = bestWeights/varX# 输出构建的模型print "the best model from Ridge Regression is:\n",unRegprint "with constant term: ",-1*sum(multiply(meanX,unReg)) + mean(yMat)lgX = []
lgY = []setDataCollect(lgX, lgY)
crossValidation(lgX, lgY, 10)

亲测有效

机器学习实战——ch8.2 回归之预测乐高玩具价格相关推荐

  1. 《机器学习实战》8.4 线性回归之乐高玩具套件二手交易价格预测

    <机器学习实战>8.4 线性回归之乐高玩具套件二手交易价格预测 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https: ...

  2. 《机器学习实战》——线性回归提高篇之乐高玩具套件二手价预测

    一.前言 本篇文章讲解线性回归的缩减方法,岭回归以及逐步线性回归,同时熟悉sklearn的岭回归使用方法,对乐高玩具套件的二手价格做出预测. 二.岭回归 如果数据的特征比样本点还多应该怎么办?很显然, ...

  3. “机器学习实战”刻意练习——回归问题:线性回归(最小二乘、岭回归、逐步回归)

    参考: Python3<机器学习实战>学习笔记(十一):线性回归基础篇之预测鲍鱼年龄 - Jack-Cui Python3<机器学习实战>学习笔记(十二):线性回归提高篇之乐高 ...

  4. 机器学习实战_09_树回归_源代码错误修正

    <机器学习实战>第9章的树回归运行时频繁出错,这里主要有两点: 1. TypeError: unhashable type: 'matrix' 出错的代码行是: for splitVal ...

  5. 机器学习实战之Logistic回归

    本系列教程特点: 基于<机器学习实战> 尽量避免讲太多数学公式,通过简单直白的方式讲解各算法的原理 对于算法实现的代码进行详细讲解 哪些读者可以食用: 了解机器学习的基本术语 会Pytho ...

  6. logistic回归分析优点_机器学习实战项目-Logistic回归

    Logistic 回归 概述 Logistic 回归虽然名字叫回归,但是它是用来做分类的.其主要思想是: 根据现有数据对分类边界线建立回归公式,以此进行分类. 须知概念 Sigmoid 函数 回归 概 ...

  7. 机器学习实战:逻辑回归(2)-从疝气病症预测病马的死亡率

    1.准备数据:处理数据中的缺失值 可选的做法: 使用可用特征的均值来填补缺失值: 使用特殊值来填补缺失值,如-1: 忽略有缺失值的样本: 使用相似样本的均值添补缺失值: 使用另外的机器学习算法预测缺失 ...

  8. 机器学习实战之Logistic回归(四)从疝气病症状预测病马的死亡率(含数据集)

    Logistic回归(三)从疝气病症状预测病马的死亡率(含数据集) 准备 准备数据:处理数据中的缺失值 训练算法:使用优化算法,找到最佳系数 测试算法:用Logistic回归进行分类 转载请注明作者和 ...

  9. 机器学习实战(入门级) ------ Kaggle 泰坦尼克号幸存者预测 (随机森林,KNN,SVM)

    文章目录 前言 数据集介绍 gender_submision.csv: train.csv: test.csv 数据清洗 数据预处理 缺失值填充 数据优化 训练过程 SVM 完整代码 KNN K-Me ...

最新文章

  1. MSSQL - 因为数据库正在使用,所以无法获得对数据库的独占访问权。
  2. win7映射网络驱动器消失了_驱动器出现问题怎么办_Win7系统映射网络驱动器出现故障如何解决...
  3. /etc/fstab自动挂载文件详解
  4. 安卓实训项目源码_综合性项目:在线学习考试系统
  5. 【转载】Instagram架构分析笔记
  6. Element表格嵌入复选框以及单选框
  7. 找到一个或多个多重定义的符号_初中数学之相反数,总结规律,学会多重符号的化简...
  8. 一文告诉你雾计算与云计算的区别及对物联网的价值!
  9. 字符串单词翻转c语言,C语言反转一行字符串单词示例
  10. 使用 CodeIgniter 框架快速开发 PHP 应用(四)
  11. 第二届蓝桥杯省赛---夺冠概率
  12. 栈的应用实例——平衡符号
  13. python将xml文件转换成excel文件
  14. 步进电机工作原理 驱动 _28BYJ-48 以及程序实例下载
  15. 香农编码的gui编码_1、香农编码方法
  16. 安装虚拟机后无法获取 vmci 驱动程序版本句柄无效解决方法!
  17. 奥布莱恩杯尘埃落定 人工智能立功了!
  18. JSON.stringify(value[, replacer[, space]])中三个参数详解
  19. linux下录音识别成文字软件下载,录音转文字分享助手
  20. 努力和家境哪个更重要

热门文章

  1. ixwebhosting空间商介绍
  2. IXwebhosting怎样主机避免资源超标
  3. 糖葫芦不做了,我们来跳一跳吧 O(∩_∩)O~~ PCA + 截断 SVD (含 python 实现及代码细节梳理)
  4. 孩子数学成绩不好怎么办_孩子数学成绩不好,家长想很多办法却没有效果,怎么办?...
  5. AtCoder Beginner Contest 260 A~F 题解
  6. AtCoder Beginner Contest 254
  7. MsgPack/Json性能数据
  8. 如何使用正则做文本数据的清洗(文章内有福利)
  9. 教你怎么用IPHONE
  10. 【Java面试】异常常见面试题