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
、整数 J
、knnMatrix
和 disMatrix
作为输入。这个函数首先创建一个 NearestNeighbors
对象并使用 J
作为参数。然后,该对象使用 fit
方法对训练数据集进行拟合。接下来,我们调用 kneighbors
方法来获取测试样本 x
在训练数据集中的 J
个最近邻。我们只关心索引,所以只获取 J_indices
。然后我们提取出 J_neighbors
(J_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
、整数 J
、knnMatrix
、disMatrix
和一个可选的方法参数作为输入。根据所选的方法(1 或 2),该函数调用相应的 find_reverse_neighbors
或 find_reverse_neighbors_v2
函数来寻找测试样本 x
的逆近邻。接着,我们计算这些逆近邻的平均距离(mean_distances
)。然后,我们从 mean_distances
中提取非零元素(non_zero_mean_distances
)。如果 non_zero_mean_distances
非空,我们计算其均值作为 score
,否则 score
为 0。最后,该函数返回 score
。
可以尝试以下方法来提高 JKNN 的得分:
- 调整参数: 调整 K 和 J 的值。尝试用不同的 K 和 J 值进行训练和测试,以找到最佳组合。这可以通过网格搜索、随机搜索或贝叶斯优化等技术实现。
- 特征选择: 使用特征选择技术,如递归特征消除(Recursive Feature Elimination,RFE)、基于 LASSO 的特征选择或树模型(如随机森林)的特征重要性。这可以帮助减少数据集的噪音和维度,并提高算法的性能。
- 特征缩放: 通过标准化(Standardization)或归一化(Normalization)等方法对特征进行缩放,确保特征在相同的尺度上。这对于基于距离的算法(如 KNN)来说非常重要,因为它们对尺度敏感。
- 数据预处理: 对数据进行清洗、去除异常值和噪声,以提高模型的性能。
- 模型集成: 使用多个模型进行集成,如 Bagging、Boosting 或 Stacking。这可以帮助提高模型的泛化能力,并减少单个模型的过拟合风险。
- 交叉验证: 使用交叉验证(如 K 折交叉验证)评估模型的性能,以确保模型在不同子集上的表现稳定。
请注意,这些方法并不保证一定能提高 JKNN 的得分,但它们通常可以帮助改进基于距离的分类器(如 KNN)的性能。实际效果可能因数据集和具体问题而异。
关于提高 JKNN 的 score,有以下几点建议:
- 选择合适的
J
和K
值。不同的J
和K
值可能会导致不同的性能。您可以尝试使用交叉验证来选择最佳参数。 - 数据预处理:对数据进行归一化或标准化处理,以消除特征之间的量纲差异。
- 特征选择/降维:对数据集进行特征选择或降维(例如,使用主成分分析(PCA)),以消除不必要的特征或降低数据维度。
- 使用其他距离度量:您可以尝试使用其他距离度量(例如,曼哈顿距离、马氏距离等),以便更好地捕捉数据集中的相似性。
- 集成方法:将多个分类器的结果结合起来,以提高预测性能。例如,可以使用 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。