python

导入所需库

import numpy as np
from sklearn.neighbors import NearestNeighbors

trainJKNN 函数

def trainJKNN(dtrn, K):
    nbrs = NearestNeighbors(n_neighbors=K).fit(dtrn)
    knnMatrix, disMatrix = nbrs.kneighbors(dtrn)
    return knnMatrix, disMatrix

trainJKNN 函数接受训练数据集 dtrn 和一个整数 K 作为输入。这个函数首先创建一个 NearestNeighbors 对象并使用 K 作为参数。然后,该对象使用 fit 方法对训练数据集进行拟合。接下来,我们调用 kneighbors 方法来获取训练数据集中每个样本的 K 个最近邻。kneighbors 方法返回两个矩阵:knnMatrix(索引矩阵)和 disMatrix(距离矩阵)。最后,该函数返回这两个矩阵。

testJKNN

def testJKNN(x, dtrn, J, knnMatrix, disMatrix):
    nbrs = NearestNeighbors(n_neighbors=J).fit(dtrn)
    _, J_indices = nbrs.kneighbors([x])
    J_neighbors = J_indices[0]
    neighbors_of_J_neighbors = knnMatrix[J_neighbors]
    score = np.mean(disMatrix[J_neighbors])
    return score

testJKNN 函数接受测试样本 x、训练数据集 dtrn、整数 JknnMatrixdisMatrix 作为输入。这个函数首先创建一个 NearestNeighbors 对象并使用 J 作为参数。然后,该对象使用 fit 方法对训练数据集进行拟合。接下来,我们调用 kneighbors 方法来获取测试样本 x 在训练数据集中的 J 个最近邻。我们只关心索引,所以只获取 J_indices。然后我们提取出 J_neighborsJ_indices 的第一行)。接着,我们计算 disMatrix(距离矩阵)中这些邻居的平均距离,作为 score。最后,该函数返回 score

find_reverse_neighbors

def find_reverse_neighbors(x, dtrn, J, knnMatrix):
    reverse_neighbors = []
    x_index = np.where((dtrn == x).all(axis=1))[0][0]
    for i, neighbors in enumerate(knnMatrix):
        if any(x_index == J for x_index in neighbors):
            reverse_neighbors.append(i)
    return reverse_neighbors

find_reverse_neighbors 函数用于寻找测试样本 x 的逆近邻。首先,我们找到测试样本 x 在训练数据集 dtrn 中的索引 x_index。接下来,我们遍历 knnMatrix(索引矩阵),检查每个训练样本的近邻中是否包含 x_index。如果是,则将该训练样本的索引添加到 reverse_neighbors 列表中。最后,该函数返回 reverse_neighbors 列表。

find_reverse_neighbors_v2

def find_reverse_neighbors_v2(x, dtrn, J, knnMatrix, disMatrix):
    reverse_neighbors = []
    x_index = np.where((dtrn == x).all(axis=1))[0][0]
    for i, neighbors in enumerate(knnMatrix):
        for j, neighbor in enumerate(neighbors):
            if neighbor == x_index and disMatrix[i, j] != 0:
                reverse_neighbors.append(i)
                break
    return reverse_neighbors

find_reverse_neighbors_v2 函数是另一种寻找测试样本 x 的逆近邻的方法。与 find_reverse_neighbors 函数类似,我们首先找到测试样本 x 在训练数据集 dtrn 中的索引 x_index。接着,我们遍历 knnMatrix(索引矩阵)和 disMatrix(距离矩阵),检查每个训练样本的近邻中是否包含 x_index,同时检查对应的距离是否不为零。如果满足这两个条件,则将该训练样本的索引添加到 reverse_neighbors 列表中,并跳出当前内层循环。最后,该函数返回 reverse_neighbors 列表。

testROCNN

def testROCNN(x, dtrn, J, knnMatrix, disMatrix, method=1):
    if method == 1:
        reverse_neighbors = find_reverse_neighbors(x, dtrn, J, knnMatrix)
    elif method == 2:
        reverse_neighbors = find_reverse_neighbors_v2(x, dtrn, J, knnMatrix, disMatrix)
    else:
        raise ValueError("Invalid method. Choose method 1 or 2.")

    mean_distances = np.mean(disMatrix[reverse_neighbors], axis=1)
    non_zero_mean_distances = mean_distances[np.nonzero(mean_distances)]
    score = np.mean(non_zero_mean_distances) if non_zero_mean_distances.size > 0 else 0
    return score

testROCNN 函数接受测试样本 x、训练数据集 dtrn、整数 JknnMatrixdisMatrix 和一个可选的方法参数作为输入。根据所选的方法(1 或 2),该函数调用相应的 find_reverse_neighborsfind_reverse_neighbors_v2 函数来寻找测试样本 x 的逆近邻。接着,我们计算这些逆近邻的平均距离(mean_distances)。然后,我们从 mean_distances 中提取非零元素(non_zero_mean_distances)。如果 non_zero_mean_distances 非空,我们计算其均值作为 score,否则 score 为 0。最后,该函数返回 score

可以尝试以下方法来提高 JKNN 的得分:

  1. 调整参数: 调整 K 和 J 的值。尝试用不同的 K 和 J 值进行训练和测试,以找到最佳组合。这可以通过网格搜索、随机搜索或贝叶斯优化等技术实现。
  2. 特征选择: 使用特征选择技术,如递归特征消除(Recursive Feature Elimination,RFE)、基于 LASSO 的特征选择或树模型(如随机森林)的特征重要性。这可以帮助减少数据集的噪音和维度,并提高算法的性能。
  3. 特征缩放: 通过标准化(Standardization)或归一化(Normalization)等方法对特征进行缩放,确保特征在相同的尺度上。这对于基于距离的算法(如 KNN)来说非常重要,因为它们对尺度敏感。
  4. 数据预处理: 对数据进行清洗、去除异常值和噪声,以提高模型的性能。
  5. 模型集成: 使用多个模型进行集成,如 Bagging、Boosting 或 Stacking。这可以帮助提高模型的泛化能力,并减少单个模型的过拟合风险。
  6. 交叉验证: 使用交叉验证(如 K 折交叉验证)评估模型的性能,以确保模型在不同子集上的表现稳定。

请注意,这些方法并不保证一定能提高 JKNN 的得分,但它们通常可以帮助改进基于距离的分类器(如 KNN)的性能。实际效果可能因数据集和具体问题而异。

关于提高 JKNN 的 score,有以下几点建议:

  1. 选择合适的 JK 值。不同的 JK 值可能会导致不同的性能。您可以尝试使用交叉验证来选择最佳参数。
  2. 数据预处理:对数据进行归一化或标准化处理,以消除特征之间的量纲差异。
  3. 特征选择/降维:对数据集进行特征选择或降维(例如,使用主成分分析(PCA)),以消除不必要的特征或降低数据维度。
  4. 使用其他距离度量:您可以尝试使用其他距离度量(例如,曼哈顿距离、马氏距离等),以便更好地捕捉数据集中的相似性。
  5. 集成方法:将多个分类器的结果结合起来,以提高预测性能。例如,可以使用 bagging 和 boosting 方法。

请使用修复后的 testROCNN 函数,并尝试上述方法以提高 JKNN 的 score。如有任何问题,请随时告诉我。

要在 Python 中打开和预览 MATLAB 文件,您可以使用 scipy.io 库中的 loadmat 函数。loadmat 函数可以读取 MATLAB 保存的 .mat 文件,并将其加载为 Python 中的字典。这是一个简单的示例:

import scipy.io

# 加载 .mat 文件
mat_file = scipy.io.loadmat('your_matlab_file.mat')

# 预览文件内容
for key in mat_file:
    print("Key: ", key)
    print("Value: ", mat_file[key])

请将 your_matlab_file.mat 替换为您要打开的 MATLAB 文件的路径。这个代码片段将打印出文件中所有变量的名称及其对应的值。如果您需要更详细的预览,可以根据需要自定义输出。

X=xlsread('xunliannew.xlsx');
Xtrain1 = X(:,2:end);
for i=1:1:3000
    for j=1:1:72
        Xtrain(1,j,1,i)=Xtrain1(i,j); % 输入数据维度转化
    end
end
ytrain=X(:,1);
ytrain=categorical(ytrain); % 函数包要求标签类型是categorical
layers = [ ...
    imageInputLayer([1 72 1])%%2D-CNN
    convolution2dLayer([1,6],4)
    reluLayer
    maxPooling2dLayer([1 6],'Stride',6)
    convolution2dLayer([1,6],4)
    reluLayer
    maxPooling2dLayer([1 6],'Stride',6)
    fullyConnectedLayer(6)
    softmaxLayer
    classificationLayer];

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',100,...
    'MiniBatchSize',27, ...
    'GradientThreshold',1, ...
    'Verbose',false, ...
    'Plots','training-progress');

net = trainNetwork(Xtrain,ytrain,layers,options); % 网络训练

XX=xlsread('ceshinew.xlsx');
Xtest1=XX(:,2:end);
for ii=1:1:1200
    for jj=1:1:72
        Xtest(1,jj,1,ii)=Xtest1(ii,jj); % 输入数据维度转化
    end
end
ytest1=XX(:,1);
ytest=categorical(ytest1); %函数包要求标签类型是categorical
YPred = classify(net,Xtest); %网络测试
YPred1 =double(YPred); %转化为可显示的标签
accuracy = sum(YPred == ytest)/numel(ytest)

读取训练集数据:通过调用 xlsread 函数,读取 Excel 文件 "xunliannew.xlsx" 中的数据。 Xtrain1 存储了 Excel 文件中除第一列外的所有数据。

将一维数据转化为卷积神经网络(CNN)所需的三维输入格式:将 Xtrain1 中的每一个数据点的维度从 (1, 72) 转化为 (1, 72, 1),即将一维数据转化为深度为1的二维图像。

将标签数据转化为 categorical 类型:通过调用 categorical 函数,将 ytrain 转化为分类变量。

定义 CNN 网络:通过定义一个包含多个卷积层、池化层和全连接层的神经网络模型。

定义训练选项:通过调用 trainingOptions 函数,定义了训练神经网络时的选项,如使用 Adam 优化器,最大训练次数、批次大小、梯度阈值等。

训练神经网络:通过调用 trainNetwork 函数,使用上述定义的神经网络模型和训练选项,对训练集进行训练,生成一个训练好的 CNN 模型 net。

读取测试集数据:通过调用 xlsread 函数,读取 Excel 文件 "ceshinew.xlsx" 中的数据。 Xtest1 存储了 Excel 文件中除第一列外的所有数据。

将测试集的一维数据转化为 CNN 所需的三维输入格式:将 Xtest1 中的每一个数据点的维度从 (1, 72) 转化为 (1, 72, 1),即将一维数据转化为深度为1的二维图像。

将测试集的标签数据转化为 categorical 类型:通过调用 categorical 函数,将 ytest1 转化为分类变量。

使用训练好的 CNN 模型进行测试:通过调用 classify 函数,对测试集数据进行分类预测。预测结果存储在 YPred 中。

将预测结果转化为可显示的标签:通过调用 double 函数,将 YPred 转化为可显示的标签。

计算准确率:通过计算预测结果与测试集标签相符的比例,得到测试集准确率 accuracy。

posted @ 2023-04-27 15:05  Ankitone  阅读(63)  评论(0编辑  收藏  举报