【计量地理学】实验一 地理数据的基本统计分析

发布于:2025-03-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

阅前提示:

计量地理学实验课的实验报告为当堂提交,相较以往实验报告缺少打磨与整理的时间,因此内容中不可避免出现相关错误!!!

出于个人完美主义的原则本不愿发布(其实就是黑历史),但考虑到计量地理学实验课难度与部分同学要求,还是决定将此内容更新至主页中,主要帮助大家了解实验课的基本内容,以下内容并不代表正确解法,也无法作为正确参考

该实验课给分友好,只需要为各位同学认真做实验与编写报告,哪怕没有做出最终结果,也可以轻松满绩。

一、实验结果

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#中的函数有如下所示几项:

  1. Math.Pow(x, y): 该函数主要用于计算x的y次幂,在计算方差和偏度时,我们使用了该函数来计算平方和和立方和;
  2. Math.Sqrt(x): 该函数主要用于计算x的平方根,在计算标准差和标准差的无偏估计时,我们使用了该函数来对方差进行开方操作以获得标准差;
  3. List<T>.Sort(): Sort()函数是List<T>类中的一个方法,该函数用于对列表中的元素进行排序,在计算中位数时,我们使用了这个方法对存储数据的列表进行升序排序,大大减轻了我们在进行中位数判断时的工作。

网站公告

今日签到

点亮在社区的每一天
去签到