阅前提示:
计量地理学实验课的实验报告为当堂提交,相较以往实验报告缺少打磨与整理的时间,因此内容中不可避免出现相关错误!!!
出于个人完美主义的原则本不愿发布(其实就是黑历史),但考虑到计量地理学实验课难度与部分同学要求,还是决定将此内容更新至主页中,主要帮助大家了解实验课的基本内容,以下内容并不代表正确解法,也无法作为正确参考。
该实验课给分友好,只需要为各位同学认真做实验与编写报告,哪怕没有做出最终结果,也可以轻松满绩。
一、实验结果
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>类中的一个方法,该函数用于对列表中的元素进行排序,在计算中位数时,我们使用了这个方法对存储数据的列表进行升序排序,大大减轻了我们在进行中位数判断时的工作。