《3901130721-谭淇蔚-电子商务实验4.docx》由会员分享,可在线阅读,更多相关《3901130721-谭淇蔚-电子商务实验4.docx(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、电子商务应用实验报告项目名称 电子商务数据挖掘实验专业班级 软件工程1307班学 号 3901130721 姓 名 谭淇蔚 实验成绩:批阅教师:2015年 11月25 日实验4电子商务数据挖掘实验实验学时: 2 每组人数: 1 实验类型: 2 (1:基础性 2:综合性 3:设计性 4:研究性)实验要求: 1 (1:必修 2:选修 3:其它)实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它)一、实验目的1. 加深对数据挖掘概念和主要任务的理解。2. 研究并学习几种常用的关联分析算法、分类算法、聚类算法和异常检测方法,了解它们的实现原理以及在电子商务中的应用。3. 研究并学习几种常用的
2、个性化商品或信息推荐方法,并结合选题设计一个简单的商品或信息推荐模型。二、实验内容1. 研究并学习两种常用的关联分析算法的实现原理并编程实现其中一种,编程语言不限。2. 研究并学习两种常用的分类算法的实现原理并编程实现其中一种,编程语言不限。3. 研究并学习两种常用的聚类算法的实现原理并编程实现其中一种,编程语言不限。4. 研究并学习两种常用的异常检测方法的实现原理。5. 研究并学习两种常用的个性化商品或信息推荐方法,了解其实现原理和特点。6. 结合选题,设计一个简单的商品或信息推荐模型。【注意:模型不一定要很复杂,关键是要能够说明其合理性,鼓励大家创新。以下两种商品推荐模型(信息推荐模型思路
3、相似)基本思想供参考,也可在此基础上进行改进: 分析用户的购买记录,找出他经常购买的商品的类型,然后在该类型中找出购买量或者访问量最大但是该买家之前并未购买的商品,并将这些商品推荐给该用户。 找出与该用户具有相似购物习惯的其他用户,例如他们曾经购买过一些相同的商品,然后将其他用户购买过但是该用户未曾购买的商品推荐给他。】三、实验要求1. 研究两种常用的关联分析算法,填写相应的表格,表格必须填写完整,任选一种编程语言实现其中的一种算法,要求提供详细源代码;2. 研究两种常用的分类算法,填写相应的表格,表格必须填写完整,任选一种编程语言实现其中的一种算法,要求提供详细源代码;3. 研究两种常用的聚
4、类算法,填写相应的表格,表格必须填写完整,任选一种编程语言实现其中的一种算法,要求提供详细源代码;4. 研究两种常用的异常检测方法,填写相应的表格,表格必须填写完整;5. 研究两种常用的个性化商品或信息推荐方法,填写相应的表格,表格必须填写完整;6. 结合选题,设计一个简单的商品或信息推荐模型,要求详细说明其实现过程,包括公式、流程等,但无需编程实现。四、实验步骤1. 通过使用搜索引擎并查阅相关资料,研究并整理两种常用的关联分析算法,填写相应的表格并选择一种编程实现;2. 通过使用搜索引擎并查阅相关资料,研究并整理两种常用的分类算法,填写相应的表格并选择一种编程实现;3. 通过使用搜索引擎并查
5、阅相关资料,研究并整理两种常用的聚类算法,填写相应的表格并选择一种编程实现;4. 通过使用搜索引擎并查阅相关资料,研究并整理两种常用的异常检测方法,填写相应的表格;5. 通过使用搜索引擎并查阅相关资料,研究并整理两种常用的电子商务个性化商品或信息推荐方法,填写相应的表格;6. 结合选题,设计一个简单的商品或信息推荐模型。五、实验结果1. 研究并整理两种常用的关联分析算法,编程实现其中一种,填写如下表格:关联分析算法名称实现原理关联分析算法名称:XXX算法/核心实现代码解:关联分析算法名称实现原理Apriori算法1. 第一个关联规则挖掘算法2. 频繁项集的子集也一定是频繁的,如果A,B 是频繁
6、项集,则 A和B 也一定是频繁项集3. 从1到k(k项集)递归查找频繁项集4. 用得到的频繁项集生成关联规则5. Apriori算法的两个输入参数分别是最小支持度和数据集。该算法首先会生成所有单个元素的项集列表。接着扫描数据集来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。蛮力法1. d个项,将产生2d个候选项集2. 总项集个数为2d3. 关联规则的总个数为R=k=1d-1dk j=1d-kd-kj=3d-2d+1+14. 当d
7、=6时,关联规则R的个数为6025. 目标找出所有的频繁项集关联分析算法名称:Apriori算法/核心实现代码#-*- encoding: UTF-8 -*-#-import-#-python代码实现-#-class Apriori(object): def _init_(self, filename, min_support, item_start, item_end): self.filename = filename self.min_support = min_support # 最小支持度 self.min_confidence = 50 self.line_num = 0 # it
8、em的行数 self.item_start = item_start # 取哪行的item self.item_end = item_end self.location = i for i in range(self.item_end - self.item_start + 1) self.support = self.sut(self.location) self.num = list(sorted(set(j for i in self.location for j in i)# 记录item self.pre_support = # 保存前一个support,location,num s
9、elf.pre_location = self.pre_num = self.item_name = # 项目名 self.find_item_name() self.loop() self.confidence_sup() def deal_line(self, line): 提取出需要的项 return i.strip() for i in line.split( ) if iself.item_start - 1:self.item_end def find_item_name(self): 根据第一行抽取item_name with open(self.filename, r) as
10、F: for index,line in enumerate(F.readlines(): if index = 0: self.item_name = self.deal_line(line) break def sut(self, location): 输入1,2,3,2,3,4,1,3,5. 输出每个位置集的support 123,435,234. with open(self.filename, r) as F: support = 0 * len(location) for index,line in enumerate(F.readlines(): if index = 0: co
11、ntinue # 提取每信息 item_line = self.deal_line(line) for index_num,i in enumerate(location): flag = 0 for j in i: if item_linej != T: flag = 1 break if not flag: supportindex_num += 1 self.line_num = index # 一共多少行,出去第一行的item_name return support def select(self, c): 返回位置 stack = for i in self.location: fo
12、r j in self.num: if j in i: if len(i) = c: stack.append(i) else: stack.append(j + i) # 多重列表去重 import itertools s = sorted(sorted(i) for i in stack) location = list(s for s,_ in itertools.groupby(s) return location def del_location(self, support, location): 清除不满足条件的候选集 # 小于最小支持度的剔除 for index,i in enu
13、merate(support): if i self.min_confidence: print ,.join(s) , - , self.item_nameeach_locationindex , min_support: , str(support) + % , min_confidence: , str(confidence) + %def main(): c = Apriori(basket.txt, 14, 3, 13) d = Apriori(simple.txt, 50, 2, 6)if _name_ = _main_:main()“”filename:(路径)文件名min_su
14、pport:最小支持度item_start:item起始位置item_end:item结束位置“”2. 研究并整理两种常用的分类算法,编程实现其中一种,填写如下表格:分类算法名称实现原理分类算法名称:XXX算法/核心实现代码解:分类算法名称实现原理KNN(K最近邻法)设有c个类为w1, , wi, wc,每类有Ni个样本 (i = 1c),则第i类i的判别函数为gix=minix-xik,k=1,2,N|.|表示距离或相似度(通常用欧氏距离)如果gix=minigi(x)那么决策xil 设有N个样本分布到c个类为w1, , wi, wc,每类有Ni个样本,i=1c。在全部样本找出k个最近距离的
15、近邻, k个近邻分布于c个类中数目用ki表示。k近邻的判别函数为:gix=ki,i=1,2,.,,cl 决策规则:如果gjx=argmaxiki那么决策xj向量空间模型(Vector Space Model, VSM)分类VSM概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,直观易懂。当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。M个无序特征项ti,词根/词/短语/其他每个文档dj可以用特征项向量来表示(a1j,a2j,aMj)权重计算,N个训练文档AM*N= (ai
16、j) 文档相似度比较1)Cosine计算,余弦计算的好处是,正好是一个介于0到1的数,如果向量一致就是1,如果正交就是0,符合相似度百分比的特性,余弦的计算方法为,向量内积/各个向量的模的乘积.2)内积计算,直接计算内积,计算强度低,但是误差大。向量空间模型 (或词组向量模型) 是一个应用于信息过滤,信息撷取,索引 以及评估相关性的代数模型。SMART是首个使用这个模型的信息检索系统。文件(语料)被视为索引词(关键词)形成的多次元向量空间, 索引词的集合通常为文件中至少出现过一次的词组。搜寻时,输入的检索词也被转换成类似于文件的向量,这个模型假设,文件和搜寻词的相关程度,可以经由比较每个文件(
17、向量)和检索词(向量)的夹角偏差程度而得知。实际上,计算夹角向量之间的余弦比直接计算夹角容易:余弦为零表示检索词向量垂直于文件向量,即没有符合,也就是说该文件不含此检索词。通过上述的向量空间模型,文本数据就转换成了计算机可以处理的结构化数据,两个文档之间的相似性问题转变成了两个向量之间的相似性问题。分类算法名称:KNN(K最近邻法)/核心实现代码pythonfrom numpy import *import operatorclass KNN: def createDataset(self): group = array(1.0,1.1,1.0,1.0,0,0,0,0.1) labels =
18、A,A,B,B return group,labels def KnnClassify(self,testX,trainX,labels,K): N,M=trainX.shape #calculate the distance between testX and other training samples difference = tile(testX,(N,1) - trainX # tile for array and repeat for matrix in Python, = repmat in Matlab difference = difference * 2 # take po
19、w(difference,2) distance = difference.sum(1) # take the sum of difference from all dimensions distance = distance * 0.5 sortdiffidx = distance.argsort() # find the k nearest neighbours vote = #create the dictionary for i in range(K): ith_label = labelssortdiffidxi; voteith_label = vote.get(ith_label
20、,0)+1 #get(ith_label,0) : if dictionary vote exist key ith_label, return voteith_label; else return 0 sortedvote = sorted(vote.iteritems(),key = lambda x:x1, reverse = True) # key = lambda x: x1 can be substituted by operator.itemgetter(1) return sortedvote00k = KNN() #create KNN objectgroup,labels
21、= k.createDataset()cls = k.KnnClassify(0,0,group,labels,3)print cls3. 研究并整理两种常用的聚类算法,编程实现其中一种,填写如下表格:聚类算法名称实现原理聚类算法名称:XXX算法/核心实现代码解:聚类算法名称实现原理K-means算法(K均值算法)1. 首先,随机选择K个点做为聚类中心2. 然后,计算其它点到这些聚类中心点的距离,通过对簇中距离平均值的计算,不断改变这些聚类中心的位置,直到这些聚类中心不再变化为止CURE算法采用凝聚聚类,在最开始的时候,每个对象属于独立的簇。然后从最相似的对象进行合并,为了能够处理大数据,CU
22、RE采用随机抽样和分割的技术来降低数据的量。CURE采用多个对象代表一个簇,并通过收缩因子来调整簇的形状。消除异常值的影响(分两个阶段完成,刚开始进行最相似对象合并,由于异常值的距离很大,所以其所在的类的结点数量增长很慢,接下来在聚类快要结束的时候,将增长慢的簇当中异常值去掉)。CURE聚类完成后只包含样本的数据,之后还得采取某种策略将非样本的数据加入到聚类中聚类算法名称:K-means算法/核心实现代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.JFrame;import
23、javax.swing.JPanel;import java.util.Random;import java.applet.*;class PaintovalPane extends JPanel /*K-Means*/ int K = 5; /K个中心 int N = 50; /N个点 int D = 2; /二维元素 Random rand = new Random(); class Point Point() initial(); void initial() /*初始化为0,600)的随机点,簇编号为-1,无意义*/ for (int i = 0; i D; +i) xi = rand
24、.nextDouble()*600; clusterNum = -1; double x = new doubleD; /坐标 int clusterNum; /簇编号 ; Point p; /数据点 Point centroid; /中心点 Point oldCentroid; /上一次的中心点,用于确定中心点是否不再改变 Color colors; /表示不同簇的颜色值 /*欧式距离*/ double Euclidean(Point p1, Point p2) double dis = 0; for (int i = 0; i D; +i) dis += (p1.xi-p2.xi)*(p1
25、.xi-p2.xi); return Math.sqrt(dis); /*更新中心点*/ void updateCentroid(int clusterNum) for (int i = 0; i D; +i) centroidclusterNum.xi = 0; int clusterSize = 0; for (int i = 0; i N; +i) if (pi.clusterNum = clusterNum) clusterSize+; for (int j = 0; j D; +j) centroidclusterNum.xj += pi.xj; if (clusterSize =
26、0) return; for (int i = 0; i D; +i) centroidclusterNum.xi /= (double)clusterSize; /*更新中心点的接口函数*/ void updateCentroids() for (int i = 0; i K; +i) updateCentroid(i); /*分配数据点到哪个簇*/ void assignPoint(int x) double minDis = 99999999; int minIndex = 1; for (int i = 0; i K; +i) double curDis = Euclidean(px,
27、 centroidi); if (curDis minDis) minDis = curDis; minIndex = i; px.clusterNum = minIndex; /*分配数据点到哪个簇的接口函数*/ void assign() for (int i = 0; i N; +i) assignPoint(i); /*判断2点是否同一个点*/ Boolean samePoint(Point p1, Point p2) if (p1.clusterNum != p2.clusterNum) return false; for (int i = 0; i D; +i) if (p1.xi
28、 != p2.xi) return false; return true; /*判断算法是否终止*/ Boolean stop() /*如果每一个中心点都与上一次的中心点相同,则算法终止,否则更新oldCentroid*/ for (int i = 0; i K; +i) if (!samePoint(oldCentroidi, centroidi) for (int j = 0; j K; +j) copy(oldCentroidj,centroidj); return false; return true; /*令p1 = p2*/ void copy(Point p1, Point p2) p1.clusterNum = p2.clusterNum; for (int i = 0; i D; +i) p1.xi = p2.xi; /*初始化*/ void init() /*分配内存*/ p = new PointN; centroid = new PointK; oldCentroid = new PointK; colors = new ColorK; for (int i = 0; i N; +i) pi = new Point(); pi.initial(); for (int i