2024.9.20 Python模式识别新国大EE5907,PCA主成分分析,LDA线性判别分析,GMM聚类分类,SVM支持向量机

news2024/11/15 12:12:11

1.PCA 主成分分析用于特征提取、可视化和分类

根据要求,我在第一个代码框中完成了从指定路径提取图像数据,将其转换为灰度图像并将其展平。在这里,我将数字 88 设置为我的照片的标签,然后将所有 10 张照片传入代码。然后我定义了 PCA 函数,计算居中数据,计算协方差矩阵,并计算协方差矩阵的特征值和特征向量。然后对特征向量进行排序,并保留最大的 n 个特征向量。
接下来,我将图像的维数降低到 2D 和 3D。图像在二维和三维空间中均有显示。在图中我使用红点来显示我的图片。

import os
import numpy as np
from PIL import Image
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from random import sample

dataset_path = 'PIE'
my_photo_label = '88'
image_size = (32, 32)  

def load_images(path, label, num_images):
    images = []
    label_path = os.path.join(path, label)
    available_images = os.listdir(label_path)
    selected_images = sample(available_images, num_images)
    for image_name in selected_images:
        image_path = os.path.join(label_path, image_name)
        with Image.open(image_path) as img:
            img = img.resize(image_size).convert('L') 
            images.append(np.array(img).flatten()) 
    return images

def pca(X, num_components):
    X_meaned = X - np.mean(X , axis = 0)
    cov_mat = np.cov(X_meaned , rowvar = False)
    eigen_values , eigen_vectors = np.linalg.eigh(cov_mat)
    
    sorted_index = np.argsort(eigen_values)[::-1]
    sorted_eigenvalue = eigen_values[sorted_index]
    sorted_eigenvectors = eigen_vectors[:,sorted_index]
    eigenvector_subset = sorted_eigenvectors[:,0:num_components]  
    X_reduced = np.dot(eigenvector_subset.transpose() , X_meaned.transpose()).transpose()
    
    return X_reduced

data = []
for i in range(1, 26):
    data.extend(load_images(dataset_path, str(i), 490 // 25))
data.extend(load_images(dataset_path, '88', 10))
data = np.array(data)

data_2d = pca(data, 2)
data_3d = pca(data, 3)

pca_3 = PCA(n_components=3)
data_3d = pca_3.fit_transform(data)

plt.figure(figsize=(8, 6))
plt.scatter(data_2d[:-10, 0], data_2d[:-10, 1], alpha=0.5)
plt.scatter(data_2d[-10:, 0], data_2d[-10:, 1], color='red')  
plt.title('PCA to 2D')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.show()

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data_3d[:-10, 0], data_3d[:-10, 1], data_3d[:-10, 2], alpha=0.5)
ax.scatter(data_3d[-10:, 0], data_3d[-10:, 1], data_3d[-10:, 2], color='red')  
ax.set_title('PCA to 3D')
ax.set_xlabel('Component 1')
ax.set_ylabel('Component 2')
ax.set_zlabel('Component 3')
plt.show()

1.load_images函数,输入一个文件夹里的指定数量的图片进去,然后每张图像被打开、调整大小为 32x32,并转换为灰度图像(convert(‘L’))将图像数据展平(1D数组)并存储在 images 列表中。返回展平的图像列表,每张图像以 1D 数组形式表示。label只是用来找到要找的图,在这里并没有存储
2.pca函数
输入参数:X 是数据矩阵,每一行是一个样本。num_components 是要保留的主成分数量。
中心化数据,减去每列(每个特征)的均值。
计算协方差矩阵,并对协方差矩阵求特征值和特征向量。
将特征值按降序排列,并根据指定的 num_components 选择对应的特征向量子集。
将数据投影到这些选定的特征向量空间中,获得降维后的数据。
输出: 降维后的数据矩阵。
3.加载数据并执行PCA,降维后输出图片。

这个时候的数据仅是铺开的情况,并没有辨别能力,所以还需要用knn来去辨别

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

data_40d = pca(data, 40)
data_80d = pca(data, 80)
data_200d = pca(data, 200)

print("Data dimensionality reduced to 40 dimensions:", data_40d.shape)
print("Data dimensionality reduced to 80 dimensions:", data_80d.shape)
print("Data dimensionality reduced to 200 dimensions:", data_200d.shape)

import numpy as np
from collections import Counter

class KNearestNeighbors:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X, y):
        self.X_train = X
        self.y_train = y

    def predict(self, X):
        y_pred = [self._predict(x) for x in X]
        return np.array(y_pred)

    def _predict(self, x):
        distances = [np.sqrt(np.sum((x_train - x) ** 2)) for x_train in self.X_train]
        k_indices = np.argsort(distances)[:self.k]
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        most_common = Counter(k_nearest_labels).most_common(1)
        return most_common[0][0]
def train_and_evaluate_knn(X_train, X_test, y_train, y_test, n_neighbors=3):
    knn = KNearestNeighbors(k=3)
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    return accuracy

def split_data(data, label_counts, test_size=0.3, random_state=42):
    X_train, X_test, y_train, y_test = [], [], [], []
    for label, count in label_counts.items():
        start_index = sum(label_counts[l] for l in label_counts if int(l) < int(label))
        end_index = start_index + count
        X_label = data[start_index:end_index]
        y_label = [label] * count
        X_label_train, X_label_test, y_label_train, y_label_test = train_test_split(
            X_label, y_label, test_size=test_size, random_state=random_state
        )
        X_train.extend(X_label_train)
        X_test.extend(X_label_test)
        y_train.extend(y_label_train)
        y_test.extend(y_label_test)
    return np.array(X_train), np.array(X_test), np.array(y_train), np.array(y_test)

label_counts = {str(i): 490 // 25 for i in range(1, 26)}
label_counts['88'] = 10 

X_train_40d, X_test_40d, y_train_40d, y_test_40d = split_data(data_40d, label_counts)
X_train_80d, X_test_80d, y_train_80d, y_test_80d = split_data(data_80d, label_counts)
X_train_200d, X_test_200d, y_train_200d, y_test_200d = split_data(data_200d, label_counts)

accuracy_40d = train_and_evaluate_knn(X_train_40d, X_test_40d, y_train_40d, y_test_40d)
accuracy_80d = train_and_evaluate_knn(X_train_80d, X_test_80d, y_train_80d, y_test_80d)
accuracy_200d = train_and_evaluate_knn(X_train_200d, X_test_200d, y_train_200d, y_test_200d)

print("Classification Accuracy with 40 dimensions:", accuracy_40d)
print("Classification Accuracy with 80 dimensions:", accuracy_80d)
print("Classification Accuracy with 200 dimensions:", accuracy_200d)

这个类定义了一个KNN分类器,它通过计算测试样本和训练样本之间的距离,来判断测试样本的类别。KNN的关键思想是基于训练集中与测试样本最相似的 k 个样本来预测测试样本的类别。
首先是class kNN类,他定义了前K个最小距离,
这里的fit其实是一个存取函数,这个函数把训练集直接存起来,也没有进行什么训练,因为之后的判断中,只需要过来找他计算就好了,predict函数是接受train的数据的,然后调用了类的内部函数进行具体的计算,_predict函数的内部是,我先计算要预测的x和所有的x的欧氏距离,然后把距离存下来,然后根据距离排序,取前k个最小值,然后再取这k个数据的原始标签,数这出现的标签最多的是谁那这个图片就应该是谁。
接下来的train and evaluation其实就是在做这个事情,split_data是用来处理原始数据集的,剩下的就没什么好说的了

2.numpy和python列表相比

numpy数组更像是一个动态矩阵,他强大,而且耗费资源少,所以很实用,具体的优点如下:
1.数据类型的一致性,能动态处理所有的数据类型
2.性能好效率高,占用资源少
3.高级运算,内建函数:数组运算更快更方便,就是矩阵的运算。
4.广播机制:np.array: numpy 提供广播机制,这意味着可以对形状不同的数组进行操作,numpy 会自动扩展较小的数组以匹配较大的数组。比如他可以直接给数组+1,那么数组中所有的元素都会+1

3.LDA线性判别分析

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

label_counts = {str(i): 490 // 25 for i in range(1, 26)}
label_counts['88'] = 10 

labels = []
for label, count in label_counts.items():
    labels.extend([label] * count)

labels = np.array(labels)

class LinearDiscriminantAnalysis:
    def __init__(self, n_components, reg_param=0.01):
        self.n_components = n_components
        self.reg_param = reg_param
        self.means_ = None
        self.scalings_ = None

    def fit(self, X, y):
        self.mean_ = np.mean(X, axis=0)
        X = (X - self.mean_)

        class_labels = np.unique(y)
        mean_vectors = [np.mean(X[y == cl], axis=0) for cl in class_labels]

        S_W = sum([(X[y == cl] - mv).T.dot(X[y == cl] - mv) for cl, mv in zip(class_labels, mean_vectors)])
        S_W += np.eye(S_W.shape[0]) * self.reg_param

        overall_mean = np.mean(X, axis=0)
        S_B = sum([len(X[y == cl]) * (mv - overall_mean).reshape(X.shape[1], 1).dot((mv - overall_mean).reshape(1, X.shape[1])) for cl, mv in zip(class_labels, mean_vectors)])

        A = np.linalg.inv(S_W).dot(S_B)
        U, _, _ = np.linalg.svd(A)

        self.scalings_ = U[:, :self.n_components]

    def transform(self, X):
        X = X - self.mean_
        return X.dot(self.scalings_)

    def fit_transform(self, X, y):
        self.fit(X, y)
        return self.transform(X)

def apply_lda(X, y, n_components):
    lda = LDA(n_components=n_components)
    return lda.fit_transform(X, y)

data_2d_lda = apply_lda(data, labels, 2)
data_3d_lda = apply_lda(data, labels, 3)
data_9d_lda = apply_lda(data, labels, 9)

label_to_int = {str(i): i for i in range(1, 26)}
label_to_int['88'] = 88  
int_labels = np.array([label_to_int[label] for label in labels])

#2D
plt.figure(figsize=(8, 6))
plt.scatter(data_2d_lda[:, 0], data_2d_lda[:, 1], c=int_labels, cmap='rainbow', alpha=0.5)
plt.title('LDA: Data projected onto 2 dimensions')
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.show()

#3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data_3d_lda[:, 0], data_3d_lda[:, 1], data_3d_lda[:, 2], c=int_labels, cmap='rainbow', alpha=0.5)
ax.set_title('LDA: Data projected onto 3 dimensions')
ax.set_xlabel('LD1')
ax.set_ylabel('LD2')
ax.set_zlabel('LD3')
plt.show()

在LDA中,SVD用于分解矩阵以提取出最重要的方向。特别是在LDA求解过程中,我们计算了矩阵
𝐴,这个矩阵是类内散度矩阵的逆乘上类间散度矩阵。SVD的目的是分解这个矩阵,提取其特征值和特征向量,从而找到数据在不同类别之间分离最好的方向。
LDA的核心思想是找到一组线性投影,将数据从高维空间投影到低维空间,同时保证在低维空间中,不同类别的样本能够很好地分离开。具体步骤如下:
1.类内散度矩阵 SW:计算每一类样本的类内差异,衡量同一类别样本之间的散布情况。
2.类间散度矩阵 SB:计算不同类别之间的差异,衡量类别之间的中心点的差异。
3.优化目标:LDA的目标是最大化类间散度和类内散度的比率,投影后类间差异越大,类内差异越小,说明投影效果越好。
4.求解矩阵 :这个矩阵的特征向量表示最佳的投影方向。
5.奇异值分解:通过SVD分解来选择前几个最大的特征值方向,即这些方向是最能区分类别的。
在这里插入图片描述
在代码中只要左奇异向量的前n个向量,就是我们要的。然后和PCA一样,可以用knn来进行计算。

4.GMM

GMM是无监督学习算法,它通过聚类来发现数据中的潜在结构,不需要事先知道标签。KNN等算法是有监督学习算法,它们通过已知的标签进行分类。因此,GMM不会直接利用标签,而是通过数据的特征来生成分类。

import numpy as np
from scipy.stats import multivariate_normal
class GMM:
    def __init__(self, n_components=3, tol=1e-4, max_iter=100):
        self.n_components = n_components
        self.tol = tol
        self.max_iter = max_iter

    def fit(self, X):
        n_samples, n_features = X.shape
        self.weights_ = np.full(self.n_components, 1 / self.n_components)
        self.means_ = X[np.random.choice(n_samples, self.n_components, replace=False)]
        self.covariances_ = [np.cov(X.T) for _ in range(self.n_components)]
        
        log_likelihood = 0
        self.converged_ = False
        self.log_likelihoods_ = []
        
        for _ in range(self.max_iter):
            responsibilities = self._e_step(X)
            self._m_step(X, responsibilities)
            
            new_log_likelihood = np.sum(np.log(np.dot(responsibilities, self.weights_)))
            self.log_likelihoods_.append(new_log_likelihood)
            
            if abs(new_log_likelihood - log_likelihood) <= self.tol:
                self.converged_ = True
                break
                
            log_likelihood = new_log_likelihood
            
    def _e_step(self, X):
        likelihood = np.zeros((X.shape[0], self.n_components))
        for i in range(self.n_components):
            likelihood[:, i] = self.weights_[i] * multivariate_normal.pdf(X, self.means_[i], self.covariances_[i])
        responsibilities = likelihood / likelihood.sum(axis=1, keepdims=True)
        return responsibilities
    
    def _m_step(self, X, responsibilities):
        n_samples = X.shape[0]
        for i in range(self.n_components):
            weight = responsibilities[:, i].sum()
            mean = np.dot(responsibilities[:, i], X) / weight
            covariance = (np.dot((responsibilities[:, i] * (X - mean).T), (X - mean)) / weight) + self.tol * np.identity(X.shape[1])
            
            self.weights_[i] = weight / n_samples
            self.means_[i] = mean
            self.covariances_[i] = covariance
            
    def predict_proba(self, X):
        likelihood = np.zeros((X.shape[0], self.n_components))
        for i in range(self.n_components):
            likelihood[:, i] = self.weights_[i] * multivariate_normal.pdf(X, self.means_[i], self.covariances_[i])
        return likelihood / likelihood.sum(axis=1, keepdims=True)

目标是期望最大化,E是期望,M是最大化,通过EM算法在最大迭代次数或达到收敛条件(对数似然变化小于 tol)之间进行迭代:
E步: 计算每个数据点属于每个高斯分布的责任度(即属于某个簇的概率)。
M步: 根据责任度重新估计每个簇的参数(权重、均值和协方差)。
具体如下:
1.初始定义,定义聚类类别数,收敛域值和最大化次数
2.E步中,计算责任度,即每个数据点属于每个簇的概率,用似然值除以所有簇的似然值之和,看看谁最大
3.在 M 步中,算法根据责任度更新模型的参数,具体分为:
权重: 每个簇的权重 𝜋𝑘由该簇的责任度之和决定:
均值: 每个簇的均值 𝜇𝑘是该簇责任度加权后的均值
协方差: 每个簇的协方差矩阵也根据责任度进行更新
这样在最后的时候就可以收敛了,就不会再大的变化了。

问题:
优势:
柔性较强:与K-Means不同,GMM允许每个簇具有不同的形状(由协方差矩阵决定),因此能更好地处理复杂的数据分布。
软分类:GMM为每个数据点分配概率,而不是硬性分配到某个簇,适合处理一些数据边界不清晰的情况。
无监督学习:GMM可以在没有标签的情况下发现数据的潜在结构。
劣势:
对初始参数敏感:GMM的结果可能依赖于初始参数的选择,特别是初始均值的选择。
计算复杂度较高:每次迭代中都需要计算高斯分布的概率,尤其是在处理高维数据时,计算开销较大。
需要假设数据来自高斯分布:如果数据分布与高斯分布假设差距较大,GMM的效果可能不理想。

5.SVM支持向量机

VM 的核心思想是寻找一个能够最大化分类间隔(Margin)的超平面。分类间隔是指超平面到最近的训练样本(支持向量)的距离,SVM 尽可能选择让这个间隔最大的超平面来划分不同类别的数据点。

1.线性可分的情况:在二维空间里,超平面就是一条直线。在高维空间,超平面是一个 d−1 维的平面,用来将不同类别的数据分开。
支持向量:指那些位于分类间隔边界上的样本点,这些点对超平面的最终位置有决定性影响。
SVM 希望找到如下形式的超平面:
𝑤𝑇𝑥+b=0 其中,𝑤是权重向量,b 是偏置,𝑥是输入向量。目标是让不同类别的样本点尽可能远离这个超平面。

2.软间隔与正则化参数 𝐶在实际问题中,数据可能并不是线性可分的,这时就需要允许一定的误分类。这就引入了软间隔和正则化参数
𝐶。
软间隔:允许部分数据点处于超平面的错误一侧,即允许一定量的误分类。C 参数控制误分类的容忍度。具体来说:
大 C:对误分类的容忍度低,会导致模型更加严格地拟合训练数据,可能导致过拟合。
小 C:对误分类的容忍度高,允许更多的误分类,以换取更平滑的分类边界,可能导致欠拟合。

from sklearn.svm import SVC

def train_and_evaluate_svm(X_train, X_test, y_train, y_test, C):
    svm = SVC(C=C, kernel='linear', random_state=42)
    svm.fit(X_train, y_train)
    y_pred = svm.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    return accuracy

C_values = [0.01, 0.1, 1]
X_train_raw, X_test_raw, y_train_raw, y_test_raw = split_data(data, label_counts)

for C in C_values:
    accuracy_raw = train_and_evaluate_svm(X_train_raw, X_test_raw, y_train_raw, y_test_raw, C)
    accuracy_80d = train_and_evaluate_svm(X_train_80d, X_test_80d, y_train_80d, y_test_80d, C)
    accuracy_200d = train_and_evaluate_svm(X_train_200d, X_test_200d, y_train_200d, y_test_200d, C)
    
    print(f"Classification Accuracy with raw vector and C={C}: {accuracy_raw}")
    print(f"Classification Accuracy with 80 dimensions and C={C}: {accuracy_80d}")
    print(f"Classification Accuracy with 200 dimensions and C={C}: {accuracy_200d}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java之杨辉三角问题

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 如何实现呢&#xff1f; 思路&#xff1a;首先&#xff0c;我们可以将杨辉三角视作i行j列的二维数组。除了第一行和第二行之外&am…

✨机器学习笔记(五)—— 神经网络,前向传播,TensorFlow

Course2-Week1: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Advanced%20Learning%20Algorithms/week1机器学习笔记&#xff08;五&#xff09; 1️⃣神经网络&#xff08;Neural Network&#xff09;2️⃣前向传播&#xff08;Forward propaga…

最短路: Djikstra

最短路: Djikstra 适用于边权非负 如果存在负边权, 则当前距离dist最小的点, 不一定就是实际离源点最近的点,可能有负边导致其它路径离当前点更近 如下图所示, 如果存在负边, y点距离S点最近, 所以选中y点进行松弛, 贪心思想 当边权非负,离起点S最近的点,不能被更新, 如果在…

PointNet++改进策略 :模块改进 | SPVConv, 体素和点云特征融合提升小目标检测能力

论文题目&#xff1a;Searching Efficient 3D Architectures with Sparse Point-Voxel Convolution发布期刊&#xff1a;ECCV通讯地址&#xff1a;麻省理工 & 清华大学代码地址&#xff1a;https://github.com/mit-han-lab/spvnas 介绍 这篇论文的主题是如何为自驾车等应…

[译] Go语言的源起,发展和未来

本篇内容是根据2019年9月份Creating the Go programming language音频录制内容的整理与翻译, 两位主持人与Go 的创始人 Rob Pike 和 Robert Griesemer谈论了 Go 的起源、发展、影响和未来。这是一个史诗般的剧集&#xff0c;深入探讨了 Go 的历史和详细信息&#xff0c;以及他们…

手动部署并测试内网穿透(ssh 和 nginx)

原理回顾 首先需要一台连接了公网的云服务器&#xff0c;然后我们要访问的内网穿透对象最好是Linux服务器&#xff0c;比如虚拟机&#xff0c;然后我们通过向云服务器发送指令&#xff0c;云服务器再将指定发送给指定对象&#xff0c;让其能够执行命令。 总结就是&#xff1a…

数据结构与算法——Java实现 6.递归

要学会试着安静下来 —— 24.9.17 一、递归的定义 计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集 说明: ① 自己调用自己&#xff0c;如果说每个函数对应着一种解决方案&#xff0c;自己调用自己意味着解决方案是…

数据建模无法满足复杂业务需求?别慌,数据开发平台可以完美互补!

前言 数据可视化建模无论是对于企业的数字化转型&#xff0c;还是对数据资源的价值开发来说&#xff0c;都是至关重要的工具&#xff0c;小兵在前文《数据可视化建模平台介绍》。中有详细介绍过他的能力&#xff0c;包括面向多源异构的企业数据&#xff0c;为企业提供数据集成…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略&#xff08;CSP&#xff09;用于定义脚本和其他资源可以从何处加载或执行&#xff0c;本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞&#xff0c;它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

xtop:如何debug fail reason

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 fix_xx_violations之后,工具会报告fail reason summary,通过man reason_name可以获知fail原因&#x

STM32(十六):MPU6050简介

MPU6050 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的加速度、角速度参数&#xff0c;通过数据融合&#xff0c;可进一步得到姿态角&#xff0c;常应用于平衡车、飞行器等需要检测自身姿态的场景。 3轴加速度计&#xff08;Accelerometer&#…

攻防世界--->gametime

做题笔记。 前言&#xff1a; 因为有意思&#xff0c;所以&#xff0c;&#xff0c;&#xff0c;打通关了。。哈哈哈。 题外话&#xff1a;哦&#xff0c;程序结果还在&#xff0c;是因为我是在WSL—Debian上运行的。你还别说&#xff0c;真挺好用的&#xff0c;vm虚拟机能不…

Node-RED和物联网分析:实时数据处理和可视化平台

这篇论文的标题是《Node-RED and IoT Analytics: A Real-Time Data Processing and Visualization Platform》&#xff0c;发表在《Tech-Sphere Journal of Pure and Applied Sciences (TSJPAS)》2024年第一期上。论文主要探讨了Node-RED和物联网分析在物联网(IoT)实时数据处理…

列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型 一.Collections.sort() Collections.sort()用于List类型的排序&#xff0c;其提供了两个重载方法&#xff1a; 1.sort(List<T> list) &#xff08;1&#xff09;List指定泛型时只能指定引用数据类型&#xff0c;也就是说无法用于基本数据类型的排序。 &am…

9.20作业

手动封装一个顺序表&#xff08;SeqList&#xff09;,分文件编译实现 有私有成员&#xff1a; 顺序表数组的起始地址 ptr、 顺序表的总长度&#xff1a;size、顺序表的实际长度&#xff1a;len 成员函数&#xff1a; 初始化 init(int n) 判空&#xff1a;empty 判满&#xff1…

Rust语言入门第七篇-控制流

文章目录 Rust语言入门第七篇-控制流If 表达式基本结构特点和规则示例 let 语句中使用 ifloop 循环基本结构特点示例综合示例 while 循环基本结构特点示例综合示例 与 loop 循环的区别 for 循环基本结构详细说明特点示例综合示例 match 表达式match表达式的语法结构示例代码 Ru…

Mysql存储过程详细解读

目录 存储过程介绍 创建与调用 查看与删除 变量 系统变量 用户自定义变量 ​编辑局部变量 ​编辑​编辑IF判断 存储过程参数​编辑​编辑​编辑 CASE ​编辑 WHILE​编辑 ​编辑REPEAT​编辑​编辑 LOOP 游标 条件处理程序 存储函数 存储过程介绍 创建与调用 查…

GNN-RAG:用于大模型推理的图神经检索

GNN-RAG&#xff1a;用于大模型推理的图神经检索 秒懂大纲提出背景解法拆解全流程优化创意总结 论文&#xff1a;GNN-RAG: Graph Neural Retrieval for Large Language Model Reasoning 代码&#xff1a;https://github.com/cmavro/GNN-RAG 秒懂大纲 ├── GNN-RAG【主题】…

【刷题日记】43. 字符串相乘

43. 字符串相乘 其实就是大数乘法题&#xff0c;这道题用草稿纸演练一下&#xff0c;其实很好找到方法&#xff0c;模拟大数乘法即可。需要注意的是进位和迭代值&#xff0c;还有注意向下取整和去除前导0&#xff08;容易遗漏&#xff09;。去除前导0的时候还要注意如果全是0&…

命令行运行python时找不到模块怎么解决

问题&#xff1a; 新建了一个项目&#xff0c;目录结构如下&#xff1a; 然后在pycharm中运行glovar是没有问题的&#xff0c;但是在命令行中运行就会提示找不到init模块。 这是因为在pycharm中运行的时候&#xff0c;pycharm会自动将项目所在目录添加到了sys.path中&#xf…