任务一:计算特征均值方差相关性

数据集pima.arff:

【1】Pregnant:怀孕次数
【2】plasma-glucose:葡萄糖
【3】diastolic-blood-pressure:血压
【4】Triceps-skin-fold-pressure:皮层厚度 
【5】2-Hour-serum-Insulin:胰岛素 2小时血清胰岛素
【6】Body-mass-index:体重指数 (体重/身高)^2
【7】Diabetes-pedigree-function:糖尿病谱系功能
【8】Age:年龄 
【9】class:类标签 {0, 1}

第一步:读取数据集

从scipy.io库中导入arff函数,使用pandas库的数据类型Dataframe进行存取:

# 横纵向显示参数
pd.set_option('display.max_columns', 10)
# pd.set_option('display.max_rows', None)
pd.set_option('display.width', 1000)

data, meta = arff.loadarff('./pima.arff')
df = pd.DataFrame(data)

第二步:计算各个特征的均值方差

均值(公式略)代码如下:

num_rows = df.shape[0]
num_cols = df.shape[1]-1
# 均值
totals = num_cols * [0.0]
time_begin = time.time()
for row in data:
    for i in range(num_cols):
        totals[i] += row[i]
mean = [total / num_rows for total in totals]
time_end = time.time()
# print(totals)
for i in range(num_cols):
    print("特征{0}均值:{1:.5f}".format(df.columns[i], mean[i]))
print("用时:{0}s \r\n".format(time_end-time_begin))

  方差公式、代码如下:

{S_{n}}^{2}=\frac{1}{n}\sum_{i=1}^{n}\left ( x_{i} -\overline{x}\right )^{2}

# 方差
demos = num_cols * [0.0]
time_begin = time.time()
for row in data:
    for i in range(num_cols):
        demos[i] += (row[i]-mean[i])**2
var = [demo / num_rows for demo in demos]
time_end = time.time()
for i in range(num_cols):
    print("特征{0}方差:{1:.5f}".format(df.columns[i], var[i]))
print("用时:{0}s \r\n".format(time_end-time_begin))

如上计算均值方差时需要各扫描一趟数据集,即扫描两趟才能得出结果。 想要扫描一趟数据集同时得出均值和方差,则需要用到方差的另一个变形公式:

DX^{2}=EX^{2}-\left ( EX \right )^{2}

# 扫一趟数据集
print("扫描一趟数据集:")
nums1 = num_cols * [0.0]
nums2 = num_cols * [0.0]
time_begin = time.time()
for row in data:
    for i in range(num_cols):
        nums1[i] += row[i]
        nums2[i] += (row[i])**2

mean2 = [num1 / num_rows for num1 in nums1]
var2 = [num2 / num_rows - (num1) ** 2 / (num_rows) ** 2 for num1, num2 in zip(nums1, nums2)]

time_end = time.time()
for i in range(num_cols):
    print("特征{0}均值:{1:.5f}".format(df.columns[i], mean2[i]))
for i in range(num_cols):
    print("特征{0}方差:{1:.5f}".format(df.columns[i], var2[i]))
print("总用时:{0}s \r\n".format(time_end-time_begin))

 第三步:计算特征两两之间的相关性(类标签列除外)

 相关系数公式代码如下,其中Cov(X, Y)为X与Y的协方差,Var[X]为X的方差,Var[Y]为Y的方差:

 r\left ( X, Y \right )=\frac{Cov\left ( X, Y \right )}{\sqrt{Var\left [ X \right ]Var\left [ Y \right ]}}

Cov\left ( X, Y \right )=EXY-EXEY

 或                                        Cov\left ( X, Y \right )=E[\left ( X-E\left ( X \right ) \right )\left ( Y-E\left ( Y \right ) \right )]

def cov(x, mean_x, y, mean_y):
    total = 0.0
    for index in range(num_rows):
        total += (x[index] - mean_x) * (y[index] - mean_y)
    cov_xy: float = total / num_rows
    # print(cov_xy)
    return cov_xy


r = np.ones((num_cols, num_cols))
for i in range(0, num_cols):
    for j in range(i + 1, num_cols):
        r[i][j] = cov(df.values[:, i], mean[i], df.values[:, j], mean[j]) / ((var[i] * var[j]) ** 0.5)
        j += 1
    i += 1
print(r)

第四步:调用函数进行校对

# 校对
print(df.mean())
# pandas_var的标准偏差ddof默认为1
print(df.var(axis=0, ddof=0))
# numpy_var的标准偏差ddof默认为0
print(np.var(df, axis=0))
# 或者:
# df.loc[len(df)] = df.mean()
# df.loc[len(df)] = df[:len(df)].var()

print(df.corr())

最后,关于Dataframe的一些常用函数:

取列名 .columns

通过列名x, y, ...取列  .loc[:, 'x', ' y', ...]

通过列索引x取列  .iloc[:, x]

保存代码所在py:1001_2.py 1004.py 1006.py

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用matplotlib库来绘制均值方差图。你可以使用matplotlib.pyplot.bar()函数绘制水平条形图,matplotlib.pyplot.barh()函数绘制垂直条形图,matplotlib.pyplot.boxplot()函数绘制箱线图,以及matplotlib.pyplot.scatter()函数绘制散点图。 ### 回答2: Python可以使用Matplotlib库来绘制均值方差图。以下是一个简单的示例: 首先,我们需要引入Matplotlib库和Numpy库: import matplotlib.pyplot as plt import numpy as np 接下来,我们可以生成一些随机数作为示例数据: data = np.random.normal(size=100) 然后,我们可以计算数据的均值方差: mean = np.mean(data) variance = np.var(data) 接下来,我们可以创建一个空的图形和子图: fig, ax = plt.subplots() 然后,我们可以绘制数据的直方图: ax.hist(data, bins=20, alpha=0.5) 接着,我们可以在图形上绘制均值方差的线: ax.axvline(x=mean, color='r', linestyle='--', linewidth=2, label='Mean') ax.axvline(x=mean+np.sqrt(variance), color='b', linestyle='--', linewidth=2, label='Mean + Std') ax.axvline(x=mean-np.sqrt(variance), color='b', linestyle='--', linewidth=2, label='Mean - Std') 最后,我们可以添加图例和标题,并显示图形: ax.legend() plt.title('Mean and Variance Plot') plt.show() 这样,我们就可以使用Python的Matplotlib库绘制出均值方差图了。 ### 回答3: Python的matplotlib库可以绘制均值方差图。以下是一个简单的例子: ```python import matplotlib.pyplot as plt import numpy as np # 生成一组随机数据 data = np.random.normal(loc=0, scale=1, size=1000) # 计算均值方差 mean = np.mean(data) variance = np.var(data) # 绘制数据的直方图 plt.hist(data, bins=30, color='blue', alpha=0.5) # 绘制均值的竖线 plt.axvline(x=mean, color='red', linestyle='dashed', linewidth=2, label='Mean') # 绘制方差的区间 plt.axvspan(mean-variance, mean+variance, facecolor='gray', alpha=0.2, label='Variance') # 添加图例和标题 plt.legend() plt.title('Mean-Variance Plot') # 显示图形 plt.show() ``` 这个例子首先生成了1000个随机数据,并计算了其均值方差。然后使用`plt.hist()`绘制了数据的直方图,使用`plt.axvline()`绘制了均值的竖线,使用`plt.axvspan()`绘制了方差的区间。最后添加了图例和标题,并通过`plt.show()`显示图形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值