阅前提示:
计量地理学实验课的实验报告为当堂提交,相较以往实验报告缺少打磨与整理的时间,因此内容中不可避免出现相关错误!!!
出于个人完美主义的原则本不愿发布(其实就是黑历史),但考虑到计量地理学实验课难度与部分同学要求,还是决定将此内容更新至主页中,主要帮助大家了解实验课的基本内容,以下内容并不代表正确解法,也无法作为正确参考。
该实验课给分友好,只需要为各位同学认真独立自主做实验与编写报告,哪怕没有做出最终结果,也可以得到自己理想的分数。
一、实验结果
1.计算最小值:计算最小值的代码与逻辑都较为简单,我们可以仿照老师所提供的计算最大值的代码,修改其中的if (p.z < curMin)的符合即可:
double Min(){// 首先检验是否打开了文件if (PointList == null) return -9999;if (PointList.Count == 0) return -9999;Point p = (Point)PointList[0];double curMin = p.z;// 将第一个点的z值赋值给当前的最小值// 遍历点集,一一与当前的最小值进行对比for (int i = 1; i < PointList.Count; i++){p = (Point)PointList[i];if (p.z < curMin)curMin = p.z;}return curMin;}
2.计算均值:计算均值我们只需要首先计算z值的总和,然后将总和除以个数即可:
double Mean(){
// 首先检验是否打开了文件if (PointList == null) return -9999;if (PointList.Count == 0) return -9999;double sum = 0;# 计算总和foreach (Point p in PointList){sum += p.z;}return sum / PointList.Count; # 用总和除以个数即为均值}
3.计算中位数:计算数据的中位数我们主要使用到了C# 中用于对列表进行排序的方法,它可以按升序或者指定的比较规则来对列表中的元素进行排序,在这里通过查阅相关网上资料,我们使用 Sort() 方法来对 sort列表进行排序,以便能够计算中位数。
需要额外考虑的是列表中数据的个数,如果数据个数为偶数,我们则需要进行一个平均值的计算,如果数据数量为奇数,则可以直接获得中间值:
double Median(){// 首先检验是否打开了文件if (PointList == null) return -9999;if (PointList.Count == 0) return -9999;// 创建一个列表用于存储排序后的数据List<double> sort = new List<double>();// 获取点数据foreach (Point p in PointList){sort.Add(p.z);}// 利用sort方法进行排序sort.Sort();// 获取数据的个数int n = sort.Count;if (n % 2 == 0){return (sort[n / 2] + sort[(n / 2) - 1]) / 2.0;}else{return sort[n / 2];}}
4.计算方差:根据方差的公式可知,方差的计算需要使用到均值,因此我们可以直接使用上述步骤中创建的Mean函数获得均值,再利用C#中的Math.Pow函数用以计算各个数据与均值间的差的平方和,即可得到平方差和,除以个数即为方差:
double Variance(){// 首先检验是否打开了文件if (PointList == null) return -9999;if (PointList.Count == 0) return -9999;// 直接使用Mean函数获得中间值double mean = Mean();double sumSquared = 0;// 循环获得各点与均值的平方差最后求和foreach (Point p in PointList){sumSquared += Math.Pow(p.z - mean, 2);}// 平方差和除以个数即可得到方差return sumSquared / PointList.Count;}
5.计算标准差:标准差的计算直接利用上述实验步骤中获得的方差,再利用C#中的Math.Sqrt函数开方即可:
double StdDev(){// 利用Sqrt方法进行开方return Math.Sqrt(Variance());}
6.计算标准差的无偏估计:计算标准差的无偏估计与计算标准差同理,根据公式可知,我们只需要首先获得标准差,再利用Math.Sqrt函数即可得到结果:
double UnbiasedStdDev(){double stdDev = StdDev();return stdDev * Math.Sqrt(PointList.Count / (PointList.Count - 1.0));}
7.计算变异系数:根据变异系数的公式可知,由我们上述代码中获得的均值除以方差即可:
double CoefficientOfVariation(){double mean = Mean();double stdDev = StdDev();return stdDev / mean}
8.计算偏度系数:根据偏度系数的公式可知,我们可以再次利用先前步骤中使用到的Math.Pow方法,用以计算各个数据与均值间的立方和,最后除以标准差的立方即可:
double Skewness(){// 首先检验是否打开了文件if (PointList == null) return -9999;if (PointList.Count == 0) return -9999;// 利用已有函数获得均值与方差double mean = Mean();double stdDev = StdDev();// 用于存储每个数据点与均值的差的立方double sumL = 0;// 循环计算数据点与均值的差的立方和foreach (Point p in PointList){sumL += Math.Pow(p.z - mean, 3);}return (sumL / (PointList.Count * Math.Pow(stdDev, 3)));}
9.计算峰度系数:根据峰度系数的公式可知,该系数计算的代码思路与偏度系数基本相同,只不过一个主要使用到立方,一个主要使用到四次方,因此我们可以直接仿照偏度系数计算的代码最后结果如下所示:
double Kurtosis(){// 首先检验是否打开了文件if (PointList == null) return -9999;if (PointList.Count == 0) return -9999;double mean = Mean();double stdDev = StdDev();// 用于存储每个数据点与均值的差的四次方double sumFourth = 0;// 循环计算数据点与均值的差的四次方和foreach (Point p in PointList){sumFourth += Math.Pow(p.z - mean, 4);}return (sumFourth / (PointList.Count * Math.Pow(stdDev, 4))) - 3;}
二、实验心得
此次实验是我们第一次接触在C# 环境下进行代码的编写,在此前使用较多的代码编写语言均为Python,但在实际接触编写过后可以发现,其背后的根本逻辑都是一致的,我们需要额外注意与学习的点主要在于:如何灵活的运用C#中相关的函数与方法,因此在正式编写代码前我花费了较多的时间学习C#中主要的代数运算函数,大大减轻了我在代码编写中的任务,此次实验中我们主要使用到的C#中的函数有如下所示几项:
- Math.Pow(x, y): 该函数主要用于计算x的y次幂,在计算方差和偏度时,我们使用了该函数来计算平方和和立方和;
- Math.Sqrt(x): 该函数主要用于计算x的平方根,在计算标准差和标准差的无偏估计时,我们使用了该函数来对方差进行开方操作以获得标准差;
- List<T>.Sort(): Sort()函数是List<T>类中的一个方法,该函数用于对列表中的元素进行排序,在计算中位数时,我们使用了这个方法对存储数据的列表进行升序排序,大大减轻了我们在进行中位数判断时的工作。