1、数据挖掘实验报告中科大数据挖掘实验报告姓名 樊涛声 班级 软设一班 学号 SA15226248实验一 K邻近算法实验一 实验内容使用k近邻算法改进约会网站的配对效果。海伦使用约会网址寻找适合自己的约会对象,约会网站会推荐不 同的人选。她将曾经交往过的的人总结为三种类型:(1) 不喜欢的人(2) 魅力一般的人(3) 极具魅力的人尽管发现了这些规律,但依然无法将约会网站提供的人归入恰当的分类。使用KNN算法,更好的帮助她将匹配对 象划分到确切的分类中。二 实验要求 (1) 独立完成kNN实验,基本实现可预测的效果(2) 实验报告(3) 开放性:可以自己增加数据或修改算法,实 现更好的分类效果三 实
2、验步骤(1)数据源说明实验给出的数据源为datingTestSet.txt,共有4列,每一列的属性分别为: percentage of time spenting playing vedio games; frequent flied miles earned per year; liters of ice cream consumed per year; your attitude towars this people。通过分析数据源中的数据,得到规律,从而判断一个人的前三项属性来得出划分海伦对他的态度。(2)KNN算法原理对未知属性的某数据集中的每个点一次执行以下操作1 计算已知类别数据集
3、中的每一个点和当前点的距离2 按照距离递增依次排序3 选取与当前点距离最小的k个点4 确定k个点所在类别的出现频率5 返回k个点出现频率最高的点作为当前点的分类(3)KNN算法实现 利用python实现构造分类器首先计算欧式距离然后选取距离最小的K个点代码如下:def classify(inMat,dataSet,labels,k):dataSetSize=dataSet.shape0#KNN的算法核心就是欧式距离的计算,一下三行是计算待分类的点和训练集中的任一点的欧式距离diffMat=tile(inMat,(dataSetSize,1)-dataSetsqDiffMat=diffMat*2
4、distance=sqDiffMat.sum(axis=1)*0.5#接下来是一些统计工作sortedDistIndicies=distance.argsort()classCount=for i in range(k):labelName=labelssortedDistIndiciesiclassCountlabelName=classCount.get(labelName,0)+1;sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClassCou
5、nt00 解析数据输入文件名,将文件中的数据转化为样本矩阵,方便处理代码如下:def file2Mat(testFileName,parammterNumber):fr=open(testFileName)lines=fr.readlines()lineNums=len(lines)resultMat=zeros(lineNums,parammterNumber)classLabelVector=for i in range(lineNums):line=linesi.strip()itemMat=line.split(t)resultMati,:=itemMat0:parammterNumb
6、erclassLabelVector.append(itemMat-1)fr.close()return resultMat,classLabelVector;返回值为前三列属性被写入到resultMat二维数组中,第四列属性作为标签写入到classLableVector中 归一化数据不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影 响到数据分析的结果,为了消除指标之间的量纲影响,需要进行 数据标准化处理,使各指标处于同一数量级。处理过程如下:def autoNorm(dataSet):minVals=dataSet.min(0)maxVals=dataSet.max(0)ranges
7、=maxVals-minValsnormMat=zeros(shape(dataSet)size=normMat.shape0normMat=dataSet-tile(minVals,(size,1)normMat=normMat/tile(ranges,(size,1)return normMat,minVals,ranges 测试数据在利用KNN算法预测之前,通常只提供已有数据的90%作为训练样本,使用其余的10%数据去测试分类器。注意10%测试数据是随机选择的,采用错误率来检测分类器的性能。错误率太高说明数据源出现问题,此时需要重新考虑数据源的合理性。def test(trainigSe
8、tFileName,testFileName):trianingMat,classLabel=file2Mat(trainigSetFileName,3)trianingMat,minVals,ranges=autoNorm(trianingMat)testMat,testLabel=file2Mat(testFileName,3)testSize=testMat.shape0errorCount=0.0for i in range(testSize):result=classify(testMati-minVals)/ranges,trianingMat,classLabel,3)if(re
9、sult!=testLabeli):errorCount+=1.0errorRate=errorCount/(float)(len(testLabel)return errorRate; 使用KNN算法进行预测如果第四步中的错误率在课接受范围内,表示可以利用此数据源进行预测。输入前三项属性之后较为准确的预测了分类。代码如下:def classifyPerson(): input a person , decide like or not, then update the DB resultlist = not at all,little doses,large doses percentTat
10、s = float(raw_input(input the person percentage of time playing video games:) ffMiles = float(raw_input(flier miles in a year:) iceCream = float(raw_input(amount of iceCream consumed per year:) datingDataMat,datingLabels = file2matrix(datingTestSet.txt) normMat, ranges, minVals = autoNorm(datingData
11、Mat) normPerson = (array(ffMiles,percentTats,iceCream)-minVals)/ranges result = classify0(normPerson, normMat, datingLabels, 3) print you will probably like this guy in: ,result#resultlistresult -1 #update the datingTestSet print update dating DB tmp = t.join(repr(ffMiles),repr(percentTats),repr(ice
12、Cream),repr(result)+n with open(datingTestSet2.txt,a) as fr: fr.write(tmp)四 实验结果及分析本次实验结果截图如下:在终端输入python KNN.py命令开始执行KNN.py,分别得到了样本测试的错误率以及输入数据后KNN算法的预测结果:从实验结果来看,本数据集的一共检测的数据有200个,其中预测的和实际不相符的有16个,错误率为8%,在可接受范围之内。由于检测的数据集是随机选取的,因此该数据比较可信。当输入数据分别为900,40,80时,分类结果为didntlike,与数据集中给出的类似数据的分类一致。实验二 分组实验
13、一 实验内容本次实验的实验内容为利用数据挖掘的聚类算法实现对DBLP合作者的数据挖掘。DBLP收录了国内外学者发表的绝大多数论文,其收录的论文按照文章类型等分类存储在DBLP.xml文件中。通过聚类算法发现频繁项集就可以很好的发掘出有哪些作者经常在一起发表论文。二 实验要求(1) 完成对DBLP数据集的采集和预处理,能从中提取出作者以及合作者的姓名(2) 利用聚类算法完成对合作者的挖掘(3) 实验报告三 实验步骤(1) 从DBLP数据集中提取作者信息首先从官网下载DBLP数据集dblp.xml.gz解压后得到dblp.xml文件。用vim打开dblp.xml发现所有的作者信息分布在以下这些属性
14、中:article,inproceedings,proceedings,book,incollection,phdthesis,mastersthesis,www。在这里使用python自带的xml分析器解析该文件。代码如下:(其核心思想为,分析器在进入上面那些属性中的某一个时,标记flag=1,然后将author属性的内容输出到文件,退出时再标记flag=0,最后得到authors.txt文件)Getauthor.pyimport codecs from xml.sax import handler, make_parser paper_tag = (article,inproceeding
15、s,proceedings,book, incollection,phdthesis,mastersthesis,www) class mHandler(handler.ContentHandler): def _init_(self,result): self.result = result self.flag = 0 def startDocument(self): print Document Start def endDocument(self): print Document End def startElement(self, name, attrs): if name = aut
16、hor: self.flag = 1 def endElement(self, name): if name = author: self.result.write(,) self.flag = 0 if (name in paper_tag) : self.result.write(rn) def characters(self, chrs): if self.flag: self.result.write(chrs) def parserDblpXml(source,result): handler = mHandler(result) parser = make_parser() par
17、ser.setContentHandler(handler) parser.parse(source) if _name_ = _main_: source = codecs.open(dblp.xml,r,utf-8) result = codecs.open(authors.txt,w,utf-8) parserDblpXml(source,result) result.close() source.close()(2) 建立索引作者ID读取步骤1中得到的authors.txt文件,将其中不同的人名按照人名出现的次序编码,存储到文件authors_index.txt中,同时将编码后的合作者
18、列表写入authors_encoded.txt文件。代码如下:encoded.pyimport codecs source = codecs.open(authors.txt,r,utf-8) result = codecs.open(authors_encoded.txt,w,utf-8) index = codecs.open(authors_index.txt,w,utf-8) index_dic = name_id = 0 # build an index_dic, key - authorName value = id, count for line in source: name_
19、list = line.split(,) for name in name_list: if not (name = rn): if name in index_dic: index_dicname1 +=1 else: index_dicname = name_id,1 index.write(name + urn) name_id += 1 result.write(str(index_dicname0) + u,) result.write(rn) source.close() result.close() index.close()(3) 构建FP-Tree并得到频繁项集FP-Tree
20、算法的原理在这里不展开讲了,其核心思想分为2步,首先扫描数据库得到FP-Tree,然后再从树上递归生成条件模式树并上溯找到频繁项集。代码如下:def createTree(dataSet, minSup=1): #create FP-tree from dataset but dont mine freqDic = #go over dataSet twice for trans in dataSet:#first pass counts frequency of occurance for item in trans: freqDicitem = freqDic.get(item, 0) +
21、 dataSettrans headerTable = k:v for (k,v) in freqDic.iteritems() if v = minSup if len(headerTable) = 0: return None, None #if no items meet min support -get out for k in headerTable: headerTablek = headerTablek, None #reformat headerTable to use Node link #print headerTable: ,headerTable retTree = t
22、reeNode(Null Set, 1, None) #create tree for tranSet, count in dataSet.items(): #go through dataset 2nd time localD = for item in tranSet: #put transaction items in order if headerTable.get(item,0): localDitem = headerTableitem0 if len(localD) 0: orderedItems = v0 for v in sorted(localD.items(), key=
23、lambda p: p1, reverse=True) updateTree(orderedItems, retTree, headerTable, count)#populate tree with ordered freq itemset return retTree, headerTable #return tree and header table def updateTree(items, inTree, headerTable, count): if items0 in inTree.children:#check if orderedItems0 in retTree.child
24、ren inTree.childrenitems0.inc(count) #incrament count else: #add items0 to inTree.children inTree.childrenitems0 = treeNode(items0, count, inTree) if headerTableitems01 = None: #update header table headerTableitems01 = inTree.childrenitems0 else: updateHeader(headerTableitems01, inTree.childrenitems
25、0) if len(items) 1:#call updateTree() with remaining ordered items updateTree(items1:, inTree.childrenitems0, headerTable, count) def updateHeader(nodeToTest, targetNode): #this version does not use recursion while (nodeToTest.nodeLink != None): #Do not use recursion to traverse a linked list! nodeT
26、oTest = nodeToTest.nodeLink nodeToTest.nodeLink = targetNodedef mineTree(inTree, headerTable, minSup, preFix, freqItemList): bigL = v0 for v in sorted(headerTable.items(), key=lambda p: p1)#(sort header table) for basePat in bigL: #start from bottom of header table newFreqSet = preFix.copy() newFreq
27、Set.add(basePat) #print finalFrequent Item: ,newFreqSet #append to set if len(newFreqSet) 1: freqItemListfrozenset(newFreqSet) = headerTablebasePat0 condPattBases = findPrefixPath(basePat, headerTablebasePat1) myCondTree, myHead = createTree(condPattBases, minSup) #print head from conditional tree:
28、, myHead if myHead != None: #3. mine cond. FP-tree #print conditional tree for: ,newFreqSet #myCondTree.disp(1) mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)四 实验结果及分析在选取频繁度为40后发现,得到的结果非常多,总共2000多,为了分析的方便,进一步提高频繁度阈值为100,此时得到了111条记录,按照合作者的共同支持度排序,部分截图如下:统计满足支持度条件的合作者个数可以发现,经常一起合作的作者数目
29、最多为3,故在输出文件中输出了authorA,authorB,authorC(当合作者数目为2时,authorC为空,其对应支持度和置信度为0),Sup(A,B,C)为A,B,C共同合作的次数,Sup(A)Sup(B)Sup(C)分别为A,B,C各自的写作次数,Con(A)、Con(B)、Con(C)分别表示A,B,C的置信度(即合作次数除以写作总次数)MinCon和MaxCon分别统计Con(A)、Con(B)、Con(C)的最小值和最大值(注意,当authorC为空时,其对应的置信度不加入最大最小值的统计)。 从结果中可以看出,经常在一起发表论文的大多数是两个人,少数是三个人。合作者之间的关系是双向性的,也就是说,A与B的合作程度与B与A合作的程度是一致的,因此可以直接考虑置信度。如果A和B之间的置信度相差较大有可能存在误差,即A和B合作发表论文对B来说是偶然的对A来说是经常的。实验三 聚类实验一 实验内容本实验研究如何评估K-means聚类算法中的最优K值,主要理论依据是数据挖掘导论介绍的SSE和Sil
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1