K 近邻算法解析: 从原理到实践的机器学习指南

news2024/12/23 19:19:34

机器学习 第三课 k 近邻

  • 概述
  • 机器学习简介
  • K 近邻算法
  • K 近邻中的距离
    • 欧氏距离
    • 曼哈顿距离
    • 余弦相似度
  • 选择合适的 K 值
    • 奇数 vs 偶数
    • 通过交叉验证选择 k 值
  • 实战
    • 分类问题
    • 回归问题
  • K 近邻算法的优缺点
    • 优点
    • 缺点
  • 手把手实现 k 近邻
    • 手搓算法
    • 实战分类

概述

机器学习 (Machine Learning) 已经成为现代科技领域不可或缺的一个分支, 涉及到各种应用, 从自动驾驶, 到人脸识别, 到推荐系统为我们推荐歌曲. 在众多的机器学习算法中, K 近邻算法是最为简单的一个. K 近邻算法有着简单和直观的原理.

机器学习 k 近邻

机器学习简介

当我们提到机器学习 (Machine Learning) 时, 我们实际上是指让机器从数据中学习并做出决策或预测的过程. 这与传统的编程方法形成对比, 传统方法中, 我们需要明确告诉机器如何执行任务. 但在机器学习中, 机器会根据提供的数据 “学习” 如何执行任务.

例如, 如果我们希望机器识别出一张图片上的猫, 传统的方法可能需要你定义猫的特征, 如耳朵的形状, 眼睛的大小等. 但在机器学习中, 你会提供成千上万的猫的图片 (和非猫的图片), 让机器自己找出猫的特征.

K 近邻算法

K 近邻 (k-Nearest Neighbor) 是机器学习中一种基础算法. K 近邻的核心思想是 “物以类聚”. 通过查找一个未知数据在训练集中最相近的 “k” 个点, 并更加近似数据的标签来预测未标记数据的标签.

举个栗子:
如果小白我到了一个新的城市, 想找个地方吃饭, 我会询问几个当地人, 如果多个人推荐了同一个餐厅, 我们大概率会去选择他们推荐的餐馆. 在这个例子中, 当地人 (城市居民) 就是我们的 “邻居”, 这些邻居的推荐是基于他们的经验. K 近邻算法就是这样工作的, 通过考虑周围的 “邻居” 并根据他们的 “推荐” 做出决策.

K 近邻中的距离

K 近邻算法的关键是如何计算数据之间的距离 (Distance). K 近邻的算法依赖于找出一个点的最近邻居, “最近” 就是通过距离远近来定义的.

欧氏距离

欧氏距离 (Euclidean Distance) 是最常见的距离计算方法. 简单的来说欧氏距离就是两点之间的直线距离, 我们可以通过小学学过的勾股定理来计算. 在多维空间中, 欧氏距离为每一个维度的差值的平方和平方根.

欧氏距离
计算公式:
e u c l i d e a n    d i s t a n c e = ( ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 ) euclidean \; distance = \sqrt((x_2 - x_1)^2 + (y_2 - y_1)^2) euclideandistance=( (x2x1)2+(y2y1)2)

我们数据中的每个特征 (Feature) 可视为一个维度, 例如乳腺癌分类数据集中的 radius_mean, texture_mean. 如果我们有多个特征, 只需扩展上述公式.

例如:

  • 2 个特征: e u c l i d e a n    d i s t a n c e = ( ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 ) euclidean \; distance = \sqrt((x_2 - x_1)^2 + (y_2 - y_1)^2) euclideandistance=( (x2x1)2+(y2y1)2)
  • 3 个特征: e u c l i d e a n    d i s t a n c e = ( ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 ) euclidean \; distance = \sqrt((x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2) euclideandistance=( (x2x1)2+(y2y1)2+(z2z1)2)
  • 4 个特征: e u c l i d e a n    d i s t a n c e = ( ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 + ( a 2 − a 1 ) 2 ) euclidean \; distance = \sqrt((x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2 + (a_2 - a_1)^2) euclideandistance=( (x2x1)2+(y2y1)2+(z2z1)2+(a2a1)2)

例子:

from sklearn.neighbors import KNeighborsClassifier


# 使用欧几里得距离
knn_euclidean = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn_euclidean.fit(X, y)

曼哈顿距离

曼哈顿距离 (Manhattan Distance) 是通过计算在一个格子形状路径上从第一个点到另一个点的总距离, 及沿轴绝对差值的总和.

在这里插入图片描述
计算公式:
m a n h a t t a n    d i s t a n c e = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ manhattan \; distance = |x_1 - x_2| + |y_1 - y_2| manhattandistance=x1x2+y1y2

同理, 如果我们有多个特征, 只需扩展上述公式:

  • 2 个特征: m a n h a t t a n    d i s t a n c e = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ manhattan \; distance = |x_1 - x_2| + |y_1 - y_2| manhattandistance=x1x2+y1y2$
  • 3 个特征: m a n h a t t a n    d i s t a n c e = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ + ∣ z 1 − z 2 ∣ manhattan \; distance = |x_1 - x_2| + |y_1 - y_2| + |z_1 - z_2| manhattandistance=x1x2+y1y2+z1z2
  • 4 个特征: m a n h a t t a n    d i s t a n c e = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ + ∣ z 1 − z 2 ∣ + ∣ a 1 − a 2 ∣ manhattan \; distance = |x_1 - x_2| + |y_1 - y_2| + |z_1 - z_2| + |a_1 - a_2| manhattandistance=x1x2+y1y2+z1z2+a1a2

例子:

from sklearn.neighbors import KNeighborsClassifier

# 使用曼哈顿距离
knn_manhattan = KNeighborsClassifier(n_neighbors=5, metric='manhattan')
knn_manhattan.fit(X, y)

余弦相似度

余弦相似度 (Cosine Similarity) 是通过计算两个向量的夹角来判断相似度. 当我们遇到需要数据之间的方向而不是绝对距离的时候会用到余弦相似度. 举个例子, 在文本分析中判断文本的相似度 (距离).

选择合适的 K 值

K 值的选择对 K 近邻算法来说非常重要. K 值决定了算法需要考虑的 “邻居” 的数量. 如果 k=1, 意味着只用一个 “邻居” 对结果进行预测, 容易造成过度拟合的问题; 如果 k 的取值过大, 意味着不那么相似的 “邻居” 也会影响到模型的判断.

举个栗子, 当我们到了一个陌生的城市, 想找一个地方吃饭:

  • k=1 (考虑一个最近的邻居): 我们只问了一个路过的人他最喜欢的餐馆. 有概率这个人可能喜欢偏僻, “味道独特” 的小店, 然而大概率我们并不喜欢. 由于我们参考了一个人的意见 (k=1), 所以我们可能错过了该城市真正受欢迎的餐馆. 同理, 当我们选择的 k 值过小的时候, 模型就会收到各别异常意见的影响, 过度拟合.
  • k=∞ (考虑所有邻居): 我们问变了每个路过的人, 得到了上百条建议, 然后选择了大多数人都提到的餐馆 (沙县小吃, 兰州牛肉面). 这可能是一个非常普通和大众的连锁店, 但不会是一个你想要的地方特色餐馆. 同理, 当我们选择的 k 值过大的时候, 和你不那么相近的 “邻居” 也会影响到模型, 导致模型过度简化 (欠拟合).

奇数 vs 偶数

选择奇数作为 k 值可以避在二分类中平局的情况. 例如一个二分类问题, k=2 时, 俩邻居意见不同.

通过交叉验证选择 k 值

from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier


# 假设我们有数据 X, y
best_score = 0
best_k = 1
for k in range(1, 31):
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X, y, cv=10)
    mean_score = scores.mean()
    if mean_score > best_score:
        best_score = mean_score
        best_k = k

print(f"Best k value: {best_k}")

实战

分类问题

我们拿鸢尾花数据集来带大家实践一下 KNN 算法. 鸢尾花数据集包三种鸢尾花, 各50组数据构成的数据集. 每个样本包含 4 个特征, 分别为萼片 (sepals) 的长和宽, 花瓣 (petals) 的长和宽. 通过 K 近邻算法, 我们可以来预测花的种类.

例子:

"""
@Module Name: knn分类.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
使用 K近邻算法对鸢尾花进行分类
"""
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, recall_score, f1_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 调试输出数据基本信息
print("输出特征:", X[:5])
print("输出标签:", y[:5])

# 分割数据集
X_train, X_vaild, y_train, y_vaild = train_test_split(X, y, test_size=0.2)

# 实例化模型
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_vaild)

# 评估指标
print("精度:", accuracy_score(y_vaild, y_pred))
print("召回率:", recall_score(y_vaild, y_pred, average='macro'))  # 多分类问题使用宏平均
print("F1分数:", f1_score(y_vaild, y_pred, average='macro'))  # 多分类问题使用宏平均

输出结果:

输出特征: [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
输出标签: [0 0 0 0 0]
精度: 0.9
召回率: 0.8777777777777779
F1分数: 0.8656126482213438

我们进一步优化一下以上代码:

"""
@Module Name: knn分类.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
使用 K近邻算法对鸢尾花进行分类
"""
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from matplotlib import pyplot as plt
plt.style.use("fivethirtyeight")

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 调试输出数据基本信息
print("输出特征:", X[:5])
print("输出标签:", y[:5])

# 分割数据集
X_train, X_vaild, y_train, y_vaild = train_test_split(X, y, test_size=0.2)

# 通过交叉验证选择k值
k_value_score = []

for k in range(1, 31):
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X, y, cv=10)
    mean_score = scores.mean()
    k_value_score.append(mean_score)

# 绘图
plt.figure(figsize=(12, 8))
plt.plot([i for i in range(1, 31)], k_value_score)
plt.xlabel('Value of K for KNN')
plt.ylabel('Score')
plt.show()

# 实例化模型
knn = KNeighborsClassifier(n_neighbors=12)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_vaild)

# 评估指标
print(classification_report(y_vaild, y_pred))

输出结果:

输出特征: [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
输出标签: [0 0 0 0 0]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       0.90      1.00      0.95         9
           2       1.00      0.91      0.95        11

    accuracy                           0.97        30
   macro avg       0.97      0.97      0.97        30
weighted avg       0.97      0.97      0.97        30

回归问题

波士顿房价数据集是一个经典的回归数据集, 其中包含了波士顿各个城区的房屋中位数价格与其他相关特征, 如犯罪率, 教育水平等. 使用K近邻回归, 我们可以预测新的城区的房价.

代码:

"""
@Module Name: knn回归.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
使用 K近邻算法预测波士顿房价
"""
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target

# 调试输出数据基本信息
print("输出特征:", X[:5])
print("输出标签:", y[:5])

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# K 近邻回归
knn_reg = KNeighborsRegressor(n_neighbors=5)
knn_reg.fit(X_train, y_train)

# 预测
y_pred = knn_reg.predict(X_test)
print("平方差:", mean_squared_error(y_test, y_pred))

输出结果:

输出特征: [[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00
  6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02
  4.9800e+00]
 [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00
  7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02
  9.1400e+00]
 [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00
  6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02
  4.0300e+00]
 [3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00
  4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02
  2.9400e+00]
 [6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00
  5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02
  5.3300e+00]]
输出标签: [24.  21.6 34.7 33.4 36.2]
平方差: 47.335607843137254

K 近邻算法的优缺点

优点

  • 简单易懂: KNN 是基于实力的学习, 算法简单直观, 易于理解. 对于简单的分类和回归的任务, 仅需要几行代码
  • 无需训练步骤: KNN 是一种懒惰学习器 (Lazy Leaner) 即 KNN 实际上不会在数据上训练一个模型, 而是在预测时使用训练数据
  • 自热的处理多分类问题: 无需额外的修改即可处理多个类别
  • 可用于分类和回归: KNN 既可以用于分类任务, 也可以用于回归任务, 使用具有多功能性

缺点

  • 计算密集型: 由于算法需要为每个新的数据搜索 k 个最近值, 因此在大数据集计算成本直线上升
  • 对不平衡数据敏感: 在数据集中, 如果某个类的数据量大于另一个类, 那么数据很可能会分类为该大类

手把手实现 k 近邻

为了帮助大家更好的理解, 小白我带领大家手把手实现一下 knn 算法.

手搓算法

手搓 KNN:

"""
@Module Name: 手把手实现knn.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
手把手实现knn算法
"""
class KNN:
    def __init__(self, k=3):
        """
        初始化参数
        :param k: k值, 默认为 3
        """
        self.k = k
        self.X_train = None
        self.y_train = None

    def fit(self, X_train, y_train):
        """
        为训练集 / 测试集成员赋值
        :param X_train: 训练集
        :param y_train: 测试集
        :return:
        """
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        """
        预测
        :param X_test: 训练特征集
        :return: 预测值
        """
        y_pred = [self._predict(x) for x in X_test]
        return y_pred

    def _predict(self, x):
        """
        预测
        :param x: 需要预测的数据
        :return: 预测标签
        """
        # 计算距离
        distances = [self._euclidean_distance(x, x_train) for x_train in self.X_train]

        # 得到 k 个最近邻的索引
        k_indices = sorted(range(len(distances)), key=lambda i: distances[i])[:self.k]

        # k个最近邻的标签
        k_nearest_labels = [self.y_train[i] for i in k_indices]

        # 投票
        most_common = self._vote(k_nearest_labels)

        # 返回标签
        return most_common

    def _euclidean_distance(self, x1, x2):
        """
        计算欧式距离
        :param x1: 数据1
        :param x2: 数据2
        :return: 距离
        """
        return sum((xi - xj) ** 2 for xi, xj in zip(x1, x2)) ** 0.5

    def _vote(self, labels):
        # 使用字典统计每个类别的票数
        votes = {}
        for label in labels:
            if label in votes:
                votes[label] += 1
            else:
                votes[label] = 1

        # 根据票数排序并返回得票数最多的类别
        return sorted(votes.items(), key=lambda x: x[1], reverse=True)[0][0]

实战分类

用手搓 KNN 进行鸢尾花分类:

"""
@Module Name: 手把手实现knn.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
手把手实现knn算法
"""
class KNN:
    def __init__(self, k=3):
        """
        初始化参数
        :param k: k值, 默认为 3
        """
        self.k = k
        self.X_train = None
        self.y_train = None

    def fit(self, X_train, y_train):
        """
        为训练集 / 测试集成员赋值
        :param X_train: 训练集
        :param y_train: 测试集
        :return:
        """
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        """
        预测
        :param X_test: 训练特征集
        :return: 预测值
        """
        y_pred = [self._predict(x) for x in X_test]
        return y_pred

    def _predict(self, x):
        """
        预测
        :param x: 需要预测的数据
        :return: 预测标签
        """
        # 计算距离
        distances = [self._euclidean_distance(x, x_train) for x_train in self.X_train]

        # 得到 k 个最近邻的索引
        k_indices = sorted(range(len(distances)), key=lambda i: distances[i])[:self.k]

        # k个最近邻的标签
        k_nearest_labels = [self.y_train[i] for i in k_indices]

        # 投票
        most_common = self._vote(k_nearest_labels)

        # 返回标签
        return most_common

    def _euclidean_distance(self, x1, x2):
        """
        计算欧式距离
        :param x1: 数据1
        :param x2: 数据2
        :return: 距离
        """
        return sum((xi - xj) ** 2 for xi, xj in zip(x1, x2)) ** 0.5

    def _vote(self, labels):
        # 使用字典统计每个类别的票数
        votes = {}
        for label in labels:
            if label in votes:
                votes[label] += 1
            else:
                votes[label] = 1

        # 根据票数排序并返回得票数最多的类别
        return sorted(votes.items(), key=lambda x: x[1], reverse=True)[0][0]

if __name__ == '__main__':

    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report

    # 加载数据集
    iris = load_iris()
    X = iris.data
    y = iris.target

    # 调试输出数据基本信息
    print("输出特征:", X[:5])
    print("输出标签:", y[:5])

    # 分割数据集
    X_train, X_vaild, y_train, y_vaild = train_test_split(X, y, test_size=0.2)

    # 实例化模型
    knn = KNN(12)

    # 训练模型
    knn.fit(X_train, y_train)

    # 预测
    y_pred = knn.predict(X_vaild)

    # 评估指标
    print(classification_report(y_vaild, y_pred))

输出结果:

输出特征: [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
输出标签: [0 0 0 0 0]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00         8
           1       0.83      1.00      0.91        10
           2       1.00      0.83      0.91        12

    accuracy                           0.93        30
   macro avg       0.94      0.94      0.94        30
weighted avg       0.94      0.93      0.93        30

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

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

相关文章

OWASP TOP 10-注入-SQL注入

文章目录 OWASP TOP 10注入注入的分类SQL注入SQL注入的危害:sqlmap自动化注入注入类型回显注入盲注时间注入不同请求方式的注入特殊位置的注入利用DNSLOG注入基于报错的注入二阶注入宽字节注入堆叠注入sql注入读写文件 OWASP TOP 10 A1:2017 注入 A2&am…

luming.02无限进步 #我的创作纪念日

前言:今天早上起床后,看见CSDN官方小助手发来一条系统通知,刚好没什么事,就点开分享分享我的创作经历 luming.02 ,不知不觉今天已经是你成为创作者的 第128天 啦,为了纪念这一天,我们为您准备了…

DS线性表之栈和队列

前言 我们前面已经介绍并实现了顺序表和链表以及介绍了他们的优缺点!本期我们再来学习一个基本数据结构栈和队列~!这里的栈可不是内存的那个栈,内存的那个栈是操作系统的概念,而这个栈是数据结构的栈,是一个容器。他们…

二叉树相关算法

1、二叉树基本操作 二叉树的定义就不在这里多说了,下面这个图就是一个简单的二叉树: 二叉树的三种遍历方式: 前序遍历:头左右,也就是先头后左再右:1245367 public static void prePrint(BinaryTreeNode …

黑豹程序员-架构师学习路线图-百科:MySQL

文章目录 1、什么是MySQL2、MySQL受喜爱程度经典四人组: 3、发展历史4、MariaDB 1、什么是MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 …

彻底搞懂:防止表单重复提交,前端限制还是后端限制?

欢迎大家来到小米的技术分享专栏!今天我将为大家带来一个热门话题:如何有效地防止表单重复提交。在开发中,我们常常会遇到这样的问题:用户频繁点击提交按钮,导致数据重复提交,给系统和用户体验带来不必要的…

python项目之统一身份认证协议设计与实现

项目简介 统一身份认证协议设计实现了以下功能: 通过以首页设计、服务管理设计、日志管理设计、用户的信息管理等内容来完成对整个系统的功能模块的设计。 服务管理来完成对统一身份认证的系统整体管理,包括的对托管的注册服务功能管理、对于系统网址的…

第七章 网络安全 | 计算机网络(谢希仁 第八版)

文章目录 第七章 网络安全7.1 网络安全问题概述7.1.1 计算机网络面临的安全性威胁7.1.2 安全的计算机网络7.1.3 数据加密模型 7.2 两类密码体制7.2.1 对称密钥密码体制7.2.2 公钥密码体制 7.3 数字签名7.4 鉴别7.4.1 报文鉴别7.4.2 实体鉴别 7.5 密钥分配7.5.1 对称密钥的分配7…

跟着Datawhale打一场时序比赛(SEED新能源赛道-电动汽车充电站充电需求预测)之打卡笔记一

最近Datawhale又开始组织打比赛的培训学习了,很早就认识了这个专业的学习组织,跟着他们也学过不少竞赛知识,但是还没完全打完过一场赛事;所以这次打算跟着Datawhale打这场时序的比赛 —> 2023“SEED”第四届江苏大数据开发与应…

5.1 加载矢量图层(ogr,gpx)

文章目录 前言加载矢量(vector)图层ogrShapefileQGis导入.shp文件代码导入 gpxQGis导入GPX文件代码导入 gpkgQGis导入GPKG文件代码导入 geojsonQGis导入GeoJson文件代码导入 gmlQGis导入GML代码导入 kml/kmzQGis导入Kml代码导入 dxf/dwgQGis导入dxf代码导入 CoverageQGis导入Co…

2023年全球及中国多肽CDMO市场发展概述分析:CDMO头部企业将拓展至多肽领域[图]

多肽药物是指通过生物合成法或者化学合成法获得的具有特定治疗作用的多肽,多肽药物的分子量介于小分子化药和蛋白质类药物之间,形成了其独特药学空间。多肽药物相比于小分子化药及蛋白质类药物的优势在其发展过程中被逐渐发掘,其在质量控制水…

提升医疗服务质量:将互联网医院源码应用于实践

随着科技的快速发展,医疗行业也亟需寻求创新的解决方案来提升服务质量。在这个数字化时代,互联网医院源码成为了引人注目的选择,为医疗机构和患者之间的沟通和协作提供了前所未有的便利。作为该领域的专家,我将介绍互联网医院源码…

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言,NXP官方uboot一定会支持不止 IMX6ULL芯片的代码,也不止支持 一种架构,还支持其他芯片或架构的源码文件。 为了方便阅读代码,vscode软件可…

Java反射调用jar包实现多态

上一篇实现了反射调用jar包,但是没有实现多态,这次先给自己的jar包类抽象一个接口,然后实现类实现接口。最后调用放反射得到的对像转换成接口类型调用执行。 定义接口,指定包为ZLZJar package ZLZJar;public interface ITest {p…

优思学院|改变游戏规则:六西格玛的奇迹力量!

在当今全球竞争激烈的商业环境中,企业家们正在寻找各种方法来提高效率、降低成本并确保顶级质量。在这个追求卓越的道路上,六西格玛以其卓越的数据分析、问题解决和流程优化能力脱颖而出。那么,六西格玛到底是什么,它是如何改变游…

郝培强专访:创业失败、抑郁症和自媒体爆款

近日,我对郝培强(网名:Tinyfool)老师做了一场视频采访(可关注“Micro SaaS开发者公会视频号”观看原视频)。70后的Tinyfool是多年资深的创业者、开发者,研发或者技术服务过六间房、有道词典、大…

每日一题 2652. 倍数求和(简单)

最简单的做法,遍历求和,时间O(n) class Solution:def sumOfMultiples(self, n: int) -> int:return sum([i if (i % 3 0) or (i % 5 0) or (i % 7 0) else 0 for i in range(n 1)])如果只求在 [1,n] 内能被m整除的数之和,那么 ans (…

IP地址,端口,域名校验

需求: validateAddress(address) {const parts address.split(:); //例子:[192.168.0.55, 2022]const host parts[0];const port Number(parts[1]);if (/^[0-9]\.[0-9]\.[0-9]\.[0-9]$/.test(host)) {// 是 IP 地址const octets host.split(.);if (…

3、函数式编程--Optional

目录 4. Optional4.1 概述4.2 使用4.2.1 创建对象OptionalofNullable()of()empty() 4.2.2 安全消费值ifPresent 4.2.3 获取值get() 4.2.4 安全获取值orElseGetorElseThrow 4.2.5 过滤filter 4.2.6 判断isPresent 4.2.7 数据转换map 4. Optional 4.1 概述 ​ 我们在编写代码的…

伯俊ERP和金蝶云星空接口打通对接实战

伯俊ERP和金蝶云星空接口打通对接实战 对接系统伯俊ERP 伯俊科技,依托在企业信息化建设方面的领先技术与实践积累,致力于帮助企业实现全渠道一盘货。伯俊提供数字经营的咨询与系统实施,助力企业信息化升级、加速数字化转型,覆盖零…