实验三报告实验三-Kmeans算法实现

合集下载

kmeans作业实验报告

kmeans作业实验报告
实验报告
1.仔细阅读ppt,利用自己所熟悉的语言编写一 个c-means聚类算法,并运行ppt中的例子数据。
2.要求撰写实验报告。
3.完成后要检查代码。
1
2· 4 聚类的算法
2.4.3 动态聚类法——C-均值法 ⒈ 条件及约定 x1, x2 ,, xN 设待分类的模式特征矢量集为: 类的数目C是事先取定的。 ⒉ 算法思想 该方法取定 C个类别和选取 C个初始聚类中 心,按最小距离原则将各模式分配到 C类中的某 一类,之后不断地计算类心和调整各模式的类别, 最终使各模式到其判属类别中心的距离平方之和 最小。 2
1 0 x2 ( )-( ) =1 Z1 (1) = 0 0
7
1 1 x2 Z 2 (1) ( ) ( ) 0 0 0 因为 x2 Z1 (1) > x2 Z 2 (1) , 所以 x2 Z 2 (1)
x3 Z1 (1) =1 < x3 Z 2 (1) 2 ,\ x3 Z1 (1) x4 Z1 (1) = 2 > x4 Z 2 (1) 1,\ x4 Z 2 (1) ... x20 与第二个聚类中心的距 同样把所有 x5、 x6、 ... x20 都属于 Z 2 (1) 离计算出来,判断 x5、 x6、
同理
因此分为两类:
一、 G 1 (1) ( x 1 , x 3 ), N 1 2 , N 2 18 二、 G 2 (1) ( x2 , x4 , x 5 ,... x20 )
8
10
9 8
X2
7 6
5
4
Z
(1) 2
x12

详解K-means算法在Python中的实现

详解K-means算法在Python中的实现

详解K-means算法在Python中的实现K-means算法简介K-means是机器学习中⼀个⽐较常⽤的算法,属于⽆监督学习算法,其常被⽤于数据的聚类,只需为它指定簇的数量即可⾃动将数据聚合到多类中,相同簇中的数据相似度较⾼,不同簇中数据相似度较低。

K-MEANS算法是输⼊聚类个数k,以及包含 n个数据对象的数据库,输出满⾜⽅差最⼩标准k个聚类的⼀种算法。

k-means 算法接受输⼊量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满⾜:同⼀聚类中的对象相似度较⾼;⽽不同聚类中的对象相似度较⼩。

核⼼思想通过迭代寻找k个类簇的⼀种划分⽅案,使得⽤这k个类簇的均值来代表相应各类样本时所得的总体误差最⼩。

k个聚类具有以下特点:各聚类本⾝尽可能的紧凑,⽽各聚类之间尽可能的分开。

k-means算法的基础是最⼩误差平⽅和准则,K-menas的优缺点:优点:原理简单速度快对⼤数据集有⽐较好的伸缩性缺点:需要指定聚类数量K对异常值敏感对初始值敏感K-means的聚类过程其聚类过程类似于梯度下降算法,建⽴代价函数并通过迭代使得代价函数值越来越⼩适当选择c个类的初始中⼼;在第k次迭代中,对任意⼀个样本,求其到c个中⼼的距离,将该样本归到距离最短的中⼼所在的类;利⽤均值等⽅法更新该类的中⼼值;对于所有的c个聚类中⼼,如果利⽤(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

该算法的最⼤优势在于简洁和快速。

算法的关键在于初始中⼼的选择和距离公式。

K-means 实例展⽰python中km的⼀些参数:sklearn.cluster.KMeans(n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=0.0001,precompute_distances='auto',verbose=0,random_state=None,copy_x=True,n_jobs=1,algorithm='auto')n_clusters: 簇的个数,即你想聚成⼏类init: 初始簇中⼼的获取⽅法n_init: 获取初始簇中⼼的更迭次数,为了弥补初始质⼼的影响,算法默认会初始10个质⼼,实现算法,然后返回最好的结果。

K-means聚类实验——【机器学习与算法分析】

K-means聚类实验——【机器学习与算法分析】

实验算法K-means聚类实验【实验名称】K-means聚类实验【实验要求】掌握K-means模型应用过程,根据模型要求进行数据预处理,建模,评价与应用;【背景描述】聚类算法是一种典型的无监督学习算法,在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

【知识准备】了解K-means模型的使用场景,数据标准。

了解Python/Spark数据处理一般方法。

了解spark 模型调用,训练以及应用方法【实验设备】Windows或Linux操作系统的计算机。

部署Spark,Python,本实验提供centos6.8环境。

【实验说明】采用UCI机器学习库中的wine数据集作为算法数据,除去原来的类别号,把数据看做没有类别的样本,训练K-means模型,对样本进行聚类。

【实验环境】Spark 2.3.1,Pyrhon3.X,实验在命令行pyspark中进行,或者把代码写在py脚本,由于本次为实验,以学习模型为主,所以在命令行中逐步执行代码,以便更加清晰地了解整个建模流程。

【实验步骤】第一步:启动pyspark:命令行中键入pyspark --master local[4],本地模式启动spark与python:1第二步:导入用到的包,并读取数据:(1).导入所需的包from pyspark import SparkContext, SQLContext, SparkConffrom math import sqrt(2).读取数据源,数据源地址为:/opt/algorithm/kmeans/wine.txtdf_wine = sc.textFile(u"file:/opt/algorithm/kmeans/wine.txt").map(lambda x: str(x).split(",")).map(lambda x: [float(z) for z in x])(3).数据转换为DataFramedf_wine_rdd = sqlContext.createDataFrame(df_wine)(4).展示数据df_wine_rdd.show()2第三步:数据预处理(1).去掉类别标号那一类df_wine_rdd = df_wine_rdd.drop("_1")(2).构建向量import pyspark.ml.feature as ml_featurecols = df_wine_rdd.columnsvectorAssembler = ml_feature.VectorAssembler().setInputCols(cols).setOutputCol("cols") wine_Vc = vectorAssembler.transform(df_wine_rdd)(3).对数据进行标准化standardScaler=ml_feature.StandardScaler().setInputCol("cols").setOutputCol("cols_st").set3WithMean(True).setWithStd(True).fit(wine_Vc)wine_Vc_St = standardScaler.transform(wine_Vc)第四步:构建模型并应用,输出聚类后的分类(1).Kmeans模型,设置输入列,迭代次数,输出列,聚类数import pyspark.ml.clustering as ml_clusteringclusters = ml_clustering.KMeans(featuresCol="cols_st",predictionCol="Pred",initMode="k-means||",initSteps=5,tol=1e-4,maxIter=20,seed=None).fit(wine_Vc_St)wine_Vc_St_clusters = clusters.transform(wine_Vc_St)(2).打印模型wine_Vc_St_clusters.show()4第五步:构建模型评估方法(1).输出聚类中心并合并到数据表import pyspark.mllib.linalg as linalgcenter = zip([0, 1, 2], [linalg.Vectors.dense(z) for z in clusters.clusterCenters()])centers = sqlContext.createDataFrame(center).toDF("pred", "center")wine_Vc_St_clusters_centers = wine_Vc_St_clusters.join(centers, on=["pred"])(2).计算出误差平方和WSSSE = wine_Vc_St_clusters_centers.select("center", "cols_st").rdd.map(lambdax:sqrt(linalg.Vectors.squared_distance(linalg.Vectors.dense(list(x.asDict()["center"])),linalg .Vectors.dense(list(x.asDict()["cols_st"]))))).sum() / wine_Vc_St_clusters_centers.count()第六步:输出模型效果(1).打印结果5print("误差平方和= " + str(WSSSE))第七步:可以通过以下命令执行python文件,查看最终结果spark-submit /opt/algorithm/kmeans/K-means.py【问题与回答】1、Q:K值怎么确定?A:对于K值的确定,是Kmean的一个最大缺点,往往需要经验判断,统计学上,遍历k[1,样本量,step],刻画不同k的类样本与质心平均距离曲线确定k的取值。

k-means算法实验报告

k-means算法实验报告

.哈尔滨工业大学数据挖掘理论与算法实验报告(2014年度秋季学期).课程编码S1300019C授课教师高宏学生姓名赵天意学号14S101018学院电气工程及自动化学院一、实验内容设计实现 k 均值聚类算法。

二、实验设计随机生成 2 维坐标点,对点进行聚类,进行k=2 聚类, k=3 聚类,多次 k=4 聚类,分析比较实验结果。

三、实验环境及测试数据实验环境: Windows7操作系统,Python2.7 IDLE测试数据:随机生成 3 个点集,点到中心点距离服从高斯分布:集合大小中心坐标半径11005,52 210010,62 31008,102四、实验过程编写程序随机生成测试点集,分别聚成2, 3, 4 类,观察实验结果多次 4 聚类,观察实验结果五、实验结果初始随机点:2聚类迭代 -平方误差1234561337677639634633633聚类中心与类中点数9.06 ,8.291915.05 ,5.011093聚类123456789101112 810692690688686681565385369.4369.8373700 4.99 ,5.05108,7.92 ,10.489310.15 ,6.16994聚类迭代 27次,平方误差 344.897291273 7.95,,10.56904.89,5.001038.41,6.313810.75 ,6.1,469多次4聚类迭代27次平方误差 352.19 4.95 ,5.031069.79 ,6.03937.85 ,10.509012.71 ,8.1611迭代 8 次平方误差356.1910.15 ,6.16997.92 ,10.48935.54 ,5.01674.09 ,5.1041迭代 7 次平方误差352.3510.39 ,6.04874.91 ,4.981038.00 ,10.79797.71 ,7.6931六、遇到的困难及解决方法、心得体会K-Means初值对最终的聚类结果有影响,不同初值,可能会有不同的聚类结果,也就是说, K-Means收敛于局部最优点K-Means趋向于收敛到球形,每类样本数相近K-Means随着k的增加,平方误差会降低,但聚类效果未必变好该例子, 2 聚类误差 633 , 3 聚类 370 ,4 聚类 350 ,可以发现 2 聚类到 3 聚类误差下降较快, 3 到 4 聚类误差下降较慢,所以 3 是最佳聚类个数。

《数据挖掘实验》---K-means聚类及决策树算法实现预测分析实验报告

《数据挖掘实验》---K-means聚类及决策树算法实现预测分析实验报告

实验设计过程及分析:1、通过通信企业数据(USER_INFO_M.csv),使用K-means算法实现运营商客户价值分析,并制定相应的营销策略。

(预处理,构建5个特征后确定K 值,构建模型并评价)代码:setwd("D:\\Mi\\数据挖掘\\")datafile<-read.csv("USER_INFO_M.csv")zscoredFile<- na.omit(datafile)set.seed(123) # 设置随机种子result <- kmeans(zscoredFile[,c(9,10,14,19,20)], 4) # 建立模型,找聚类中心为4round(result$centers, 3) # 查看聚类中心table(result$cluster) # 统计不同类别样本的数目# 画出分析雷达图par(cex=0.8)library(fmsb)max <- apply(result$centers, 2, max)min <- apply(result$centers, 2, min)df <- data.frame(rbind(max, min, result$centers))radarchart(df = df, seg =5, plty = c(1:4), vlcex = 1, plwd = 2)# 给雷达图加图例L <- 1for(i in 1:4){legend(1.3, L, legend = paste("VIP_LVL", i), lty = i, lwd = 3, col = i, bty = "n")L <- L - 0.2}运行结果:2、根据企业在2016.01-2016.03客户的短信、流量、通话、消费的使用情况及客户基本信息的数据,构建决策树模型,实现对流失客户的预测,F1值。

聚类分析算法实验报告(3篇)

聚类分析算法实验报告(3篇)

第1篇一、实验背景聚类分析是数据挖掘中的一种重要技术,它将数据集划分成若干个类或簇,使得同一簇内的数据点具有较高的相似度,而不同簇之间的数据点则具有较低相似度。

本实验旨在通过实际操作,了解并掌握聚类分析的基本原理,并对比分析不同聚类算法的性能。

二、实验环境1. 操作系统:Windows 102. 软件环境:Python3.8、NumPy 1.19、Matplotlib 3.3.4、Scikit-learn0.24.03. 数据集:Iris数据集三、实验内容本实验主要对比分析以下聚类算法:1. K-means算法2. 聚类层次算法(Agglomerative Clustering)3. DBSCAN算法四、实验步骤1. K-means算法(1)导入Iris数据集,提取特征数据。

(2)使用Scikit-learn库中的KMeans类进行聚类,设置聚类数为3。

(3)计算聚类中心,并计算每个样本到聚类中心的距离。

(4)绘制聚类结果图。

2. 聚类层次算法(1)导入Iris数据集,提取特征数据。

(2)使用Scikit-learn库中的AgglomerativeClustering类进行聚类,设置链接方法为'ward'。

(3)计算聚类结果,并绘制树状图。

3. DBSCAN算法(1)导入Iris数据集,提取特征数据。

(2)使用Scikit-learn库中的DBSCAN类进行聚类,设置邻域半径为0.5,最小样本数为5。

(3)计算聚类结果,并绘制聚类结果图。

五、实验结果与分析1. K-means算法实验结果显示,K-means算法将Iris数据集划分为3个簇,每个簇包含3个样本。

从聚类结果图可以看出,K-means算法能够较好地将Iris数据集划分为3个簇,但存在一些噪声点。

2. 聚类层次算法聚类层次算法将Iris数据集划分为3个簇,与K-means算法的结果相同。

从树状图可以看出,聚类层次算法在聚类过程中形成了多个分支,说明该算法能够较好地处理不同簇之间的相似度。

K-Means原理及代码实现

K-Means原理及代码实现

K-Means 原理及代码实现对于有监督学习,我们知道其训练数据形式为T =(x (1),y (1)),(x (2),y (2)),⋯,(x (n ),y (n )),其中,x 表⽰样本实例,y 表⽰样本所属类别。

⽽对于⽆监督学习,训练数据不提供对应的类别,训练数据形式为T =(x (1)),(x (2)),⋯,(x (n ))。

这⾥,对⽆监督的聚类算法K-Means 进⾏总结。

1 K-Means 原理K-Means 作为聚类算法是如何完成聚类的呢?正如其算法名称,K 表⽰簇的个数,Means 表⽰均值。

(注: 在聚类中,把数据所在的集合称为簇)。

K-Means 算法的基本思想是将训练数据集按照各个样本到聚类中⼼的距离分配到距离较近的K 个簇中,然后计算每个簇中样本的平均位置,将聚类中⼼移动到该位置。

根据上⾯K-Means 算法的基本思想,K-Means 算法可以总结成两步:- 簇分配:样本分配到距离较近的簇- 移动聚类中⼼:将聚类中⼼移动到簇中样本平均值的位置假设有K 个簇(C 1,C 2,⋯,C k ),样本距离簇类中⼼的距离的表达式为:k∑i =1∑x ϵC i ‖其中C_{i}是第1到K 个最接近样本x 的聚类中⼼,\mu _{i}是该簇C_{i}中所有样本点的均值组成的向量。

\mu _{i}的表达式为:\mu _{i}=\frac{1}{|C_{i}|}\sum_{x\epsilon C_{i}}x举例,如何计算\mu _{2}的聚类中⼼?假设被分配到了聚类中⼼2的4个样本有:x^{(1)},x^{(5)},x^{(6)},x^{(10)},也就是C_{(1)}=2,C_{(5)}=2,C_{(6)}=2,C_{(10)}=2,\mu _{2}=\frac{1}{4}\left [ x^{(1)}+x^{(5)}+x^{(6)}+x^{(10)} \right ]\epsilon \mathbb{R}^{n}n 表⽰样本的特征个数。

数据挖掘实验报告三

数据挖掘实验报告三

实验三一、实验原理K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。

在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。

算法原理:(1) 随机选取k个中心点;(2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为该类;(3) 更新中心点为每类的均值;(4) j<-j+1 ,重复(2)(3)迭代更新,直至误差小到某个值或者到达一定的迭代步数,误差不变.空间复杂度o(N)时间复杂度o(I*K*N)其中N为样本点个数,K为中心点个数,I为迭代次数二、实验目的:1、利用R实现数据标准化。

2、利用R实现K-Meams聚类过程。

3、了解K-Means聚类算法在客户价值分析实例中的应用。

三、实验内容依据航空公司客户价值分析的LRFMC模型提取客户信息的LRFMC指标。

对其进行标准差标准化并保存后,采用k-means算法完成客户的聚类,分析每类的客户特征,从而获得每类客户的价值。

编写R程序,完成客户的k-means聚类,获得聚类中心与类标号,并统计每个类别的客户数四、实验步骤1、依据航空公司客户价值分析的LRFMC模型提取客户信息的LRFMC指标。

2、确定要探索分析的变量3、利用R实现数据标准化。

4、采用k-means算法完成客户的聚类,分析每类的客户特征,从而获得每类客户的价值。

五、实验结果客户的k-means聚类,获得聚类中心与类标号,并统计每个类别的客户数六、思考与分析使用不同的预处理对数据进行变化,在使用k-means算法进行聚类,对比聚类的结果。

kmenas算法首先选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数。

这样做的前提是我们已经知道数据集中包含多少个簇.1.与层次聚类结合经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果粗的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类。

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)⼀.分散性聚类(kmeans)算法流程:1.选择聚类的个数k.2.任意产⽣k个聚类,然后确定聚类中⼼,或者直接⽣成k个中⼼。

3.对每个点确定其聚类中⼼点。

4.再计算其聚类新中⼼。

5.重复以上步骤直到满⾜收敛要求。

(通常就是确定的中⼼点不再改变。

优点:1.是解决聚类问题的⼀种经典算法,简单、快速2.对处理⼤数据集,该算法保持可伸缩性和⾼效率3.当结果簇是密集的,它的效果较好缺点1.在簇的平均值可被定义的情况下才能使⽤,可能不适⽤于某些应⽤2.必须事先给出k(要⽣成的簇的数⽬),⽽且对初值敏感,对于不同的初始值,可能会导致不同结果。

3.不适合于发现⾮凸形状的簇或者⼤⼩差别很⼤的簇4.对躁声和孤⽴点数据敏感这⾥为了看鸢尾花的三种聚类算法的直观区别,所以不⽤具体算法实现,只需要调⽤相应函数即可。

程序如下:import matplotlib.pyplot as pltimport numpy as npfrom sklearn.cluster import KMeansfrom sklearn import datasetsiris = datasets.load_iris()X = iris.data[:, :4] # #表⽰我们取特征空间中的4个维度print(X.shape)# 绘制数据分布图plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see')plt.xlabel('sepal length')plt.ylabel('sepal width')plt.legend(loc=2)plt.show()estimator = KMeans(n_clusters=3) # 构造聚类器estimator.fit(X) # 聚类label_pred = bels_ # 获取聚类标签# 绘制k-means结果x0 = X[label_pred == 0]x1 = X[label_pred == 1]x2 = X[label_pred == 2]plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0')plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1')plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2')plt.xlabel('sepal length')plt.ylabel('sepal width')plt.legend(loc=2)plt.show()运⾏结果:⼆.结构性聚类(层次聚类)1.凝聚层次聚类:AGNES算法(⾃底向上)⾸先将每个对象作为⼀个簇,然后合并这些原⼦簇为越来越⼤的簇,直到某个终结条件被满⾜2.分裂层次聚类:DIANA算法(⾃顶向下)⾸先将所有对象置于⼀个簇中,然后逐渐细分为越来越⼩的簇,直到达到了某个终结条件。

K-means算法的实现与应用举例

K-means算法的实现与应用举例

K-means 算法的实现与应用举例1 K-means 方法K-means 算法如下:S1:初始化,聚类中心k c ,,c c 21,标号集Φ====k I I I 21; S2: 分类:()(){}end;i I I ;c x c x j ni for j j Tj i j i kj **1*min arg :1=--==≤≤S3:重新计算聚类中心:end;x I c kj forjI i i j j ∑∈==1:1S4:迭代S2-S3,直至收敛。

其matlab 程序见附录1。

2实验实验1 随机生成300个[]44,-之间的二维数对,用K-means 算法将其分为两类(其matlab 程序见附录2),如fig1,由图1(b)可看出,离群点对聚类中心的位置有明显的影响。

实验2 随机生成600个二维数对,其中300个落于以(0,0)为圆心的单位圆,另外300-4-3-2-101234-4-3-2-101234Cluster 1Cluster 2Centroids-4-3-2-101234-4-3-2-1123Cluster 1Cluster 2Centroids(a)(b)fig1 实验1个落入(2,2)为圆心的单位圆,用K-means 算法将其分为两类(其matlab 程序见附录2),如fig2(a),而fig2(b)则为在以上实验的基础上增加了30个干扰点之后的分类图,可见K-means 算法不能对其很好的分类,离群点对聚类中心的位置有明显的影响。

实验3 随机生成600个二维数对,其中300个落于以(0,0)为圆心的单位元,另外300个落入以(0,0)为圆心的单位圆,长半径为3短半径为2的圆盘,用K-means 算法将其分为2类(其matlab 程序见附录2),结果见fig3,可见K-means 算法同样不能对其很好的分类。

-3-2-10123-3-2-1123Cluster 1Cluster 2Centroids3 K-means 算法修正修正一:实验2中增加离群点后,K-means 算法失效,是因为采用2范数计算距离,使计算出的重心与实际重心存在较大的误差。

K-Means算法实验报告

K-Means算法实验报告

题目: K-Means 聚类算法分析与实现学 院 xxxxxxxxxxxxxxxxxxxx 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxx 姓 名 xxxx 指导教师 xxxx20xx 年x 月xx 日装 订 线K-Means聚类算法KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。

然后按平均法重新计算各个簇的质心,从而确定新的簇心。

一直迭代,直到簇心的移动距离小于某个给定的值。

K-Means聚类算法主要分为三个步骤:(1)第一步是为待聚类的点寻找聚类中心(2)第二步是计算每个点到聚类中心的距离,将每个点聚类到离该点最近的聚类中去(3)第三步是计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心反复执行(2)、(3),直到聚类中心不再进行大范围移动或者聚类次数达到要求为止下图展示了对n个样本点进行K-means聚类的效果,这里k取2:(a)未聚类的初始点集(b)随机选取两个点作为聚类中心(c)计算每个点到聚类中心的距离,并聚类到离该点最近的聚类中去(d)计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心(e)重复(c),计算每个点到聚类中心的距离,并聚类到离该点最近的聚类中去(f)重复(d),计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心Matlab实现:%随机获取150个点X =[randn(50,2)+ones(50,2);randn(50,2)-ones(50,2);randn(50,2)+[ones(50,1),-ones( 50,1)]];opts = statset('Display','final');%调用Kmeans函数%X N*P的数据矩阵%Idx N*1的向量,存储的是每个点的聚类标号%Ctrs K*P的矩阵,存储的是K个聚类质心位置%SumD 1*K的和向量,存储的是类间所有点与该类质心点距离之和%D N*K的矩阵,存储的是每个点与所有质心的距离;[Idx,Ctrs,SumD,D] = kmeans(X,3,'Replicates',3,'Options',opts);%画出聚类为1的点。

聚类算法_实验报告

聚类算法_实验报告

一、实验背景随着大数据时代的到来,数据量呈爆炸式增长,如何有效地对海量数据进行处理和分析成为了一个重要课题。

聚类算法作为一种无监督学习方法,在数据挖掘、模式识别等领域有着广泛的应用。

本实验旨在通过实际操作,了解聚类算法的基本原理、实现方法及其在实际问题中的应用。

二、实验目的1. 理解聚类算法的基本原理和流程;2. 掌握K-means、层次聚类、DBSCAN等常用聚类算法;3. 分析不同聚类算法在处理不同类型数据时的优缺点;4. 学会使用聚类算法解决实际问题。

三、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 数据库:Pandas4. 机器学习库:Scikit-learn四、实验内容1. K-means聚类算法(1)数据准备本实验使用的数据集为Iris数据集,包含150个样本,每个样本有4个特征。

(2)算法实现使用Scikit-learn库中的KMeans类实现K-means聚类算法。

(3)结果分析通过绘制样本分布图,观察聚类效果。

根据聚类结果,将样本分为3类,与Iris数据集的类别标签进行对比。

2. 层次聚类算法(1)数据准备本实验使用的数据集为鸢尾花数据集,包含150个样本,每个样本有4个特征。

(2)算法实现使用Scikit-learn库中的AgglomerativeClustering类实现层次聚类算法。

(3)结果分析通过绘制树状图,观察聚类过程。

根据聚类结果,将样本分为3类,与鸢尾花数据集的类别标签进行对比。

3. DBSCAN聚类算法(1)数据准备本实验使用的数据集为Iris数据集。

(2)算法实现使用Scikit-learn库中的DBSCAN类实现DBSCAN聚类算法。

(3)结果分析通过绘制样本分布图,观察聚类效果。

根据聚类结果,将样本分为3类,与Iris 数据集的类别标签进行对比。

五、实验结果与分析1. K-means聚类算法K-means聚类算法在Iris数据集上取得了较好的聚类效果,将样本分为3类,与真实标签一致。

kmeans聚类算法实验心得

kmeans聚类算法实验心得

kmeans聚类算法实验心得
kmeans聚类算法是一种常用的无监督学习算法,可以将数据集分成多个类别。

在实验中,我使用Python语言实现了kmeans聚类算法,并对其进行了测试和分析。

我使用Python中的sklearn库中的make_blobs函数生成了一个随机数据集,该数据集包含了1000个样本和4个特征。

然后,我使用kmeans算法对该数据集进行了聚类,将其分成了4个类别。

通过可视化的方式,我发现kmeans算法能够很好地将数据集分成4个类别,并且每个类别的中心点都能够很好地代表该类别。

接着,我对kmeans算法进行了参数调优。

我发现,kmeans算法的聚类效果很大程度上取决于初始中心点的选择。

因此,我尝试了多种不同的初始中心点选择方法,包括随机选择、均匀分布选择和kmeans++选择。

通过实验,我发现kmeans++选择方法能够获得最好的聚类效果。

我对kmeans算法进行了性能测试。

我使用Python中的time库对kmeans算法的运行时间进行了统计,并且将其与sklearn库中的kmeans算法进行了比较。

结果显示,我实现的kmeans算法的运行时间比sklearn库中的kmeans算法要长,但是两者的聚类效果相当。

总的来说,kmeans聚类算法是一种非常实用的无监督学习算法,可以用于数据集的聚类和分类。

在实验中,我通过对kmeans算法的实现、参数调优和性能测试,深入了解了该算法的原理和应用,对于以后的数据分析工作有很大的帮助。

K-means实验报告

K-means实验报告

目录1. 问题描述 (2)2. 设计要求 (2)3. 需求分析 (3)4. 详细设计 (3)5. 测试及运行结果 (4)6. 程序源码及注释 (5)7. 课程设计心得体会 (15)1.问题描述k-means 算法是根据聚类中的均值进行聚类划分的聚类算法。

输入:聚类个数k ,以及包含n 个数据对象的数据。

输出:满足方差最小标准的k 个聚类。

处理流程:Step 1. 从n 个数据对象任意选择k 个对象作为初始聚类中心;Step 2. 循环Step 3到Step 4直到每个聚类不再发生变化为止;Step 3. 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应对象进行划分;Step 4. 重新计算每个(有变化)聚类的均值(中心对象)k-means 算法的工作过程说明如下:首先从n 个数据对象任意选择k 个对象作为初始聚类中心,而对于所剩下的其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类。

然后,再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值),不断重复这一过程直到标准测度函数开始收敛为止。

一般都采用均方差作为标准测度函数,具体定义如下:21∑∑=∈-=k i i i E C p m p (1)其中E 为数据库中所有对象的均方差之和,p 为代表对象的空间中的一个点,m i 为聚类C i 的均值(p 和m i 均是多维的)。

公式(1)所示的聚类标准,旨在使所获得的k 个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。

2.设计要求 首先从n 个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然 后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。

数据挖掘实例实验报告(3篇)

数据挖掘实例实验报告(3篇)

第1篇一、实验背景随着大数据时代的到来,数据挖掘技术逐渐成为各个行业的重要工具。

数据挖掘是指从大量数据中提取有价值的信息和知识的过程。

本实验旨在通过数据挖掘技术,对某个具体领域的数据进行挖掘,分析数据中的规律和趋势,为相关决策提供支持。

二、实验目标1. 熟悉数据挖掘的基本流程,包括数据预处理、特征选择、模型选择、模型训练和模型评估等步骤。

2. 掌握常用的数据挖掘算法,如决策树、支持向量机、聚类、关联规则等。

3. 应用数据挖掘技术解决实际问题,提高数据分析和处理能力。

4. 实验结束后,提交一份完整的实验报告,包括实验过程、结果分析及总结。

三、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 数据挖掘库:pandas、numpy、scikit-learn、matplotlib四、实验数据本实验选取了某电商平台用户购买行为数据作为实验数据。

数据包括用户ID、商品ID、购买时间、价格、商品类别、用户年龄、性别、职业等。

五、实验步骤1. 数据预处理(1)数据清洗:剔除缺失值、异常值等无效数据。

(2)数据转换:将分类变量转换为数值变量,如年龄、性别等。

(3)数据归一化:将不同特征的范围统一到相同的尺度,便于模型训练。

2. 特征选择(1)相关性分析:计算特征之间的相关系数,剔除冗余特征。

(2)信息增益:根据特征的信息增益选择特征。

3. 模型选择(1)决策树:采用CART决策树算法。

(2)支持向量机:采用线性核函数。

(3)聚类:采用K-Means算法。

(4)关联规则:采用Apriori算法。

4. 模型训练使用训练集对各个模型进行训练。

5. 模型评估使用测试集对各个模型进行评估,比较不同模型的性能。

六、实验结果与分析1. 数据预处理经过数据清洗,剔除缺失值和异常值后,剩余数据量为10000条。

2. 特征选择通过相关性分析和信息增益,选取以下特征:用户ID、商品ID、购买时间、价格、商品类别、用户年龄、性别、职业。

Kmeans聚类实验

Kmeans聚类实验
# 对数据进行标准化 standardScaler = ml_feature.StandardScaler().setInputCol("cols").setOutputCol("cols_st")(True).setWithStd(
True).fit(wine_Vc) wine_Vc_St = standardScaler.transform(wine_Vc)
# 读取数据 df_wine = sc.textFile(u"file:/root/Documents/liangdong/work/laboratory/wine数据集.txt").map(
lambda x: str(x).split(",")).map(lambda x: [float(z) for z in x])
Kmeans算法简介与python 实践
演讲人:
时间:
提纲
Kmeans算法简介
Kmeans算法实验
聚类与Kmeans 算法简介
• 聚类算法是一种典型的无监督学习算法,在聚类算法中根据样本之间的相似性,将样本划分到不 同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧 式距离法。
Python 进行Kmeans实践
• 系统准备:centos6.8、Spark 2.3.1、Pyrhon3.X • 数据准备:采用UCI机器学习库中的wine数据集作为算法数据,包括了三种酒中13种不同成分的数
量。成分分别为:Alcohol,Malicacid,Ash,lcalinity of ash,Magnesium,Total phenols, Flavanoids,Nonflavanoid phenols,Proanthocyanins,Color intensity,Hue,OD280/OD315 of diluted wines,Proline。在 “wine.data”文件中,每行代表一种酒的样本,共有178个样本;一共 有14列,其中,第一列为类标志属性,共有三类,分别记为“1”,“2”,“3”;后面的13列为每 个样本的对应属性的样本值。第1类有59个样本,第2类有71个样本,第3类有48个样本。本例实 验是聚类,所以我们不用第一列的数据 • 建模目的:训练kmeans聚类器,使得知道13个特征后,对样本进行聚类。

k-means聚类算法实验总结

k-means聚类算法实验总结

K-means聚类算法实验总结在本次实验中,我们深入研究了K-means聚类算法,对其原理、实现细节和优化方法进行了探讨。

K-means聚类是一种无监督学习方法,旨在将数据集划分为K个集群,使得同一集群内的数据点尽可能相似,不同集群的数据点尽可能不同。

实验步骤如下:1. 数据准备:选择合适的数据集,可以是二维平面上的点集、图像分割、文本聚类等。

本实验中,我们采用了二维平面上的随机点集作为示例数据。

2. 初始化:随机选择K个数据点作为初始聚类中心。

3. 迭代过程:对于每个数据点,根据其与聚类中心的距离,将其分配给最近的聚类中心所在的集群。

然后,重新计算每个集群的聚类中心,更新聚类中心的位置。

重复此过程直到聚类中心不再发生明显变化或达到预设的迭代次数。

4. 结果评估:通过计算不同指标(如轮廓系数、Davies-Bouldin指数等)来评估聚类效果。

实验结果如下:1. K-means聚类能够有效地将数据点划分为不同的集群。

通过不断迭代,聚类中心逐渐趋于稳定,同一集群内的数据点逐渐聚集在一起。

2. 在实验中,我们发现初始聚类中心的选择对最终的聚类结果有一定影响。

为了获得更好的聚类效果,可以采用多种初始聚类中心并选择最优结果。

3. 对于非凸数据集,K-means算法可能会陷入局部最优解,导致聚类效果不佳。

为了解决这一问题,可以考虑采用其他聚类算法,如DBSCAN、层次聚类等。

4. 在处理大规模数据集时,K-means算法的时间复杂度和空间复杂度较高,需要进行优化。

可以采用降维技术、近似算法等方法来提高算法的效率。

通过本次实验,我们深入了解了K-means聚类算法的原理和实现细节,掌握了其优缺点和适用场景。

在实际应用中,需要根据数据集的特点和需求选择合适的聚类算法,以达到最佳的聚类效果。

K-means算法分析实验报告

K-means算法分析实验报告

班级: 计算机127班姓名: 潘** 学号: 12*****120K-means算法实验报告K-means算法,也被称为k-平均或k-均值算法,是一种得到最广泛使用的聚类算法。

它是将各个聚类子集内的所有数据样本的均值作为该聚类的代表点,算法的主要思想是通过迭代过程把数据集划分为不同的类别,使得评价聚类性能的准则函数达到最优(平均误差准则函数E ),从而使生成的每个聚类(又称簇)内紧凑,类间独立。

欧氏距离➢ 1.为每个聚类确定一个初始聚类中心,这样就有K 个初始聚类中心。

➢ 2.将样本集中的样本按照最小距离原则分配到最邻近聚类➢ 3.使用每个聚类中的样本均值作为新的聚类中心。

➢ 4.重复步骤2.3直到聚类中心不再变化。

➢ 5.结束,得到K个聚类优点:➢是解决聚类问题的一种经典算法,简单、快速。

➢对处理大数据集,该算法是相对可伸缩和高效率的。

➢因为它的复杂度是0 (n k t ) , 其中, n 是所有对象的数目, k 是簇的数目, t 是迭代➢的次数。

通常k < <n 且t < <n 。

➢当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。

缺点:➢在簇的平均值被定义的情况下才能使用,这对于处理符号属性的数据不适用。

➢必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。

经常发生得到次优划分的情况。

解决方法是多次尝试不同的初始值。

➢它对于“躁声”和孤立点数据是敏感的,少量的该类数据能够对平均值产生极大的影响。

算法实例(C++代码)#include<iostream>#include<ctime>#include<iomanip>#include<cmath>using namespace std;const int M=51,N=2,P=3;struct node{double h;double v;} ;void main(){node n[M];node center[P];int a[M][N],c[P],t=1,T=10;int i,j,k;srand(int(time(0)));for(i=0;i<M;i++) //随机产生50个坐标{n[i].h=rand()%100;n[i].v=rand()%100;}for(j=0;j<M;j++){cout<<"(" <<setw(2)<<n[j].h<<",";cout<<setw(2)<<n[j].v<<")"<<" ";if((j+1)%3==0)cout<<endl;}do{for(i=0;i<P;i++)c[i] = rand()%M+1;}while(!(c[0]!=c[1]&&c[0]!=c[2]&&c[1]!=c[2]));cout<<"原始簇心中心"<<endl;for(i=0;i<P;i++){center[i].h=n[c[i]].h;cout<<"(" <<setw(8)<<center[i].h<<",";center[i].v=n[c[i]].v;cout<<setw(8)<<center[i].v<<")"<<" ";}cout<<"\n"<<"======================================"<<endl; //========================================int e[P],x;double min,E[P],tem[P][N],distance[P];while(T>t){for(i=0;i<P;i++){e[i]=0;E[i]=0.00;for(j=0;j<2;j++)tem[i][j]=0.00;}for(i=0,x=0;i<M;i++,x=0){for(k=0;k<P;k++)distance[k] = pow((n[i].h - center[k].h), 2)+pow((n[i].v - center[k].v), 2);for(k=1;k<P;k++)if(distance[x]>distance[k])x=k;a[x][e[x]++]=i;}//输出簇类======================================for(j=0;j<P;j++){cout<<"簇类"<<j+1<<endl;for(i=0;i<e[j];i++){E[j]+=pow((n[a[j][i]].h - center[j].h), 2)+pow((n[a[j][i]].v - center[j].v), 2);tem[j][0]+=n[a[j][i]].h;tem[j][1]+=n[a[j][i]].v;cout<<"(" <<setw(2)<<n[a[j][i]].h<<",";cout<<setw(2)<<n[a[j][i]].v<<")"<<" ";if((i+1)%3==0)cout<<endl;}cout<<endl;}//计算新的簇类中心============================================ for(i=0;i<P;i++){center[i].h=tem[i][0]/e[i];center[i].v=tem[i][1]/e[i];E[i]=sqrt(E[i]/(e[i]-1));}cout<<"平方偏差"<<E[0]+E[1]+E[2]<<endl;cout<<"第"<<t+1<<"次聚类的簇心"<<endl;for(i=0;i<P;i++){cout<<"(" <<setw(8)<<center[i].h<<",";cout<<setw(8)<<center[i].v<<")"<<" ";}cout<<"\n"<<"========================"<<endl;t++;}return;}实验结果:循环10次聚类观察平方偏差是否减少。

2023年实验三K均值聚类算法实验报告

2023年实验三K均值聚类算法实验报告

实验三 K-Means聚类算法一、实验目的1) 加深对非监督学习的理解和结识2) 掌握动态聚类方法K-Means 算法的设计方法二、实验环境1) 具有相关编程软件的PC机三、实验原理1) 非监督学习的理论基础2) 动态聚类分析的思想和理论依据3) 聚类算法的评价指标四、算法思想K-均值算法的重要思想是先在需要分类的数据中寻找K组数据作为初始聚类中心,然后计算其他数据距离这三个聚类中心的距离,将数据归入与其距离最近的聚类中心,之后再对这K个聚类的数据计算均值,作为新的聚类中心,继续以上环节,直到新的聚类中心与上一次的聚类中心值相等时结束算法。

实验代码function km(k,A)%函数名里不要出现“-”warning off[n,p]=size(A);%输入数据有n个样本,p个属性cid=ones(k,p+1);%聚类中心组成k行p列的矩阵,k表达第几类,p是属性%A(:,p+1)=100;A(:,p+1)=0;for i=1:k%cid(i,:)=A(i,:); %直接取前三个元祖作为聚类中心m=i*floor(n/k)-floor(rand(1,1)*(n/k))cid(i,:)=A(m,:);cid;endAsum=0;Csum2=NaN;flags=1;times=1;while flagsflags=0;times=times+1;%计算每个向量到聚类中心的欧氏距离for i=1:nfor j=1:kdist(i,j)=sqrt(sum((A(i,:)-cid(j,:)).^2));%欧氏距离 end%A(i,p+1)=min(dist(i,:));%与中心的最小距离[x,y]=find(dist(i,:)==min(dist(i,:)));[c,d]=size(find(y==A(i,p+1)));if c==0 %说明聚类中心变了flags=flags+1;A(i,p+1)=y(1,1);elsecontinue;endendiflagsfor j=1:kAsum=0;[r,c]=find(A(:,p+1)==j);cid(j,:)=mean(A(r,:),1);for m=1:length(r)Asum=Asum+sqrt(sum((A(r(m),:)-cid(j,:)).^2)); endCsum(1,j)=Asum;endsum(Csum(1,:))%if sum(Csum(1,:))>Csum2% break;%endCsum2=sum(Csum(1,:));Csum;cid; %得到新的聚类中心endtimesdisplay('A矩阵,最后一列是所属类别');Afor j=1:k[a,b]=size(find(A(:,p+1)==j));numK(j)=a;endnumKtimesxlswrite('data.xls',A);五、算法流程图六、实验结果>>Kmeans6 iterations, total sum of distances = 204.82110 iterations, total sum of distances = 205.88616 iterations, total sum of distances = 204.8219 iterations, total sum of distances = 205.886........9 iterations, total sum of distances = 205.8868 iterations, total sum of distances = 204.8218 iterations, total sum of distances = 204.82114 iterations, total sum of distances = 205.88614 iterations, total sum of distances = 205.8866 iterations, total sum of distances = 204.821Ctrs =1.0754 -1.06321.0482 1.3902-1.1442 -1.1121SumD =64.294463.593976.9329七、实验心得初始的聚类中心的不同,对聚类结果没有很大的影响,而对迭代次数有显著的影响。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三报告实验三-Kmeans算法实现
北华大学开放实验报告
实验名称:实验三Kmeans算法实现
所属课程:模式识别
班级:信息10—1
学号:36
姓名:张慧
实验三、K_means算法实现
一、背景知识简介:
Kmeans算法是一种经典的聚类算法,在模式识别中得到了广泛的应用,基于Kmeans的变种算法也有很多,模糊Kmeans、分层Kmeans 等。

Kmeans和应用于混合高斯模型的受限EM算法是一致的。

高斯混合模型广泛用于数据挖掘、模式识别、机器学习、统计分析。

Kmeans的迭代步骤可以看成E步和M步,E:固定参数类别中心向量重新标记样本,M:固定标记样本调整类别中心向量。

K均值只考虑(估计)了均值,而没有估计类别的方差,所以聚类的结构比较适合于特征协方差相等的类别。

二、k-means聚类算法
k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。

聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。

K-means算法的基本思想是:以空间中k个点
为中心进行聚类,对最靠近他们的对象归类。

通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

(1)算法思路:
首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。

一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。

该算法的最大优势在于简洁和快速。

算法的关键在于初始中心的选择和距离公式。

(2)算法步骤:
step.1---初始化距离K个聚类的质心(随机产生)
step.2---计算所有数据样本与每个质心的欧氏距离,将数据样本加入与其欧氏距离最短的那个质心的簇中(记录其数据样本的编号)
step.3---计算现在每个簇的质心,进行更新,判断新质心是否与原质心相等,若相等,则迭代结束,若不相等,回到step2继续迭代。

(3)算法流程图
开始
读入要分
设置初始
计算数据到
C个聚类中
将数据分入
与其距离最
计算新的
否聚类中心
是否收

输出C个分类

四、实验Matlab代码
k=4;
DATA=xlsread('zb0708.xls');
x=zeros(150,2);
x(1:150,1:2)=DATA(1:150,1:2);
%x=rand(150,2)*5;
[n,d] = size(x);
bn=round(n/k*rand);%第一个随机数在前1/K的范围内
nc=[x(bn,:);x(2*bn,:);x(3*bn,:);x(4*bn,:)];%初始聚类中心[cid,nr,centers] = kmeans(x,k,nc);%调用kmeans函数
for i=1:150,
if cid(i)==1,
plot(x(i,1),x(i,2),'r*') % 显示第一类
hold on
else
if cid(i)==2,
plot(x(i,1),x(i,2),'b*') %显示第二类
hold on
else
if cid(i)==3
plot(x(i,1),x(i,2),'g*') %显示第三类
hold on
else
if cid(i)==4
plot(x(i,1),x(i,2),'k*') %显示第四类
hold on
end
end
end
end
end
strt=['红色*为第一类;蓝色*为第二类;绿色*为第三类;黑色*为第四类' ];
text(-4,-3.6,strt);
五、实验结果
六、结果分析
结论(一):
初始均值设置的不同会影响迭代的次数以及各次迭代所产生的聚类中心,但它不会影响最后的分类结果。

结论(二):
数据的输入顺序不同,同样影响迭代次数,而对聚类结果没有太大的影响。

k均值算法的优点:
1.如果变量很大,k均值比层次聚类的计算速度更快(如果k很小)。

2.与层次聚类相比,k均值可以得到更紧密的簇,尤其是对于球状簇。

3.对大数据集,是可伸缩和高效率的。

4.算法尝试找出使平方误差函数值最小的k个划分。

当结果簇是密集的,而簇与簇之间区别明显的时候,效果较好。

K均值算法的缺点:
1. 没有指明初始化均值的方法。

常用的方法是随机的选取k个样本作为
均值。

2.产生的结果依赖于均值的初始值,经常发生得到次优划分的情况。


决方法是多次尝试不同的初始值。

3.可能发生距离簇中心m
i 最近的样本集为空的情况,因此, m
i
将得不到
更新。

这是一个必须处理的问题,但我们忽略该问题。

4.结果依赖于||x- m
i
||的度量单位。

一个常用的解决方法是用标准差规范各个变量,虽然这并非总是可取的。

结果还依赖于k值,所以难以比较聚类结果的优劣。

5.不适合发现非凸面形状的簇,并对噪声和离群点数据是较敏感的,因为少量的这类数据能够对均值产生极大的影响。

相关文档
最新文档