Machine Learning-Ex8(吴恩达课后习题)Anomaly Detection and Recommender Systems

news2024/11/23 12:21:11

1. Anomaly detection

内容:使用高斯模型来检测数据集中异常的数据(概率低的),先在2维数据中进行实验。样本具有两个特征:a. 服务器响应的吞吐量(mb/s) b. 延迟(ms)。

数据可视化

main.py

from scipy.io import loadmat
import matplotlib.pyplot as plt

X = loadmat('ex8data1.mat')['X']
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], X[:, 1])
ax.set_xlabel('Latency(ms)')
ax.set_ylabel('Throughput(mb/s)')
plt.show()

1.1 Gaussian distribution

内容:对每个特征 x_{i} 都拟合一个高斯分布。

1.2 Estimating parameters for a Gaussian

内容:计算高斯分布函数的参数。输入一个X矩阵,得出一个包含n个特征的平均值mean和包含n个特征的sigma2。

estimateGaussian.py

def estimateGaussian(X):
    mean = X.mean(axis=0)
    sigma2 = X.var(axis=0)
    return mean, sigma2

main.py

from scipy.io import loadmat
from estimateGaussian import *  # 估算高斯分布的参数

X = loadmat('ex8data1.mat')['X']
mean, sigma2 = estimateGaussian(X)
print(mean, sigma2)

[14.11222578 14.99771051] [1.83263141 1.70974533]

数据可视化:

np.meshgrid为生成网络点坐标,如:

xplot = np.linspace(0, 25, 100)
yplot = np.linspace(0, 25, 100)
Xplot, Yplot = np.meshgrid(xplot, yplot)  # 生成网格点坐标
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(Xplot, Yplot, s=5)
plt.show()

gaussianDistribution.py

import numpy as np

def gaussianDistribution(X, mean, sigma2):
    sigma2 = np.reshape(sigma2, (1, 2))
    mean = np.reshape(mean, (1, 2))
    p = (1 / (np.sqrt(2 * np.pi) * sigma2)) * (np.exp(-(X - mean) ** 2 / (2 * sigma2)))
    # prod为累乘
    return np.prod(p, axis=1)

main.py

from scipy.io import loadmat
import numpy as np
import matplotlib.pyplot as plt
from estimateGaussian import *  # 估算高斯分布的参数
from gaussianDistribution import *  # 计算高斯分布函数

X = loadmat('ex8data1.mat')['X']
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], X[:, 1])
mean, sigma2 = estimateGaussian(X)
gaussianDistribution(X, mean, sigma2)
xplot = np.linspace(0, 25, 100)
yplot = np.linspace(0, 25, 100)
Xplot, Yplot = np.meshgrid(xplot, yplot)  # 生成网格点坐标

# 1.concatenate用于拼接数组
# 2.reshape(-1,1) 转换成1列
X = np.concatenate((Xplot.reshape(-1, 1), Yplot.reshape(-1, 1)), axis=1)
p = gaussianDistribution(X, mean, sigma2).reshape(Xplot.shape)
# 3.绘制等高线
# contour(X,Y,Z,[levels]) levels:确定轮廓线的数量和位置
contour = plt.contour(Xplot, Yplot, p, [10 ** -11, 10 ** -7, 10 ** -5, 10 ** -3, 0.1])
ax.set_xlabel('Latency(ms)')
ax.set_ylabel('Throughput(mb/s)')
plt.show()

1.3 Selecting the threshold, ε

内容:根据交叉验证集,使用 F1-score 来选择合适的阈值ε。低概率的数据可能是异常的。

精确率(precision)召回率(recall)

F_{1}=\frac{2\cdot prec\cdot rec}{prec+rec}          prec=\frac{tp}{tp+fp} \           rec=\frac{tp}{tp+fn}

selectThreshold.py

import numpy as np

def selectThreshold(pval, yval):
    best_epsilon = 0
    best_f1 = 0
    f1 = 0
    step = (pval.max() - pval.min()) / 1000
    # 1.np.arange(start,end,step):step为步长
    # 2.np.logical_and(A,B) 返回A和B与逻辑后的布尔值
    for epsilon in np.arange(pval.min(), pval.max(), step):
        predicts = pval < epsilon  # anomaly
        # 虽然predicts(多一列)与yval列数不同,但是可以按照predicts的第一行与yval的第一行进行比较。
        tp = np.sum(np.logical_and(predicts == 1, yval == 1)).astype(float)
        fp = np.sum(np.logical_and(predicts == 1, yval == 0)).astype(float)
        fn = np.sum(np.logical_and(predicts == 0, yval == 1)).astype(float)
        prec = tp / (tp + fp) if tp + fp else 0
        rec = tp / (tp + fn) if tp + fn else 0
        f1 = (2 * prec * rec) / (prec + rec) if prec + rec else 0
        if f1 > best_f1:
            best_f1 = f1
            best_epsilon = epsilon
    return best_epsilon, best_f1

main.py 

from scipy.io import loadmat
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
from estimateGaussian import *  # 估算高斯分布的参数
from gaussianDistribution import *  # 计算高斯分布
from selectThreshold import *  # 选择阈值

raw_data = loadmat('ex8data1.mat')
X, Xval, yval = raw_data['X'], raw_data['Xval'], raw_data['yval']
mean, sigma2 = estimateGaussian(X)
# print(Xval.shape, yval.shape) (307, 2) (307, 1)
# 1.stats.norm(mean,sigma2).pdf:概率密度函数
p = np.zeros(X.shape)
p[:, 0] = stats.norm(mean[0], sigma2[0]).pdf(X[:, 0])
p[:, 1] = stats.norm(mean[1], sigma2[1]).pdf(X[:, 1])
# print(p.shape)  # (307, 2)
# 2.验证集在相同模型参数下计算概率
pval = np.zeros(Xval.shape)
pval[:, 0] = stats.norm(mean[0], sigma2[0]).pdf(Xval[:, 0])
pval[:, 1] = stats.norm(mean[1], sigma2[1]).pdf(Xval[:, 1])
# print(pval.shape)  # (307, 2)

epsilon, f1 = selectThreshold(pval, yval)
print(epsilon, f1)

0.009566706005956842 0.7142857142857143

可视化结果

main.py

from scipy.io import loadmat
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
from estimateGaussian import *  # 估算高斯分布的参数
from gaussianDistribution import *  # 计算高斯分布
from selectThreshold import *  # 选择阈值

raw_data = loadmat('ex8data1.mat')
X, Xval, yval = raw_data['X'], raw_data['Xval'], raw_data['yval']
mean, sigma2 = estimateGaussian(X)
# print(Xval.shape, yval.shape) (307, 2) (307, 1)
# 1.stats.norm(mean,sigma2).pdf:概率密度函数
p = np.zeros(X.shape)
p[:, 0] = stats.norm(mean[0], sigma2[0]).pdf(X[:, 0])
p[:, 1] = stats.norm(mean[1], sigma2[1]).pdf(X[:, 1])
# print(p.shape)  # (307, 2)
# 2.验证集在相同模型参数下计算概率
pval = np.zeros(Xval.shape)
pval[:, 0] = stats.norm(mean[0], sigma2[0]).pdf(Xval[:, 0])
pval[:, 1] = stats.norm(mean[1], sigma2[1]).pdf(Xval[:, 1])
# print(pval.shape)  # (307, 2)

epsilon, f1 = selectThreshold(pval, yval)
# np.where(A)返回符合条件元素的坐标
outliers = np.where(p < epsilon)[0]
# print(outliers)  # [300 301 301 303 303 304 306 306]

fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], X[:, 1])
ax.scatter(X[outliers, 0], X[outliers, 1], c='r', marker='o')
ax.set_xlabel('Latency(ms)')
ax.set_ylabel('Throughput(mb/s)')
plt.show()

2. Recommender Systems

内容:该推荐系统将使用协同过滤算法在电影评级上进行应用。

2.1 Movie ratings dataset

内容:

n_movies:电影数量;n_users:用户数量

R(i,j):值为1表示用户 j 对电影 i 评分过,0表示未评分

y(i,j):评分(1-5),表示用户 j 对电影 i 的评分

矩阵:

X-电影的数据集(第 i 行表示由电影 i 组成的特征)

Theta-用户的数据集(第 j 行表示用户 j 对各类电影喜好程度的特征)

main.py 

from scipy.io import loadmat

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
# print(Y.shape, R.shape)  # (1682, 943) (1682, 943)
print(Y, R)

[[5 4 0 ... 5 0 0]
 [3 0 0 ... 0 0 5]
 [4 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]] [[1 1 0 ... 1 0 0]
 [1 0 0 ... 0 0 1]
 [1 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]

评估电影的平均评级

main.py

from scipy.io import loadmat
import numpy as np

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
print(Y[1, np.where(R[1, :] == 1)].mean())
# 3.2061068702290076

“可视化” 数据 

main.py

from scipy.io import loadmat
import matplotlib.pyplot as plt

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
fig, ax = plt.subplots(figsize=(8, 6))
ax.imshow(Y)
ax.set_xlabel('Users')
ax.set_ylabel('Movies')
plt.show()

2.2 Collaborative filtering learning algorithm

内容:通过给定的一些用户评级电影的数据,并最小化代价函数,来学习参数X与Theta。

2.2.1 Collaborative filtering cost function

内容:

为了评估时间少一些,我们只取了少量的数据。(四位用户 五部电影 三个特征)

costFunction.py

import numpy as np

# 1.序列化
def serialize(X, theta):
    return np.concatenate((X.ravel(), theta.ravel()))

# 2.逆序列化
def deserialize(param, n_movies, n_users, n_features):
    return param[:n_movies * n_features].reshape(n_movies, n_features), param[n_movies * n_features:].reshape(n_users, n_features)

def costFunction(param, Y, R, n_features):
    n_movies, n_users = Y.shape
    X, theta = deserialize(param, n_movies, n_users, n_features)
    return np.sum(np.power(np.multiply(X @ theta.T - Y, R), 2)) / 2

main.py

from scipy.io import loadmat
from costFunction import *  # 代价函数

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
param_data = loadmat('ex8_movieParams.mat')
X, Theta = param_data['X'], param_data['Theta']
# 这里我们只取一小段数据
n_users = 4
n_movies = 5
n_features = 3
X_sub = X[:n_movies, :n_features]
Theta_sub = Theta[:n_users, :n_features]
Y_sub = Y[:n_movies, :n_users]
R_sub = R[:n_movies, :n_users]
param_sub = serialize(X_sub, Theta_sub)
print(costFunction(param_sub, Y_sub, R_sub, n_features))
param = serialize(X, Theta)
print(costFunction(param, Y, R, 10))

22.224603725685675
27918.64012454421

2.2.2 Collaborative filtering gradient

内容:计算梯度。

gradient.py

import numpy as np
from costFunction import *  # 序列化与逆序列化的方法

def gradient(param, Y, R, n_features):
    n_movies, n_users = Y.shape
    X, Theta = deserialize(param, n_movies, n_users, n_features)
    inner = np.multiply(X @ Theta.T - Y, R)
    X_grad = inner @ Theta
    Theta_grad = inner.T @ X
    return serialize(X_grad, Theta_grad)

main.py

from scipy.io import loadmat
from gradient import *  # 计算梯度

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
param_data = loadmat('ex8_movieParams.mat')
X, Theta = param_data['X'], param_data['Theta']
param = serialize(X, Theta)
n_movies, n_users = Y.shape
n_features = X.shape[1]
X_grad, Theta_grad = deserialize(gradient(param, Y, R, n_features), n_movies, n_users, n_features)
print(X_grad, Theta_grad)

[[-6.26184144  2.45936046 -6.87560329 ... -4.81611896  3.84341521
  -1.88786696]
 [-3.80931446  1.80494255 -2.63877955 ... -3.55580057  2.1709485
   2.65129032]
 [-3.13090116  2.54853961  0.23884578 ... -4.18778519  3.10538294
   5.47323609]
 ...
 [-1.04774171  0.99220776 -0.48920899 ... -0.75342146  0.32607323
  -0.89053637]
 [-0.7842118   0.76136861 -1.25614442 ... -1.05047808  1.63905435
  -0.14891962]
 [-0.38792295  1.06425941 -0.34347065 ... -2.04912884  1.37598855
   0.19551671]] [[-1.54728877  9.0812347  -0.6421836  ... -3.92035321  5.66418748
   1.16465605]
 [-2.58829914  2.52342335 -1.52402705 ... -5.46793491  5.82479897
   1.8849854 ]
 [ 2.14588899  2.00889578 -4.32190712 ... -6.83365682  1.78952063
   0.82886788]
 ...
 [-4.59816821  3.63958389 -2.52909095 ... -3.50886008  2.99859566
   0.64932177]
 [-4.39652679  0.55036362 -1.98451805 ... -6.74723702  3.8538775
   3.94901737]
 [-3.75193726  1.44393885 -5.6925333  ... -6.56073746  5.20459188
   2.65003952]]

2.2.3 Regularized cost function

内容:正则化代价函数

regularizedContent.py

import numpy as np
from costFunction import *  # 引入未正则化的代价函数

def regularizedCostFunction(param, Y, R, n_features, learningRate):
    reg = (learningRate / 2) * np.power(param, 2).sum()
    return costFunction(param, Y, R, n_features) + reg

main.py

from scipy.io import loadmat
from gradient import *  # 计算梯度
from regularizedContent import *  # 带正则化的代价函数和梯度计算

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
param_data = loadmat('ex8_movieParams.mat')
X, Theta = param_data['X'], param_data['Theta']
n_users = 4
n_movies = 5
n_features = 3
X_sub = X[:n_movies, :n_features]
Theta_sub = Theta[:n_users, :n_features]
Y_sub = Y[:n_movies, :n_users]
R_sub = R[:n_movies, :n_users]
param_sub = serialize(X_sub, Theta_sub)
learningRate = 1.5
print(regularizedCostFunction(param_sub, Y_sub, R_sub, n_features, learningRate))
param = serialize(X, Theta)
print(regularizedCostFunction(param, Y, R, 10, learningRate=1))

31.34405624427422
32520.682450229557

2.2.4 Regularized gradient

内容:正则化梯度。

regularizedContent.py

import numpy as np
from costFunction import *  # 引入未正则化的代价函数
from gradient import *  # 引入未正则化的梯度计算

def regularizedCostFunction(param, Y, R, n_features, learningRate):
    reg = (learningRate / 2) * np.power(param, 2).sum()
    return costFunction(param, Y, R, n_features) + reg

def regularizedGradient(param, Y, R, n_features, learningRate):
    grad = gradient(param, Y, R, n_features)
    reg = learningRate * param
    return grad + reg

main.py

from scipy.io import loadmat
from gradient import *  # 计算梯度
from regularizedContent import *  # 带正则化的代价函数和梯度计算

data = loadmat('ex8_movies.mat')
Y, R = data['Y'], data['R']
param_data = loadmat('ex8_movieParams.mat')
X, Theta = param_data['X'], param_data['Theta']
n_movies, n_users = Y.shape
param = serialize(X, Theta)
learningRate = 1
X_grad, Theta_grad = deserialize(regularizedGradient(param, Y, R, 10, learningRate), n_movies, n_users, 10)
print(X_grad, Theta_grad)

[[-5.21315594  2.0591285  -5.68148384 ... -3.95439796  3.14612528
  -1.59912133]
 [-3.02846323  1.41931663 -2.11758176 ... -2.85177984  1.68511329
   2.08666626]
 [-2.4893923   2.00068576  0.1550494  ... -3.34923876  2.41055086
   4.33843977]
 ...
 [-0.82821934  0.7917289  -0.39662935 ... -0.60746963  0.28294163
  -0.71223186]
 [-0.62377152  0.60121466 -1.02043496 ... -0.84313998  1.30670669
  -0.10603832]
 [-0.31115177  0.86705203 -0.2616062  ... -1.64900127  1.08850949
   0.16318173]] [[-1.26184516  7.39696961 -0.37924484 ... -3.15312086  4.55958584
   0.91278897]
 [-2.08328593  2.06877489 -1.20656461 ... -4.37487155  4.62450461
   1.49336864]
 [ 1.71397243  1.53009129 -3.47519602 ... -5.47031706  1.46428521
   0.63418576]
 ...
 [-3.53947561  2.83086629 -1.95973324 ... -2.70464586  2.25512788
   0.52946291]
 [-3.50593747  0.42141628 -1.62891338 ... -5.37296895  3.1012226
   3.13766426]
 [-2.92779591  1.05501291 -4.62312829 ... -5.27650042  4.22109195
   2.11819114]]

2.3 Learning movie recommendations

内容:创建自己的电影评分,以生成个性化推荐。有一个提供连接电影索引到其标题的文件。

main.py

import numpy as np

# open打开一个文件
f = open('movie_ids.txt', encoding='gbk', errors='ignore')
movie_list = []
for line in f:
    tokens = line.strip().split(' ')
    movie_list.append(' '.join(tokens[1:]))  # 将电影名存入列表中
movie_list = np.array(movie_list)
print(movie_list[0])

Toy Story (1995)

2.3.1 Recommendations

内容:将自己的评级数据添加到原始数据中。训练数据,得到参数,推荐出用户可能喜欢的电影。

首先演示一下Python插入数据(非0即1,0则0)

test.py

import numpy as np

arr = np.array([
    [1, 1, 1],
    [1, 1, 0],
    [1, 1, 0]
]).reshape(3, 3)
rate = np.array([2, 3, 0]).reshape(3, 1)
arr = np.append(rate != 0, arr, axis=1)
print(arr)

[[1 1 1 1]
 [1 1 1 0]
 [0 1 1 0]] 

对评级进行归一化处理,并训练数据。

main.py

import numpy as np
from scipy.io import loadmat
from scipy.optimize import minimize
from costFunction import *
from regularizedContent import *

# open打开一个文件
f = open('movie_ids.txt', encoding='gbk', errors='ignore')
movie_list = []
for line in f:
    tokens = line.strip().split(' ')
    movie_list.append(' '.join(tokens[1:]))  # 将电影名存入列表中
movie_list = np.array(movie_list)

ratings = np.zeros((1682, 1))  # 给定一些电影的评分
ratings[0] = 4
ratings[6] = 3
ratings[11] = 5
ratings[65] = 3
ratings[68] = 5
ratings[97] = 2
ratings[182] = 4
ratings[225] = 5
ratings[354] = 5
# print(ratings.shape)  # (1682, 1)

# 1.我们现在成为user0
raw_data = loadmat('ex8_movies')
Y, R = raw_data['Y'], raw_data['R']
Y = np.append(ratings, Y, axis=1)
# print(Y.shape)
R = np.append(ratings != 0, R, axis=1)
# print(R.shape)  # (1682, 944)

n_movies, n_users = Y.shape
n_features = 10
learningRate = 10
# 2.初始化X,Theta参数
# np.random.random((a,b))-生成a行b列的浮点数(0-1随机)
X = np.random.random((n_movies, n_features))
Theta = np.random.random((n_users, n_features))
param = serialize(X, Theta)
# print(X.shape, Theta.shape, param.shape)  # (1682, 10) (944, 10) (26260,)

# 3.进行归一化
Y_mean = (Y.sum(axis=1) / R.sum(axis=1)).reshape(-1, 1)
# print(Y_mean.shape)  # (1682, 1)
Y_norm = np.multiply(Y - Y_mean, R)
# print(Y_norm.shape)  # (1682, 944)

# 4.训练数据
fmin = minimize(fun=regularizedCostFunction, x0=param, args=(Y_norm, R, n_features, learningRate), method='TNC',
                jac=regularizedGradient)
X_trained, Theta_trained = deserialize(fmin.x, n_movies, n_users, n_features)
# print(X_trained.shape, theta_trained.shape)  # (1682, 10) (944, 10)

# 5.得到训练出的数据后,给出所推荐的电影
predictions = X_trained @ Theta_trained.T
# print(predictions.shape)  # (1682, 944)
Y_mean = (Y.sum(axis=1) / R.sum(axis=1))
my_preds = predictions[:, 0] + Y_mean
# print(my_preds.shape)  # (1682,)
# argsort返回数组值从小到大的索引值
idx = np.argsort(my_preds)[::-1]  # 降序排列
for m in movie_list[idx][:5]:
    print(m)  # 取前五部高分的

Santa with Muscles (1996)
Great Day in Harlem, A (1994)
Entertaining Angels: The Dorothy Day Story (1996)
They Made Me a Criminal (1939)
Saint of Fort Washington, The (1993)

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

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

相关文章

【linux网络】正则表达式

一、正则表达式 1.1作用范围 通常用于判断语句中&#xff0c;用来检查某一个字符串是否满足某一格式 1.2正则表达式的组成 普通字符包括大小写字母、数字、标点符号及其它符号元字符元字符是指在正则表达式中具有特殊意思的专用字符&#xff0c;可以用来规定其导字符&#…

【P18】JMeter JSON JMESPath Extractor

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…

Bean的存取、五大注解、对象的注入方式、Bean的作用域和生命周期

一、Bean 的创建、存储和使用 PS&#xff1a;Java语言中的对象也叫作 Bean。 1、创建一个maven项目 PS&#xff1a;要在 pom.xml 中添加 spring 框架支持 PS&#xff1a;引入 lombok 依赖&#xff08;可以帮助实现 get 和 set 方法&#xff09; 2、存对象 2.1、创建类 启…

Linux 蜂鸣器驱动实验

蜂鸣器驱动原理 ①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。 ②、在设备树中创建蜂鸣器节点&#xff0c;在蜂鸣器节点中加入 GPIO 信息。 1、修改设备树文件 添加 pinctrl 节点 I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN&#xff0c;打开imx6ull-alien…

【01】C++的第一个程序Hello World

C的第一个应用程序&#xff08;Hello World程序&#xff09; 引言一、代码二、代码解释三、注意事项总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。 &#x1f449; &#x1f39…

报表生成工具Stimulsoft Reports.JS如何减少产品脚本的加载时间

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

Django框架之视图HttpResponse 对象

本篇文章主要内容为&#xff1a;视图中HttpResponse对象的属性、方法及json、redirect子类包含使用cookie使用、跳转、json返回的示例。 概述 HttpResponse对象是对用户访问的响应&#xff0c;与HttpRequest对象由django创建&#xff0c;HttpResponse对象是由开发人员创建。Ht…

001+limou+MySQL的基础命令

0.前言 您好&#xff0c;这里是limou3434的一篇个人博文&#xff0c;感兴趣的话您也可以看看我的其他文章。本博文是借鉴于李小威前辈所著的书籍《SQL 基础教程》所成的博文笔记&#xff0c;这本书真的很适合新手学习数据库相关的内容。本次我想给您带来的是关于MySQL的一些基…

网站神奇工具Viewport Resizer,支持手机、pad和电脑等不同尺寸大小

标题&#xff1a;Viewport Resizer&#xff1a;让网站适应不同设备的神奇工具&#xff01; 导语&#xff1a; 在互联网世界中&#xff0c;我们常常需要在不同设备上浏览网站。为了让用户在手机、平板或电脑上都能看到美观易用的页面&#xff0c;网站开发者们努力优化网站的适应…

qemu-虚拟机

qemu 官网下载地址 https://www.qemu.org/ 跨平台虚拟机&#xff0c;类型vmware&#xff0c;执行效率比vmware高 官方参考文档&#xff1a;https://www.qemu.org/docs/master/system/introduction.html kvm&#xff0c;轻量级虚拟机&#xff0c;可以加速qemu的执行 qemu-e…

微信云开发技术架构

&#xff08;仅有把抱怨环境的情绪&#xff0c;化为上进的力量&#xff0c;才是成功的保证。——罗曼罗兰&#xff09; 微信云开发 官方文档 文本只用来概述微信云开发的技术架构&#xff0c;并结合实战场景进行说明。更详细的请直接查看微信官方文档。 背景 微信云开发是微…

Oracle11g全新讲解之游标

游标 游标的作用&#xff1a;处理多行数据&#xff0c;类似与java中的集合 1.隐式游标 一般是配合显示游标去使用的&#xff0c;不需要显示声明&#xff0c;打开&#xff0c;关闭&#xff0c;系统自定维护,名称为&#xff1a;sql 常用属性&#xff1a; sql%found:语句影响了…

快速分隔文件(split),合并文件(paste)的命令;eval(先扫描输出在执行)命令

split快速分割文件&#xff0c;paste快速合并文件&#xff1b;eval命令 split命令快速分隔文件paste命令快速合并文件eval命令 split命令快速分隔文件 语法格式&#xff1a; split 【选项】 参数 原始文件 拆分后文件名前缀 常用选项 -l&#xff1a;以行数拆分 -b&#xf…

7.对象模型

对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知&#xff0c;槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击]&#xff0c;它会发出一个信号[clicked()]&#xff0c;然后与该对象连接的槽函数将被自动调用。 若某个信号与多…

图像分割之SAM(Segment Anything Model)

论文&#xff1a;Segment Anything Github&#xff1a;https://github.com/facebookresearch/segment-anything 论文从zero-shot主干网络的基础出发&#xff0c;提出了SAM&#xff08;Segment Anything Model&#xff09;模型。该模型有别于传统的分割模型。传统分割模型只能输…

正则表达式的一些元符号

正则表达式 正则表达式—通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 正则表达式是由普通字符与元字符组成 普通字符包括大小写字母、数字、标点符号及一些其他符号元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c;可以用来规定其前导字…

(数字图像处理MATLAB+Python)第四节:频域高通滤波与综合案例

文章目录 一&#xff1a;频域高通滤波&#xff08;1&#xff09;理想的高通滤波器&#xff08;2&#xff09;巴特沃斯高通滤波器&#xff08;3&#xff09;指数高通滤波器&#xff08;4&#xff09;梯形高通滤波器 二&#xff1a;综合案例——人像美化&#xff08;1&#xff09…

vue2实现高德地图 JSAPI 2.0海量点标记(标注和标注图层)->自定义点位->定时刷新点位

前提: 需要注册高德开放平台,之后创建应用并且开通Web端(JS API)平台,然后拿到securityJsCode和key 1. 基础抽取(还原示例) 1.1 组件代码 代码说明: 需要修改securityJsCode和key为自己的allowCollision为标注是否避让marker,默认为false不避让markers为地图上的标记数组layer…

【Axure教程】中继器表格寻找和标记数据

在系统表格中&#xff0c;我们想在表格中快速找到对应的数据&#xff0c;通常我们会用条件筛选来完成&#xff0c;但是用筛选的方式&#xff0c;其他数据就看不到了&#xff0c;少了两种条件之间的对比。所以如果需要数据对比的情况下&#xff0c;我们更多的是用标记数据的方式…

Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

前言 关于FOV FOV 是在任何给定时间通过人眼、相机取景器或在显示屏上可见的可观察世界的范围。它指的是整个区域的覆盖范围&#xff0c;而不是单个固定焦点。FOV 还描述了一个人可以看到可见世界的角度。 FOV 越宽&#xff0c;可以看到的可观察世界就越多。它是水平、垂直和对…