Machine Learning-Ex6(吴恩达课后习题)Support Vector Machines

news2024/9/21 5:31:00

目录

1. Support Vector Machines

1.1 Example Dataset 1

1.2 SVM with Gaussian Kernels

1.2.1 Gaussian Kernel

1.2.2 Example Dataset 2

1.2.3 Example Dataset 3

2. Spam Classification

2.1 Preprocessing Emails

2.1.1 Vocabulary List

2.2 Extracting Features from Emails

2.3 Training SVM for Spam Classification

2.4 Top Predictors for Spam 


1. Support Vector Machines

内容:前半部分使用SVM对2D数据集进行应用,后半部分使用SVM来构建垃圾邮件分类器。

1.1 Example Dataset 1

内容:使用线性内核函数的SVM,调整参数C(=1/λ)的大小,并进行观察。

main.py

from scipy.io import loadmat  # 读取.mat文件
import pandas as pd  # 数据分析

res = loadmat('ex6data1.mat')
data = pd.DataFrame(res['X'], columns=['x1', 'x2'])
data['y'] = res['y']
print(data.head())

            x1        x2   y
0  1.9643  4.5957  1
1  2.2753  3.8589  1
2  2.9781  4.5651  1
3  2.9320  3.5519  1
4  3.5772  2.8560  1

A. 可视化数据

plot.py

import matplotlib.pyplot as plt

def plotData(data):
    filter_pos = data['y'].isin([1])
    filter_neg = data['y'].isin([0])
    positive = data[filter_pos]
    negative = data[filter_neg]
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.scatter(positive['x1'], positive['x2'], marker='x', c='r', label='Positive')
    ax.scatter(negative['x1'], negative['x2'], marker='o', c='b', label='Negative')
    ax.set_xlabel('x1')
    ax.set_ylabel('x2')
    ax.legend()
    plt.show()
    return fig, ax

main.py

from scipy.io import loadmat  # 读取.mat文件
import pandas as pd  # 数据分析
from plot import *  # 数据可视化

res = loadmat('ex6data1.mat')
data = pd.DataFrame(res['X'], columns=['x1', 'x2'])
data['y'] = res['y']
plotData(data)

B. 训练线性SVM(带线性内核函数)

linearSVM.py

from sklearn import svm  # 机器学习

def linearSVM(data, C_number):
    # LinearSVC(C,max_iter, loss)
    # C:惩罚参数(1/λ),max_iter:最大迭代次数
    # loss:指定损失函数,“hinge”是标准的SVM损失
    svc = svm.LinearSVC(C=C_number, loss='hinge', max_iter=10000)
    # svc.fit(X,y) 根据给定的训练数据拟合SVM模型
    # svc.score(X,y) 返回给定测试数据和标签的平均精确度
    svc.fit(data[['x1', 'x2']], data['y'])
    print(svc.score(data[['x1', 'x2']], data['y']))  # 0.9803921568627451

main.py

from scipy.io import loadmat  # 读取.mat文件
import pandas as pd  # 数据分析
from linearSVM import *  # 线性SVM

res = loadmat('ex6data1.mat')
data = pd.DataFrame(res['X'], columns=['x1', 'x2'])
data['y'] = res['y']
C = 1  # 惩罚项
linearSVM(data, C)

C. 可视化决策边界

linearSVM.py

from sklearn import svm  # 机器学习
import numpy as np
import pandas as pd
from plot import *  # 绘制决策边界

def linearSVM(data, C_number):
    # LinearSVC(C,max_iter, loss)
    # C:惩罚参数(1/λ),max_iter:最大迭代次数
    # loss:指定损失函数,“hinge”是标准的SVM损失
    svc = svm.LinearSVC(C=C_number, loss='hinge', max_iter=10000)
    # svc.fit(X,y) 根据给定的训练数据拟合SVM模型
    # svc.score(X,y) 返回给定测试数据和标签的平均精确度
    svc.fit(data[['x1', 'x2']], data['y'])
    x1, x2 = findDecisionBoundary(svc, 0, 4, 1.5, 5, 2 * 10 ** -3)  # 寻找决策边界
    plotDecisionBoundary(data, x1, x2)

def findDecisionBoundary(svc, x1min, x1max, x2min, x2max, dis):
    x1 = np.linspace(x1min, x1max, 1000)
    x2 = np.linspace(x2min, x2max, 1000)
    coordinates = [(x, y) for x in x1 for y in x2]
    # print(len(coordinates))  # 1000*1000=1,000,000
    x_cord, y_cord = zip(*coordinates)  # 解压
    # print(len(x_cord)) #1,000,000
    points = pd.DataFrame({'x1': x_cord, 'x2': y_cord})
    # svc.decision_function(X) 样本X到分离超平面的距离
    points['val'] = svc.decision_function(points[['x1', 'x2']])
    decision = points[np.abs(points['val']) < dis]  # 这些点可以构成一个决策边界(想法:近乎贴近超平面)
    return decision.x1, decision.x2

plot.py

import matplotlib.pyplot as plt

# 数据可视化
def plotData(data):
    filter_pos = data['y'].isin([1])
    filter_neg = data['y'].isin([0])
    positive = data[filter_pos]
    negative = data[filter_neg]
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.scatter(positive['x1'], positive['x2'], marker='x', c='r', label='Positive')
    ax.scatter(negative['x1'], negative['x2'], marker='o', c='b', label='Negative')
    ax.set_xlabel('x1')
    ax.set_ylabel('x2')
    return fig, ax

# 绘制决策边界
def plotDecisionBoundary(data, x1, x2):
    fig, ax = plotData(data)
    ax.scatter(x1, x2, c='g', s=10, label='Boundary')
    ax.set_title('SVM Decision Boundary with C=1')
    ax.legend()
    plt.show()

调整参数C(=1/λ)的值:C=100

main.py

C = 100  # 惩罚项

linearSVM.py(部分修改)

def linearSVM(data, C_number):
    svc = svm.LinearSVC(C=C_number, loss='hinge', max_iter=1000)
    svc.fit(data[['x1', 'x2']], data['y'])
    print(svc.score(data[['x1', 'x2']], data['y']))  # 0.9803921568627451
    x1, x2 = findDecisionBoundary(svc, 0, 4, 1.5, 5, 2 * 10 ** -3)  # 寻找决策边界
    plotDecisionBoundary(data, x1, x2)

观察:随着C的增大,可以得到一个完美的分类结果,但是创建了一个不再适合数据的决策边界。

1.2 SVM with Gaussian Kernels

内容:我们会使用带有高斯内核函数的SVM来处理非线性分类。

1.2.1 Gaussian Kernel

内容:高斯核函数是一个表示数据间“距离”的相似度函数,参数σ可以决定相似度下降到0的快慢程度。

gaussianKernel.py

import numpy as np

def gaussianKernel(x1, x2, sigma):
    return np.exp(-np.sum((x1 - x2) ** 2) / (2 * sigma ** 2))

x1 = np.array([1, 2, 1])
x2 = np.array([0, 4, -1])
sigma = 2
print(gaussianKernel(x1, x2, sigma))

 0.32465246735834974

1.2.2 Example Dataset 2

内容:在数据集2上使用带高斯核函数的SVM找到决策边界。

main.py

from scipy.io import loadmat
import pandas as pd

raw_data = loadmat('ex6data2.mat')
data = pd.DataFrame(raw_data['X'], columns=['x1', 'x2'])
data['y'] = raw_data['y']
print(data.head())

               x1              x2  y
0  0.107143  0.603070  1
1  0.093318  0.649854  1
2  0.097926  0.705409  1
3  0.155530  0.784357  1
4  0.210829  0.866228  1

数据可视化

plot.py

import matplotlib.pyplot as plt

def plotData(data, ax):
    filter_pos = data['y'].isin([1])
    filter_neg = data['y'].isin([0])
    positive = data[filter_pos]
    negative = data[filter_neg]
    ax.scatter(positive['x1'], positive['x2'], c='r', s=15, marker='x', label='Positive')
    ax.scatter(negative['x1'], negative['x2'], c='y', s=15, label='Negative')
    ax.set_xlabel('x1')
    ax.set_ylabel('x2')
    ax.legend()

main.py

from scipy.io import loadmat
import pandas as pd
import matplotlib.pyplot as plt
from plot import *  # 绘制数据

raw_data = loadmat('ex6data2.mat')
data = pd.DataFrame(raw_data['X'], columns=['x1', 'x2'])
data['y'] = raw_data['y']
fig, ax = plt.subplots(figsize=(8, 6))
plotData(data, ax)
plt.show()

使用高斯核函数

main.py

from scipy.io import loadmat
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import svm
from plot import *  # 绘制数据

raw_data = loadmat('ex6data2.mat')
data = pd.DataFrame(raw_data['X'], columns=['x1', 'x2'])
data['y'] = raw_data['y']
# gamma:核函数系数
# probability:是否启用概率估计
svc = svm.SVC(C=100, gamma=10, probability=True)
svc.fit(data[['x1', 'x2']], data['y'])
print(svc.score(data[['x1', 'x2']], data['y']))

0.9698725376593279

foundDecisionBoundary.py

import numpy as np
import pandas as pd

def findDecisionBoundary(svc, x1_min, x1_max, x2_min, x2_max, dist):
    x1 = np.linspace(x1_min, x1_max, 1000)
    x2 = np.linspace(x2_min, x2_max, 1000)
    cordinates = [(x, y) for x in x1 for y in x2]
    x_cord, y_cord = zip(*cordinates)
    points = pd.DataFrame({'x1': x_cord, 'x2': y_cord})
    points['val'] = svc.decision_function(points[['x1', 'x2']])
    decision = points[np.abs(points['val']) < dist]
    return decision.x1, decision.x2

main.py

from scipy.io import loadmat
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import svm
from plot import *  # 绘制数据
from foundDecisionBoundary import *  # 决策边界

raw_data = loadmat('ex6data2.mat')
data = pd.DataFrame(raw_data['X'], columns=['x1', 'x2'])
data['y'] = raw_data['y']
# gamma:核函数系数
# probability:是否启用概率估计
svc = svm.SVC(C=100, gamma=10, probability=True)
svc.fit(data[['x1', 'x2']], data['y'])
x1, x2 = findDecisionBoundary(svc, 0, 1, 0.4, 1, 2 * 10 ** -3)
fig, ax = plt.subplots(figsize=(8, 6))
plotData(data, ax)
ax.scatter(x1, x2, s=10)
ax.set_title('SVM (Gaussian Kernel) Decision Boundary')
plt.show()

1.2.3 Example Dataset 3

内容:根据验证集,我们可以为SVM找到最优的C和σ参数,候选值为[0.01,0.03,0.1,0.3,1,3,10,30,100]。

main.py

from scipy.io import loadmat
import pandas as pd
import matplotlib.pyplot as plt
from plot import *  # 绘制数据

raw_data = loadmat('ex6data3.mat')
X, y, Xval, yval = raw_data['X'], raw_data['y'].ravel(), raw_data['Xval'], raw_data['yval'].ravel()
data = pd.DataFrame(X, columns=['x1', 'x2'])
data['y'] = y
print(data.head())
fig, ax = plt.subplots(figsize=(8, 6))
plotData(data, ax)
plt.show()

                x1             x2  y
0 -0.158986  0.423977  1
1 -0.347926  0.470760  1
2 -0.504608  0.353801  1
3 -0.596774  0.114035  1
4 -0.518433 -0.172515  1

 

A. 找到最优的参数C和σ

fitParam.py

from sklearn import svm

def fitParam(X, y, Xval, yval):
    C_values = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
    gamma_values = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
    best_score = 0
    best_params = {'C': None, 'gamma': None}
    for C in C_values:
        for gamma in gamma_values:
            svc = svm.SVC(C=C, gamma=gamma)
            svc.fit(X, y)
            score = svc.score(Xval, yval)
            if score > best_score:
                best_score = score
                best_params['C'] = C
                best_params['gamma'] = gamma
    return best_score, best_params

main.py

from scipy.io import loadmat
import pandas as pd
from fitParam import *  # 找到最优参数

raw_data = loadmat('ex6data3.mat')
X, y, Xval, yval = raw_data['X'], raw_data['y'].ravel(), raw_data['Xval'], raw_data['yval'].ravel()
data = pd.DataFrame(X, columns=['x1', 'x2'])
data['y'] = y
best_score, best_params = fitParam(X, y, Xval, yval)
print(best_score, best_params)

0.965 {'C': 0.3, 'gamma': 100}

main.py

from scipy.io import loadmat
import pandas as pd
from sklearn import svm  # 支持向量机
import matplotlib.pyplot as plt
from plot import *  # 绘制数据
from fitParam import *  # 找到最优参数
from foundDecisionBoundary import *  # 决策边界

raw_data = loadmat('ex6data3.mat')
X, y, Xval, yval = raw_data['X'], raw_data['y'].ravel(), raw_data['Xval'], raw_data['yval'].ravel()
data = pd.DataFrame(X, columns=['x1', 'x2'])
data['y'] = y
best_score, best_params = fitParam(X, y, Xval, yval)
svc = svm.SVC(C=best_params['C'], gamma=best_params['gamma'])
svc.fit(X, y)
x1, x2 = findDecisionBoundary(svc, -0.6, 0.3, -0.7, 0.6, 2 * 10 ** -3)
fig, ax = plt.subplots(figsize=(8, 6))
plotData(data, ax)
ax.scatter(x1, x2, s=10)
ax.set_title('SVM (Gaussian Kernel) Decision Boundary')
plt.show()

2. Spam Classification

内容:使用SVM来构建垃圾邮件过滤器。

2.1 Preprocessing Emails

内容:完成预处理邮件信息,使其更好为SVM所应用。比如:全部小写化、移除HTML标签、将所有URL统称为httpaddr、将所有邮件地址统称为emailaddr、将所有数字统称为number、将所有钱数统称为dollar、词干提取、移除标点符号以及非文字,将制表符、换行,多个空格统一为一个空格符等。

2.1.1 Vocabulary List

内容:

  • 预处理好的邮件。
  • 词汇列表:可以选择在垃圾语料库中至少出现过100次的这些单词,因为如果出现的次数较少,则可能会出现过拟合的情况。每个单词在词汇列表中都有对应的索引。
  • 映射:将预处理好的邮件中的单词与词汇列表中的单词进行对比,如果是一样的,则返回相应索引值,如果未在索引表中出现,则跳过。

2.2 Extracting Features from Emails

内容: 将邮件转化成特征向量,特征向量的维度n即为词汇列表的长度。Xi∈{0,1},Xi=0表示词汇表中的第 i 个单词在邮件中未出现,Xi=1表示词汇表中的第 i 个单词在邮件中出现。此例中特征向量长为1899,有45个非零项。

2.3 Training SVM for Spam Classification

内容:处理好的训练集有4000个邮件(含垃圾和非垃圾邮件),处理好的测试集有1000个邮件。使用SVM对其进行分类,垃圾邮件为y=1,非垃圾邮件为y=0。

main.py

from scipy.io import loadmat

rawTrainData = loadmat('spamTrain.mat')
rawTestData = loadmat('spamTest.mat')
X, y, Xtest, ytest = rawTrainData['X'], rawTrainData['y'].ravel(), rawTestData['Xtest'], rawTestData['ytest'].ravel()
print(X.shape, y.shape, Xtest.shape, ytest.shape)
# (4000, 1899) (4000,) (1000, 1899) (1000,)

说明:1899表示这封邮件的单词在词汇表(1899个词)中有无出现,出现则为1,未出现则为0。

main.py

from scipy.io import loadmat
from sklearn import svm
import numpy as np

rawTrainData = loadmat('spamTrain.mat')
rawTestData = loadmat('spamTest.mat')
X, y, Xtest, ytest = rawTrainData['X'], rawTrainData['y'].ravel(), rawTestData['Xtest'], rawTestData['ytest'].ravel()
svc = svm.SVC()
svc.fit(X, y)
# round()设置保留几位小数
print('Training accuracy={0}%'.format(np.round(svc.score(X, y) * 100, 2)))
print('Test accuracy={0}%'.format(np.round(svc.score(Xtest, ytest) * 100, 2)))

Training accuracy=99.32%
Test accuracy=98.7%

2.4 Top Predictors for Spam 

内容:垃圾邮件的主要预测因素。

main.py

from scipy.io import loadmat
from sklearn import svm
import numpy as np
import pandas as pd

rawTrainData = loadmat('spamTrain.mat')
rawTestData = loadmat('spamTest.mat')
X, y, Xtest, ytest = rawTrainData['X'], rawTrainData['y'].ravel(), rawTestData['Xtest'], rawTestData['ytest'].ravel()
svc = svm.SVC()
svc.fit(X, y)
# 创建单位矩阵
kw = np.eye(1899)
spam_val = pd.DataFrame({'idx': range(1899)})
spam_val['isspam'] = svc.decision_function(kw)
# pd.describe()返回统计变量
print(spam_val['isspam'].describe())
# count:数量统计 mean:均值 std:标准差 min:最小值

count    1899.000000
mean       -0.110039
std         0.049094
min        -0.428396
25%        -0.131213
50%        -0.111985
75%        -0.091973
max         0.396286
Name: isspam, dtype: float64

main.py

from scipy.io import loadmat
from sklearn import svm
import numpy as np
import pandas as pd

rawTrainData = loadmat('spamTrain.mat')
rawTestData = loadmat('spamTest.mat')
X, y, Xtest, ytest = rawTrainData['X'], rawTrainData['y'].ravel(), rawTestData['Xtest'], rawTestData['ytest'].ravel()
svc = svm.SVC()
svc.fit(X, y)
# 创建单位矩阵
kw = np.eye(1899)
spam_val = pd.DataFrame({'idx': range(1899)})
spam_val['isspam'] = svc.decision_function(kw)
decision = spam_val[spam_val['isspam'] > 0]
print(decision)

            idx    isspam
155    155  0.095529
173    173  0.066666
297    297  0.396286
351    351  0.023785
382    382  0.030317
476    476  0.042474
478    478  0.057344
529    529  0.060692
537    537  0.008558
680    680  0.109643
697    697  0.003269
738    738  0.092561
774    774  0.181496
791    791  0.040396
1008  1008  0.012187
1088  1088  0.132633
1101  1101  0.002832
1120  1120  0.003076
1163  1163  0.072045
1178  1178  0.012122
1182  1182  0.015656
1190  1190  0.232788
1263  1263  0.160806
1298  1298  0.044018
1372  1372  0.019640
1397  1397  0.218337
1399  1399  0.018762
1460  1460  0.001859
1467  1467  0.002822
1519  1519  0.001654
1661  1661  0.003775
1721  1721  0.057241
1740  1740  0.034107
1795  1795  0.125143
1823  1823  0.002071
1829  1829  0.002630
1851  1851  0.030662
1892  1892  0.052786
1894  1894  0.101613

main.py (词汇列表)

import pandas as pd

# sep正则
voc = pd.read_csv('vocab.txt', header=None, names=['idx', 'voc'], sep='\t')
print(voc.head())

    idx    voc
0    1     aa
1    2     ab
2    3   abil
3    4    abl
4    5  about

输出敏感(容易在垃圾邮件中出现的)词汇

main.py

from scipy.io import loadmat
from sklearn import svm
import numpy as np
import pandas as pd

rawTrainData = loadmat('spamTrain.mat')
rawTestData = loadmat('spamTest.mat')
X, y, Xtest, ytest = rawTrainData['X'], rawTrainData['y'].ravel(), rawTestData['Xtest'], rawTestData['ytest'].ravel()
svc = svm.SVC()
svc.fit(X, y)
# 创建单位矩阵
kw = np.eye(1899)
spam_val = pd.DataFrame({'idx': range(1899)})
spam_val['isspam'] = svc.decision_function(kw)
decision = spam_val[spam_val['isspam'] > 0]
# sep正则
voc = pd.read_csv('vocab.txt', header=None, names=['idx', 'voc'], sep='\t')
spamvoc = voc.loc[decision['idx']]
print(spamvoc)

           idx         voc
155    156    basenumb
173    174       below
297    298       click
351    352     contact
382    383      credit
476    477      dollar
478    479  dollarnumb
529    530       email
537    538       encod
680    681        free
697    698       futur
738    739    guarante
774    775        here
791    792        hour
1008  1009      market
1088  1089        nbsp
1101  1102    nextpart
1120  1121     numbera
1163  1164       offer
1178  1179         opt
1182  1183       order
1190  1191         our
1263  1264       pleas
1298  1299       price
1372  1373      receiv
1397  1398       remov
1399  1400       repli
1460  1461          se
1467  1468         see
1519  1520      sincer
1661  1662        text
1721  1722    transfer
1740  1741        type
1795  1796       visit
1823  1824      websit
1829  1830      welcom
1851  1852        will
1892  1893         you
1894  1895        your

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

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

相关文章

ffmpeg学习发现av_err2str使用报错问题

最近在学习ffmpeg,照着书上敲代码,发现有个av_err2str错误.书上环境是linux系统的,我使用的windows系统编译器使用的是VS2015.可能是微软的编译器和GCC编译器不太一样这个宏函数用不了. 会报这个错误. 网上找资料超级少,找到一个类似的按照上面修改ffmpeg代码.上面的错误没有了…

Java——装箱和拆箱

一.装箱和拆箱的概念 基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。Java语言规范中说道&#xff1a;在许多情况下包装与解包装是由编译器自行完成的&#xff08;在这种情况下包装称为装箱&#xff0c;解包装称为拆箱&#xff09…

360文件恢复怎么做?3种文件恢复方法分享!

案例&#xff1a;360文件恢复怎么做&#xff1f; 【为了防止病毒入侵和更好的保护电脑&#xff0c;我在电脑上安装了360杀毒软件&#xff0c;但是我昨天在进行垃圾扫描时&#xff0c;软件把我一个很重要的文件删除了&#xff0c;有没有朋友遇到过这种情况呀&#xff1f;我应该…

高数三重积分+离散二元关系+线代矩阵解线性方程

&#x1f442; 梦寻古镇 - 羽翼深蓝Wings - 单曲 - 网易云音乐 &#x1f442; 老男孩 - 1个球 - 单曲 - 网易云音乐 目录 &#x1f33c;前言 &#x1f33c;高数 &#x1f418;B站 -- 三重积分 &#x1f418;课本 -- 7种曲面 公式 &#x1f418;PPT -- 知识点 例题 &a…

【Android FrameWork(五)】- ServiceManager

文章目录 前言源码分析1.service_mananger流程2.Binder通信流程&#xff08;ServiceManager.addService&#xff09;3.Binder的cmd流程图 拓展知识总结1.service_manager2.Binder 前言 接上一篇文章 源码分析 1.service_mananger流程 2.Binder通信流程&#xff08;ServiceMan…

VScode好用的设置(鼠标滚动缩进字体大小等等)

首先我们打开VScode软件&#xff0c;找到左下角的设置 点击设置&#xff0c;找到setting.json&#xff0c;然后点进去 把下面的复制进去&#xff0c;如果想看&#xff0c;可以鼠标悬浮在上面点击看详情 { "workbench.startupEditor": "none", "files.…

电商平台架构演变

大家好&#xff0c;我是易安&#xff01; 今天&#xff0c;我以国内这些年来电商平台的架构的角度&#xff0c;来具体说明下&#xff0c;电商架构是如何一步步演进的。 从2003年淘宝上线开始&#xff0c;国内电商平台经历了高速的发展&#xff0c;在这个过程中&#xff0c;系统…

dwebsocket实现后端数据实时刷新

执行定时任务的时候&#xff0c;我们需要了解执行百分比或者实时数据返回&#xff0c;这时候可以采用的方法1.ajax请求后端服务器&#xff0c;然后前端页面局部渲染获取百分比 2.使用webscoket进行长连接交流刷新 ajax使用方法使用interval函数来实现定时请求&#xff0c;本次这…

【三十天精通Vue 3】第十七天 Vue 3的服务器渲染详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 服务器端渲染概述1.1 服务器端渲染的概念1.2 Vue 3…

【SpringBoot实践】Web请求中日期字符串与LocalDate、LocalDateTime的通用转换

1.背景 最近在做一个后台项目&#xff0c;在这个项目中涉及到了多种与日期相关的请求参数&#xff0c;在请求对象中使用了LocalDate与LocalDateTime两个日期类型。通过日期字符串与前端进行交互&#xff0c;也包含两种格式&#xff1a;yyyy-MM-dd HH:mm:ss与yyyy-MM-dd。 在以…

STM32 学习笔记_5 调试方法;外部中断

调试 OLED&#xff1a;方便&#xff0c;试试更新&#xff0c;但是显示框小。 串口&#xff1a;数据全&#xff0c;但是带电脑不方便。 MDK 自带 debug OLED 调试 4个引脚的&#xff1a;3.3~5V 电压&#xff0c;地&#xff0c;SCL SDA 的 IIC。 我们把 GND-VCC-SCL-SDA 接…

微信小程序国际化

参考文件: 国际化&#xff08;微信小程序TS 微信小程序国际化 一、环境目录 注意:一定要注意项目目录结构&#xff0c;新建文件夹miniprogram&#xff0c;并把前面新建的文件移到这个目录中 二、安装根目录依赖 在NEW-FAN-CLOCK1 中安装根目录依赖 npm i -D gulp minipro…

provide和inject,Teleport,Fragment

作用:实现祖孙组件间通信 套路:父组件有一个provide选项来提供数据&#xff0c;子组件有一个inject选项来开始使用这些数据 父组件 只要provide了&#xff0c;那么后代都能拿到&#xff0c;父子之间一般使用props&#xff0c;祖孙组件一般采用provide 响应式数据判断 isRef:…

TIA博途中文本列表的具体使用方法介绍与示例

TIA博途中文本列表的具体使用方法介绍与示例 一、 文本列表的概念 应用场景:设备的当前操作模式、当前的运行流程、当前的运行状态等 功能介绍:  根据信号数值的不同,显示不同的文本  通过下拉列表选择不同的文本给变量赋值  通过文本列表实现配方元素数值的选择输入…

直播系统开发中如何优化API接口的并发

概述 在直播系统中&#xff0c;API接口并发的优化是非常重要的&#xff0c;因为它可以提高系统的稳定性和性能。本文将介绍一些优化API接口并发的方法。 理解API接口并发 在直播系统中&#xff0c;API接口是用于处理客户端请求的关键组件。由于许多客户端同时连接到系统&…

云计算与多云混合云架构的比较与选择

第一章&#xff1a;引言 随着互联网的迅速发展&#xff0c;云计算逐渐成为了一个热门话题。而随着企业的不断发展&#xff0c;多云混合云架构逐渐成为了一种重要的技术架构。本文将从中国国内资深IT专家的角度&#xff0c;对云计算和多云混合云架构进行比较和选择的分析&#…

IPSec数据报文封装格式详解

以下遵循GMT 0022-2014 IPSec VPN 技术规范。 IPsec提供两种封装协议AH&#xff08;鉴别头&#xff0c;Authentication Header&#xff09;和ESP&#xff08;封装安全载荷&#xff0c;Encapsulation Security Payload&#xff09;。 AH可以提供无连接的完整性、数据源鉴别和抗重…

Linux 进程通讯 - 共享内存机制

共享内存机制&#xff0c;就是在物理内存中划分一段内存&#xff0c;多个进程间可以共同访问这段内存&#xff0c;也可对这段内存做修改操作&#xff0c;从而达到进程通讯的效果&#xff01; 共享内存机制是允许两个或多个进程&#xff08;不相关或有亲缘关系&#xff09;访问…

JavaWeb02(servlet)

目录 一.servlet 1.1 什么是servlet? 1.2 实现接口,初始代码 1.3 学会配置和映射 1.4 掌握servlet的生命周期 生命周期的各个阶段 1.5 获取servlet初始化参数和上下文参数 1.5.1 初始代码 推荐使用 1.5.2 初始化参数 1.5.3 上下文参数 1.6 servlet应用:处理用户登…

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践

在本文中&#xff0c;你将看到以下内容&#xff1a; 全球通信网络在接入点、链路加速、服务商、协议等层面的动态演进&#xff1b; 进入到具体市场&#xff0c;禁运国、跨国拦截、区域一致性差等细节“坑点”如何应对&#xff1b; 融云如何从技术侧帮助开发者应对本地化用户体…