如何计算50×20矩阵内的类内散布

我正在尝试将一个高维矩阵降维到二维,我之前使用了一个二维数组的示例,这个方法是有效的,但我需要对更高维的散布进行同样的处理。我有两个类,每个类都有50×20维的特征空间矩阵。

在我的示例中,我有这些二维数组:

rectangles = np.array([[1,1.5,1.7,1.45,1.1,1.6,1.8],[1.8,1.55,1.45,1.6,1.65,1.7,1.75]])triangles = np.array([[0.1,0.5,0.25,0.4,0.3,0.6,0.35,0.15,0.4,0.5,0.48],[1.1,1.5,1.3,1.2,1.15,1.0,1.4,1.2,1.3,1.5,1.0]])

之后我计算了两个类三角形和矩形的均值

# 计算每个类的均值向量mean_rectangles = np.mean(rectangles,axis=1).reshape(2,1)    mean_triangles = np.mean(triangles,axis=1).reshape(2,1)

使用类矩形和三角形的均值计算散布:

scatter_triangles = np.dot((triangles-mean_triangles),(triangles-mean_triangles).T)scatter_circles = np.dot((circles-mean_circles),(circles-mean_circles).T)# 通过将类内散布相加计算SW SW = scatter_triangles+scatter_circles+scatter_rectanglesprint(SW)plt.show()

enter image description here

我想知道如何计算类内散布并以相同的方式绘制它们,具体来说是针对一个更大的数据集,即50×20的矩阵?

为了可重复性,这是我的代码:

    import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import stylestyle.use('fivethirtyeight')# 创建数据c_A_array = [[ 31,  25,  17,  62,  26,  23, 193, 143,  37,  29, 220, 216, 175, 195, 207, 198, 190, 222, 178, 214], [ 31,  26,  19,  59,  25,  23, 193, 140,  37,  29, 220, 216, 174, 195, 207, 198, 190, 220, 178, 214], [ 31,  23,  17,  67,  23,  22, 195, 147,  38,  31, 222, 215, 182, 195, 213, 198, 185, 221, 178, 207], [ 31,  23,  19,  67,  23,  23, 194, 144,  37,  31, 222, 218, 179, 198, 216, 198, 186, 221, 179, 207], [ 31,  28,  17,  65,  23,  22, 193, 142,  36,  31, 222, 217, 177, 195, 216, 196, 182, 220, 174, 207]]c_B_array = [[ 16,  24,  33,  43,  43,  58, 163,  76,  57, 105, 205, 200, 193, 188, 186, 193, 182, 227, 193, 227], [  9,  13,  22,  36,  13,  49, 163,  39,  33, 105, 204, 200, 193, 191, 188, 193, 183, 224, 194, 227], [ 23,  17,  10,  28,  21,  40, 166,  46,  28, 102, 208, 206, 196, 198, 195, 202, 190, 225, 196, 229], [ 25,  19,  11,  30,  23,  39, 166,  46,  26,  99, 208, 206, 199, 196, 198, 201, 189, 227, 198, 231], [ 25,  20,  12,  31,  25,  40, 169,  48,  27, 101, 211, 206, 198, 198, 196, 202, 190, 226, 198, 229]]#绘制数据fig = plt.figure(figsize=(10,10))ax0 = fig.add_subplot(111)ax0.scatter(c_A_array[0],c_A_array[1],marker='s',c='grey',edgecolor='black')ax0.scatter(c_B_array[0],c_B_array[1],marker='o',c='blue',edgecolor='black')# 计算每个类的均值向量c_A_array_mean = np.mean(c_A_array,axis=1)c_B_array_mean = np.mean(c_A_array,axis=1)# 计算类内散布矩阵SW并将元素相加scatter_c_A_array = np.dot((c_A_array-c_A_array_mean),(c_A_array-c_A_array_mean).T)scatter_c_B_array = np.dot((c_B_array-c_B_array_mean),(c_B_array-c_B_array_mean).T)# 通过将类内散布相加计算SW SW = scatter_c_A_array+scatter_c_B_arrayprint(SW)plt.show()

我得到了以下错误:

ValueError: 操作数无法广播在一起,形状为(5,20) 和 (5,)


回答:

遗憾的是,Numpy无法将数组广播到列上。尝试使用以下方法:

(np.array(c_A_array).T-c_A_array_mean).T 

用于所有减法操作。

这也可行,我尝试了这两种方法,猜测第二种方法更快:

np.array(c_A_array)-c_A_array_mean.reshape((5,1))

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注