1、回归方程数据处理回归方程数据处理实验姓名: 沟超辉学号:101001106 一、实验目的回归分析是数理统计中的一个重要分支,在工农业生产和科学研究中有着广泛的应用。通过本次实验要求掌握一元线性回归和一元非线性回归。二、实验原理回归分析是处理变量之间相关关系的一种数理统计方法。即用数学的方法,对大量的观测数据进行处理,从而得出比较符合事物内部规律的数学表达式。利用最小二乘估计,得到一元线性回归的回归方程为y =b0+bx式中b0,b为回归方程的回归系数,y代表抗剪强度。求出xi,yi,xi2,y i 2,xiyi,xiyi于是x=1/nxi, y=1/nyilxx =xi2 (xi)2 /nlx
2、y =xiyi (xiyi)/nb= lxy / lxxb0=y-bx三、实验内容及程序结果(一)(1)材料的抗剪强度与材料承受的正应力有关。对某种材料试验的数据如下正应力x/pa26.825.423.627.7抗剪强度y/pa26.527.327.123.623.924.728.126.927.422.625.625.926.322.521.721.425.824.9假设正应力是精确的,求抗剪强度与正应力的线性回归方程 当正应力为24.5pa时,抗剪强度的估计值?程序及运行结果:for i=0X=26.8 25.4 23.6 27.7 23.9 24.7 28.1 26.9 27.4 22.
3、6 25.6; Y=26.5 27.3 27.1 23.6 25.9 26.3 22.5 21.7 21.4 25.8 24.9; N=length(X); lxx=sum(X.*X)-sum(X).2./N; lxy=sum(X.*Y)-sum(X).*sum(Y)/N; b=lxy./lxx; b0=mean(Y)-b.*mean(X); x=(21:0.01:31); y=b.*x+b0; plot(X,Y,b*,x,y,r-)end实验结果:lxx= 43.0467lxy= -29.5333b= -0.6861b0=42.5818材料的抗剪强度与材料承受的正应力关系为:y=42.581
4、8-0.6861x实验内容及程序结果(二)(2)下表给出在不同质量下弹簧长度的观测值(设质量的观测值无误差):质量/g51015202530长度/cm7.258.128.959.9010.911.8 做散点图,观察质量与长度之间是否呈线性关系;求弹簧的刚性系数和自由状态下的长度。程序及运行结果:for i=0X=5 10 15 20 25 30;Y=7.25 8.12 8.95 9.90 10.9 11.8;N=length(X);lxy=sum(X.*Y)-sum(X).*sum(Y)./N;lxx=sum(X.*X)-(sum(X).2)./N;b=lxy./lxx;b0=mean(Y)-
5、b.*mean(X);x=(5:0.01:30);y=b.*x+b0;plot(X,Y,b*,x,y,r-)end以刚性系数k=b=0.1831,自由长度x0=b0=6.2827四、实验小结一元回归是处理两个变量之间的关系,即两个变量x和y之间若存在一定的关系,则可通过实验的方法,分析所得数据,找出两者之间关系的经验公式。假如两个变量之间的关系是线性的就称为一元线性回归,这就是工程上和科研中场遇到的直线拟合问题。Java实现k-means1.数据来源描述本数据集中一共包含600组数据,每一组数据都有60个分量,也就是数据是60维的。数据一共可以分成6个聚类,分别是:1-100 Normal (
6、正常)101-200 Cyclic (循环)201-300 Increasing trend (增加趋势)301-400 Decreasing trend (减少趋势)401-500 Upward shift (上升变化)501-600 Downward shift (下降变化)2.数据预处理由于本数据集的数据维数较多,所以本实验采用了结构体来存储60维的数据,并使用指针来进行对数据的操作,以提高速度。在数据预处理过程中,首先将数据从data文件中读出,后依次存入结构体数组dataset600中。3.k-means聚类算法 k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为
7、 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。(1)算法思路:首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然
8、后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。(2)算法步骤:step.1-初始化距离K个聚类的质心(随机产生)step.2-计算所有数据样本与每个质心的欧氏距离,将数据样本加入与其欧氏距离最短的那个质心的簇中(记录其数据样本的编号)step.3-计算现在每个簇的质心,进行更新,判断新质心是否与原质心相等,若相等,则迭代结束,若不相等,回到step2继续迭代
9、。4.数据挖掘实现的源代码/111060850.cpp KMeans聚类算法/ #include stdafx.h#include#include#include#include#include#includeusing namespace std;const int N=36000; /数据个数const int D=60; /数据维度struct DataSet /用来存储数据的结构体 double argD;const int K=6; /集合个数int *CenterIndex; /质心索引集合/struct DataSet *Center; /质心集合/struct DataSet
10、*CenterCopy;DataSet CenterK; /保存现在的质心DataSet CenterCopyK; /保存上一次迭代中的质心/double *DataSet;int Cluster6N/D; /保存每个簇包含的数据的索引值int *Top; ifstream fin;char ch;string fDataSetN/DD;/*算法描述:kmeans聚类算法采用的是给定类的个数K,将N个元素(对象)分配到K个类中去使得类内对象之间的相似性最大,而类之间的相似性最小 */数据存储在结构体中/函数声明部分void InitData(struct DataSet* dataset);/
11、对数据集进行初始化,从文件中将其读取出后转化为double型依次存入结构体中void InitCenter(struct DataSet* dataset);/初始化质心void CreateRandomArray(int n,int k,int *centerIndex);/随机产生一组索引值,用于初始化质心void CopyCenter(struct DataSet* dataset);/复制保存上一次迭代的质心void UpdateCluster(struct DataSet* dataset);/更新簇void UpdateCenter(struct DataSet* dataset)
12、;/更新质心int GetIndex(struct DataSet* dataset,struct DataSet* centerIndex);/本程序的核心,计算每一数据元素属于哪一个聚类,并返回其索引值void AddtoCluster(int index,int value);/根据索引值将数据元素的索引加入到簇之中void print(struct DataSet* dataset);bool IsEqual(struct DataSet* value1,struct DataSet* value2);/判断现有质心和上一次迭代的质心是否相等double DoubletoString(
13、const char* str);/string转化为double型的函数double Euclidean(struct DataSet* value1,struct DataSet* value2);/计算欧几里得距离函数int main(int argc, char* argv) int Flag=1; double ttime=0,start=0,end=0; start=clock(); DataSet datasetN/D; InitData(dataset); /* for(int i=0;iN/D;i+) for(int j=0;jD;j+) coutdataseti.argj
14、; coutendl;*/ while(Flag) UpdateCluster(dataset); UpdateCenter(dataset); if(IsEqual(Center,CenterCopy) Flag=0; else CopyCenter(dataset); end=clock(); ttime=(double)(end - start) / CLOCKS_PER_SEC; print(dataset); getchar(); return 0;void InitData(struct DataSet* dataset) int i=0,j=0; CenterIndex =new
15、 int sizeof(int)*K; Top =new int sizeof(int)*K; / Cluster =new int* sizeof(int*)*K; /从文件中读入数据,存入fDataSet数组中,此数组为string类型 /然后通过转化成double型存入DataSet数组之中。 cout开始从文件读入数据endl; fin.open(synthetic_control.data); for(i=0;iN/D;i+) for(j=0;jch; fDataSetij=fDataSetij+ch; dataseti.argj=DoubletoString(fDataSetij.
16、c_str(); while(fin.peek()=n|fin.peek()= ) fin.get(); fin.close(); cout数据已读入endl; InitCenter(dataset); UpdateCluster(dataset);void InitCenter(struct DataSet* dataset) int i=0; /产生随即的K个N的不同的序列 CreateRandomArray(N/D,K,CenterIndex); for(i=0;iK;i+) for(int j=0;jD;j+) Centeri.argj = datasetCenterIndexi.ar
17、gj; /coutCenteri endl; CopyCenter(dataset); void CreateRandomArray(int n,int k,int *centerIndex) int i=0,j=0; for(i=0;iK;i+) int a=rand()%n; for(j=0;j=i) centerIndexi=a; else i-; void CopyCenter(struct DataSet* dataset) int i=0; for(i=0;iK;i+) CenterCopyi=Centeri; void UpdateCluster(struct DataSet*
18、dataset) int i=0; int tindex; for(;iK;i+) Topi=0; for(i=0;iN/D;i+) tindex=GetIndex(&dataseti,Center); /tindex是指dataseti属于第tindex个簇 AddtoCluster(tindex,i); /把dataseti加入到所属的簇当中 int GetIndex(struct DataSet* value,struct DataSet* center) int i=0; int index=i; / double min=fabs(value-centeri); double min
19、=Euclidean(value,¢eri); for(i=0;iK;i+) if(Euclidean(value,¢eri)min) index=i; min=Euclidean(value,¢eri); return index;void AddtoCluster(int index,int value) ClusterindexTopindex = value; Topindex+;double DoubletoString(const char* str) double temp = 0.0,wt = 10.0; bool flag = true; int i;
20、 for(i=0 ;i*(str+i)!=0;i+) if(flag&*(str+i)=46) /若遇到小数点则置标志位为false,则后面读入的 flag = false; /char转化为小数形式 else if(flag) /整数部分 temp = (int)(*(str+i)-48)+temp*10; else temp = temp + (int)(*(str+i)-48)/wt; /小数部分 wt = wt*10; return temp;double Euclidean(struct DataSet* value1,struct DataSet* value2) double t
21、emp=0,sum=0; for(int i=0;iargi-value2-argi)*(value1-argi-value2-argi); temp = sqrt(sum); return temp;bool IsEqual(struct DataSet* value1,struct DataSet* value2) int i; for(i=0;iK;i+) for(int j=0;jD;j+) if(value1i.argj!=value2i.argj) return 0; return 1;void UpdateCenter(struct DataSet* dataset) int i
22、=0,j=0; double sum; for(i=0;iK;i+) for(int d=0;dD;d+) sum=0.0; for(j=0;j0) Centeri.argd=sum/Topi; void print(struct DataSet* dataset) int i,j,d; ofstream fout(result.txt); cout=endl; fout=endl; for(i=0;iK;i+) cout第i组:质心为:; for(d=0;dD;d+) coutCenteri.argdt; coutendl; cout数据元素为:n; /- /输入文件中 fout第i组:质心
23、为:; for(d=0;dD;d+) foutCenteri.argdt; foutendl; fout数据元素为:n; for(j=0;jTopi;j+) for(d=0;dD;d+) coutdatasetClusterij.argdt; foutdatasetClusterij.argdt; / foutClusterijt; coutendl; foutendl; coutendl; foutendl; fout 总共用时:ttime 毫秒endl; fout.close(); 5.获取的模型的描述首先,准备数据,对数据进行预处理 ,选用合适的数据结构存储数据元组,然后设定参数,数据的
24、总量N,维度D,聚类类别数量K,然后随机产生K个D维的数据作为质心,计算每个数据与质心距离,并加入所属的簇中,经多次迭代后,质心不变后,得到分类后的结果。6.实验运行结果和实验分析数据挖掘对处理后的数据采用k-means聚类算法,将聚类后的结果输入到文件中(图1),实验的结果:图1结果将数据元组分成了6类,按期每个分量的变化规律分别表示上文所说的6个类别。在文档最后输出聚类分析花费的时间(图2)是1762毫秒。图2由于初始化质心是随机的,所以每次运行聚类分析花费的时间略有不同,本实验采用结构体来存储数据,聚类的操作多应用指针来实现,在选择所属的簇,并加入簇中,加入的是数据的索引值,提高了效率,在一步中如果使用指针指向数据可以进一步提高效率。总体上说算法的运行时间还是比较令人满意。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1