【Pyenv使用教程】轻松管理Python版本的入门与进阶指南
[scode type="blue" size="simple"]在日常开发中，我们往往需要在同一台机器上安装和切换多个 Python 版本。pyenv 正是为此而生的一款工具，它能帮助我们方便地安装、管理和切换 Python 版本，让开发环境更加灵活。本文将详细介绍 pyenv 的安装、配置、常用命令及注意事项，帮助你快速上手并高效使用 pyenv。[/scode]1. 什么是 pyenv？pyenv 是一个轻量级的 Python 版本管理工具，它允许用户在同一台机器上安装和管理多个 Python 版本。无论你是要切换全局版本，还是为项目设置局部版本，pyenv 都能轻松实现。通过简单的命令，你可以：查看已安装的 Python 版本列表安装新版本的 Python设置全局或局部的默认 Python 版本快速切换不同项目的 Python 环境2. 安装 pyenv自动安装最便捷的安装方式是使用官方推荐的自动安装脚本。打开终端，运行以下命令：curl https://pyenv.run | bash该脚本会自动下载并安装 pyenv 以及相关插件（如 pyenv-virtualenv、pyenv-update 等）。手动安装如果你更倾向于手动安装，可以按照以下步骤操作：克隆 pyenv 仓库到本地（假设安装在 ~/.pyenv）：git clone https://github.com/pyenv/pyenv.git ~/.pyenv根据需要安装其他插件，比如 pyenv-virtualenv：git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv3. 环境配置安装完成后，需要将 pyenv 的可执行文件添加到系统 PATH 中，并在 shell 初始化时加载 pyenv。以 bash 为例，可以在 ~/.bashrc 或 ~/.bash_profile 文件中添加如下配置：# 将 pyenv 添加到 PATH export PATH="$HOME/.pyenv/bin:$PATH" # 初始化 pyenv eval "$(pyenv init --path)" eval "$(pyenv init -)"如果你使用 zsh，则需要在 ~/.zshrc 中做相同的配置。完成后，重新加载配置文件或重启终端即可。4. 使用 pyenv 安装 Python 版本安装好 pyenv 后，就可以开始安装所需的 Python 版本了。查看可用的 Python 版本列表：pyenv install --list安装特定版本，例如安装 Python 3.9.2：pyenv install 3.9.2安装过程可能需要一些编译依赖，请根据提示安装相应的依赖库。如果遇到问题，请参考官方文档中的依赖说明。5. 切换与管理 Python 版本设置全局默认版本安装完成后，可以使用 pyenv global 命令设置全局默认的 Python 版本：pyenv global 3.9.2这会让所有未单独指定 Python 版本的终端会话默认使用 3.9.2。设置局部版本在项目目录下，你可以使用 pyenv local 命令为该目录（及其子目录）指定特定的 Python 版本：pyenv local 3.8.10这会在项目目录中生成一个 .python-version 文件，记录当前目录使用的 Python 版本。列出已安装的版本使用以下命令查看当前已安装的所有 Python 版本：pyenv versions快速切换你可以临时使用特定版本运行 Python 脚本，而无需改变全局或局部设置：pyenv shell 3.7.9 python --version6. 常见问题及解决方案依赖问题在安装某些 Python 版本时，可能会提示缺少编译依赖。请参考系统的包管理工具安装缺少的依赖项（如 libssl-dev、zlib1g-dev 等）。命令未生效如果在配置了环境变量后仍无法使用 pyenv，请确认配置文件已正确加载，并尝试重启终端或执行 source ~/.bashrc。权限问题如果安装或运行过程中遇到权限问题，建议检查当前用户是否有足够的权限来修改相应目录，或者考虑使用 sudo 安装相关依赖，但一般不建议对 pyenv 本身使用 sudo。7. 总结pyenv 为 Python 开发者提供了一个便捷的版本管理工具，通过简单的命令可以轻松安装、切换和管理多个 Python 版本。无论你是在开发不同项目，还是需要测试不同版本的兼容性，pyenv 都能大大简化你的工作流程。希望这篇教程能帮助你快速上手，享受灵活高效的 Python 开发体验。更多详细信息和高级用法，请参阅 pyenv 官方文档。
[scode type="blue" size="simple"]在开发和运维过程中，我们经常需要在不同的 Linux 发行版上安装特定版本的 Python。由于各发行版的包管理器及依赖名称不同，直接利用系统自带的软件包有时无法满足需求。本文介绍一种通用的方法：通过源码编译安装 Python，同时附上卸载步骤。这种方式基本适用于 CentOS 和 Ubuntu，并能支持大部分 Python 版本（无论是 2.x 还是 3.x），只要对应版本的源码可用。[/scode]1. 为什么选择源码安装？通用性高：源码编译的方式独立于系统自带包管理器，适用于大多数 Linux 发行版；版本自由：无论你需要最新版本还是历史版本，都可以从 Python 官方网站或镜像站点获取源码；定制性强：可通过编译选项进行优化、定制安装目录，避免干扰系统默认的 Python 环境。提示： 如果你对编译过程不是很熟悉，也可以考虑 pyenv 来管理多个 Python 版本，但本文将重点介绍源码编译方法。2. 环境准备不同系统的依赖包名称有所不同，下面分别列出 CentOS 和 Ubuntu 的依赖安装步骤。在 Ubuntu 上执行以下命令安装编译所需依赖：sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential libssl-dev libffi-dev zlib1g-dev \ libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev \ libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev在 CentOS 上对于 CentOS 系统，首先安装开发工具组及常用依赖：sudo yum groupinstall "Development Tools" sudo yum install openssl-devel bzip2-devel libffi-devel zlib-devel ncurses-devel \ readline-devel sqlite-devel gdbm-devel db4-devel libpcap-devel xz-devel tk-devel注意：依赖包名称可能因 CentOS 版本而略有差异，请根据实际情况调整。3. 下载与编译 Python1.下载源码从 Python 官方下载页面 或国内镜像站下载你需要安装的 Python 源码包。例如，下载 Python 3.7.17：wget https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tgz2.解压源码包tar -xf Python-3.7.12.tgz cd Python-3.7.123.配置与编译配置时建议指定安装目录，并开启优化选项。为了避免覆盖系统默认 Python，使用 altinstall：./configure --prefix=/usr/local/python3.7.17 --enable-optimizations make -j$(nproc) sudo make altinstall[collapse status="false" title="【点击展开】make install与make altinstall的区别"] 在 Linux 系统上使用 make altinstall代替make install 主要是为了避免覆盖系统默认的 Python 版本。make install vs. make altinstallmake install默认会安装 Python，并创建或覆盖 /usr/bin/python 这个符号链接（symlink）。可能会影响系统的默认 Python 版本，从而导致某些系统工具（如 yum、dnf 等）出问题。make altinstall不会创建 /usr/bin/python 符号链接。只会安装 pythonX.Y（比如 python3.9），但不会覆盖 python 的默认版本。适用于多版本共存，比如安装 Python 3.9，但仍然保留 Python 2.7 作为默认版本。示例./configure --enable-optimizations make -j$(nproc) sudo make altinstall执行后：python3.9 可用（如果编译的是 3.9）。python 仍指向系统默认的 Python 版本（如 2.7 或 3.6）。如何切换 Python 版本如果需要使用新安装的 Python 版本，可以：python3.9 --version alias python=python3.9 # 临时切换 sudo update-alternatives --config python # 在 Debian/Ubuntu 上修改默认版本这样就能安装新版本 Python，同时不影响系统默认 Python。[/collapse]4.创建软链接（可选）如果需要方便使用，可以创建指向安装目录的软链接：sudo ln -s /usr/local/python3.7.17/bin/python3.7 /usr/local/bin/python sudo ln -s /usr/local/python3.7.17/bin/pip3.7 /usr/local/bin/pip备注： 同样的方法适用于其他版本。只需将下载链接、解压目录和安装路径替换成对应的版本号即可。4. 卸载 Python源码编译安装通常没有自带卸载脚本，卸载时需要手动删除相关文件。删除安装目录例如，如果安装目录为 /usr/local/python3.7.17，则执行：sudo rm -rf /usr/local/python3.7.17移除软链接若创建了软链接，则删除它们：sudo rm /usr/local/bin/python sudo rm /usr/local/bin/pip清理环境变量（如有）如果曾在环境变量中添加安装路径（例如修改 .bashrc 或 /etc/profile），请记得同步清理。5. 关于支持所有 Python 版本的问题适用性： 基于源码编译安装的方案，理论上支持绝大多数官方发布的 Python 版本。无论是 Python 2.x 还是 3.x，只要你能找到对应的源码包，都可以采用相同的安装步骤。依赖差异： 不同 Python 版本可能对依赖库的版本要求不同。建议在安装前查阅对应版本的官方文档，确保系统中的依赖满足要求。注意事项： 通过源码编译安装需要手动管理更新和补丁，如果对安全性和最新特性有要求，可以考虑利用专门的包管理工具或第三方版本管理工具（如 pyenv）来辅助管理多个版本。6. 总结本文介绍的源码编译安装方法为 CentOS 和 Ubuntu 提供了一种通用的 Python 安装与卸载方案。借助这种方法，你不仅可以安装 Python 3.7，也能灵活安装其他版本，满足多版本共存的需求。虽然在不同系统中所需依赖略有不同，但整体流程一致，使得跨平台配置变得更加便捷。希望这篇指南能为你在多平台、多版本 Python 环境的管理提供帮助。如果有任何问题或改进建议，欢迎在评论区讨论交流！
PyTorch中Variable变量的作用是什么，很多新手对此不是很清楚，为了帮助大家解决这个难题，下面将为大家详细讲解，有这方面需求的人可以来学习下，希望你能有所收获。一、Variable的定义：import torch from torch.autograd import Variable # torch 中 Variable 模块 tensor = torch.FloatTensor([[1,2],[3,4]]) # 把鸡蛋放到篮子里, requires_grad是参不参与误差反向传播, 要不要计算梯度 variable = Variable(tensor, requires_grad=True) print(tensor) """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable) """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """[scode type="yellow"]注：tensor不能反向传播，variable可以反向传播。[/scode]二、Variable求梯度Variable计算时，它会逐渐地生成计算图。这个图就是将所有的计算节点都连接起来，最后进行误差反向传递的时候，一次性将所有Variable里面的梯度都计算出来，而tensor就没有这个能力。v_out.backward() # 模拟 v_out 的误差反向传递 print(variable.grad) # 初始 Variable 的梯度 ''' 0.5000 1.0000 1.5000 2.0000 '''三、获取Variable里面的数据直接print(Variable) 只会输出Variable形式的数据，在很多时候是用不了的。所以需要转换一下，将其变成tensor形式。print(variable) # Variable 形式 """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data) # 将variable形式转为tensor 形式 """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data.numpy()) # numpy 形式 """ [[ 1. 2.] [ 3. 4.]] """扩展在PyTorch中计算图的特点总结如下：autograd根据用户对Variable的操作来构建其计算图。1、requires_gradvariable默认是不需要被求导的，即requires_grad属性默认为False，如果某一个节点的requires_grad为True，那么所有依赖它的节点requires_grad都为True。2、volatilevariable的volatile属性默认为False，如果某一个variable的volatile属性被设为True，那么所有依赖它的节点volatile属性都为True。volatile属性为True的节点不会求导，volatile的优先级比requires_grad高。3、retain_graph多次反向传播（多层监督）时，梯度是累加的。一般来说，单次反向传播后，计算图会free掉，也就是反向传播的中间缓存会被清空【这就是动态度的特点】。为进行多次反向传播需指定retain_graph=True来保存这些缓存。4、backward()反向传播，求解Variable的梯度。放在中间缓存中。
一、感知机概述1.如何理解感知机[scode type="green"]“感”就是感受，必然要输入；“知”就是知道，一定有输出。所以感知机就可以理解为对输入进行处理，得到并输出结果的机器。[/scode]例如，一个人朝你走来，他/她的五官信息作为输入被你的眼睛感受到，然后大脑经过综合分析、处理，得到美还是丑的结论。在这个过程中，大脑就扮演着感知机的角色。为什么大脑和感知机如此相像呢？其实是感知机和大脑像才对。因为先有大脑，再有的感知机。感知机最初的目的就是为了模拟大脑的这种行为的。一句话概括：感知机就是模拟大脑感知的机器。2.感知器介绍感知机（英语：Perceptron）是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈式人工神经网络，是一种二元线性分类器。Frank Rosenblatt给出了相应的感知机学习算法，常用的有感知机学习、最小二乘法和梯度下降法。譬如，感知机利用梯度下降法对损失函数进行极小化，求出可将训练数据进行线性划分的分离超平面，从而求得感知机模型。感知机是生物神经细胞的简单抽象。神经细胞结构大致可分为：树突、突触、细胞体及轴突。单个神经细胞可被视为一种只有两种状态的机器——激动时为‘是’，而未激动时为‘否’。神经细胞的状态取决于从其它的神经细胞收到的输入信号量，及突触的强度（抑制或加强）。当信号量总和超过了某个阈值时，细胞体就会激动，产生电脉冲。电脉冲沿着轴突并通过突触传递到其它神经元。为了模拟神经细胞行为，与之对应的感知机基础概念被提出，如权量（突触）、偏置（阈值）及激活函数（细胞体）。在人工神经网络领域中，感知机也被指为单层的人工神经网络，以区别于较复杂的多层感知机（Multilayer Perceptron）。 作为一种线性分类器，（单层）感知机可说是最简单的前向人工神经网络形式。尽管结构简单，感知机能够学习并解决相当复杂的问题。感知机主要的本质缺陷是它不能处理线性不可分问题。线性分类器的第一个迭代算法是1956年由Frank Rosenblatt提出的。这个算法被提出后，受到了很大的关注。感知器在神经网络发展的历史上占据着特殊的位置：它是第一个从算法上完整描述的神经网络。在20世纪60年代和70年代，受感知器的启发，工程师、物理学家以及数学家们纷纷投身于神经网络不同方面的研究。这个算法在今天看来依然是有效的。二、计算步骤算法图解设有 n维（特征数）输入的单个感知机（如下图所示），X1至 X2为 n维输入向量的各个分量，W1至 W2为各个输入分量连接到感知机的权量（或称权值），W0为偏置，激活函数（又称激励函数或传递函数），Z为标量输出（也称为净输入）。第一步这里 Z称为净输入（net input），它的值等于一个样本的每个维度值 X与维度对应的权重值w相乘后的和。$$ \begin{aligned} Z &= W_1 * X_1 + W_2 * X_2 + ... + W_n * X_n\\ &=\sum_{j=1}^nW_j*X_j\\ &=W^T*X \end{aligned} $$第二步计算结果 Z是一个连续的值，我们需要将结果转换为离散的分类值，因此，这里，我们使用一个转换函数，该函数称为激励函数（激活函数），这里 θ就是阈值。$$ step(z) = \begin{cases} \text{1}, & \text{Z $\ge$ $\theta$} \\ \text{0}, & \text{z $\lt$ $\theta$} \end{cases} $$第三步更新权重感知器是一个自学习算法，即可以根据输入的数据（样本），不断调整权重的更新，最终完成分类。对于权重的更新公式如下：$$ W_j = W_j + \Delta $$$$ \Delta W_j = \eta(y^i-\hat{y}^i)x_j^i $$其中：j表示某一列i表示某一个样本$\eta$：学习速率（一个介于0.0到1.0之间的常数）$y(i)$：是第i个样本的真实类标（即真实值）$y^i$：是第i个样本的预测类标（预测值）。需要注意的是，权重向量中的所有权重值是同时更新的，这意味着在所有的权重 $\Delta w_j$ 更新前，我们无法重新计算$y^i$。这里的i和j怎么理解？每次计算Z是同一个样本的维度值和权重值相乘之和，每次更新权重值会对每个权重值进行更新。类标是什么？类标就是分类的标签，在这里类标就是1或者0。更新原则感知器的权重更新依据是：如果预测准确，则权重不进行更新，否则，增加权重，使其更趋向于正确的类别。以下介绍感知器的推到过程（内核），体验一下感知器规则的简洁之美。1.对于如下所示的两种场景，若感知器对类标的预测正确，权重可不做更新：$$ \Delta w_j = \eta(-1^i-(-1)^i)x_j^i=0 $$$$ w_j = \eta(1^i-i^i)x_j^i=0 $$2.在类标预测错误的情况下，权重的值会分别趋向于正类别或者负类别的方向$$ \Delta w_j = \eta(-1^i-i^i)x^i_j=-2{\eta}x^i_j $$$$ \Delta w_j = \eta(1^i-(-1)^i)x_j^i=2\eta x^i_j $$3.解释假定$$ x^i_j = 0.5 $$且模型将此样本错误的分类到了-1类别内。再此情况下，我们应将相应的权值增1，以保证下次遇到此样本时使得激活函数$$ x^i_j=w^i_j $$能够将其更多的判定为正类别，这也相当于增大其值大于单位阶跃函数阈值的概率，以便得样本被判定为+1类$$ \Delta w^i_j=(1^i-(-1)^i)*0.5^i=2*0.5=1 $$权重的更新与$x^i_j=0.5$成比例。例如另外一个样本$x_j^i=2$被错误的分类到-1类别中，我们应更大幅度的移动决策边界，以保证下次遇到此类样本时能正确分类。$$ \Delta w_j^i = (1^i-(-1)^i)*2^i=2*2=4 $$三、Python算法实现1.对权重进行初始化。（初始化为0或者很小的数值。）2.对训练集中每一个样本进行迭代，计算输出值y。根据输出值y与真实值，更新权重。循环步骤2。直到达到指定的次数（或者完全收敛）。说明：[scode type="blue"]如果两个类别线性可分，则感知器一定会收敛。如果两个类别线性不可分，则感知器一定不会收敛。感知器收敛的前提是两个类别必须是线性可分的，且学习速率足够小。如果两个类别无法通过一个线性决策边界进行划分，可以为模型在训练数据集上的学习迭代次数设置一个最大值， 或者设置一个允许错误分类样本数量的阈值，否则，感知器训练算法将永远不停的更新权值。[/scode]感知器的基础算法import pandas as pd import numpy as np import matplotlib.pyplot as plt class Perceptron(object): """Perceptron classifier. 参数： eta (学习率): float，取值范围0.0-1.0 n_iter（在训练集进行迭代的次数） : int random_state （随机数产生器的种子）: int 属性： w_ （权重）: ，np一维数组 errors_ （存储每轮训练集判断错误的次数）: list """ def __init__(self, eta=0.01, n_iter=50, random_state=1): self.eta = eta self.n_iter = n_iter self.random_state = random_state def fit(self, X, y): """Fit training data. Parameters ---------- X : 二维np数组,形式：[[样本1维度值1，样本1维度值2...],[样本2维度值1，样本2维度值2...],...] y : 一维np数组，形式：[样本1的类标],样本2的类标，...] Returns ------- self : object """ #设置随机数种子 rgen = np.random.RandomState(self.random_state) #生成正态分布的随机数,权重w self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1]) self.errors_ = [] for _ in range(self.n_iter): # 迭代所有样本，并根据感知器规则来更新权重 errors = 0 for xi, target in zip(X, y): # print(xi,target) update = self.eta * (target - self.predict(xi)) #更新权重值 self.w_[0] += update self.w_[1:] += update * xi #预测错误：update如果不为0，则表示判断错误 errors += int(update != 0.0) self.errors_.append(errors) return self #计算z的函数 def net_input(self, X): """Calculate net input""" # ϕ(z) = w0 * 1 + w1∗x1 + w2∗x2 + ... + wm∗xm z = self.w_[0] * 1 + np.dot(X, self.w_[1:]) return z #阈值函数 def predict(self, X): """Return class label after unit step""" return np.where(self.net_input(X) >= 0.0, 1, -1) df = pd.read_csv('https://archive.ics.uci.edu/ml/' 'machine-learning-databases/iris/iris.data', header=None) print(df.tail()) # select setosa and versicolor #选择0-100行的第5列数据 y = df.iloc[0:100, 4].values #0-100行中，选择第5列的列名为Iris-setosa的数据做处理，如果 y = np.where(y == 'Iris-setosa', -1, 1) # [1,1,1,1,1,...-1,-1,-1] # extract sepal length and petal length X = df.iloc[0:100, [0, 2]].values ppn = Perceptron(eta=0.1, n_iter=10) #训练数据 ppn.fit(X, y) #迭代次数与每次迭代时预测错误的次数作图 plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o') plt.xlabel('Epochs') plt.ylabel('Number of updates') plt.savefig('运行图片/1.png', dpi=300) # plt.show()[album type="photos"][/album]怎么判断感知器是否收敛import pandas as pd import numpy as np import matplotlib.pyplot as plt class Perceptron(object): """Perceptron classifier. 参数： eta (学习率): float，取值范围0.0-1.0 n_iter（在训练集进行迭代的次数） : int random_state （随机数产生器的种子）: int 属性： w_ （权重）: ，np一维数组 errors_ （存储每轮训练集判断错误的次数）: list """ def __init__(self, eta=0.01, n_iter=50, random_state=1): self.eta = eta self.n_iter = n_iter self.random_state = random_state def fit(self, X, y): """Fit training data. Parameters ---------- X : 二维np数组,形式：[[样本1维度值1，样本1维度值2...],[样本2维度值1，样本2维度值2...],...] y : 一维np数组，形式：[样本1的类标],样本2的类标，...] Returns ------- self : object """ #设置随机数种子 rgen = np.random.RandomState(self.random_state) #生成正态分布的随机数,权重w self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1]) self.errors_ = [] for _ in range(self.n_iter): # 迭代所有样本，并根据感知器规则来更新权重 errors = 0 for xi, target in zip(X, y): # print(xi,target) update = self.eta * (target - self.predict(xi)) self.w_[0] += update self.w_[1:] += update * xi #预测错误：update如果不为0，则表示判断错误 errors += int(update != 0.0) self.errors_.append(errors) return self #计算z的函数 def net_input(self, X): """Calculate net input""" # ϕ(z) = w0 * 1 + w1∗x1 + w2∗x2 + ... + wm∗xm z = self.w_[0] * 1 + np.dot(X, self.w_[1:]) return z #阈值函数 def predict(self, X): """Return class label after unit step""" return np.where(self.net_input(X) >= 0.0, 1, -1) df = pd.read_csv('https://archive.ics.uci.edu/ml/' 'machine-learning-databases/iris/iris.data', header=None) # print(df.tail()) # select setosa and versicolor y = df.iloc[0:100, 4].values y = np.where(y == 'Iris-setosa', -1, 1) # extract sepal length and petal length X = df.iloc[0:100, [0, 2]].values # plot data ppn = Perceptron(eta=0.1, n_iter=10) ppn.fit(X, y) plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o') plt.xlabel('Epochs') plt.ylabel('Number of updates') plt.savefig('运行图片/2.png', dpi=300) # plt.show()[album type="photos"][/album]怎么判断两个类别是否线性可分使用散点图显示两个类别的两个维度import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('https://archive.ics.uci.edu/ml/' 'machine-learning-databases/iris/iris.data', header=None) print(df.tail()) # extract sepal length and petal length X = df.iloc[0:100, [0, 2]].values # plot data plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa') plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor') plt.xlabel('sepal length [cm]') plt.ylabel('petal length [cm]') plt.legend(loc='upper left') plt.savefig('运行图片/3.png', dpi=300) plt.show()[album type="photos"][/album]参考：https://blog.csdn.net/qq_42442369/article/details/87613450https://blog.csdn.net/u012806787/article/details/80116098https://blog.csdn.net/xylin1012/article/details/71931900https://blog.csdn.net/yawdeep/article/details/78827088
【期末复习】数据科学导论之最后的晚餐
填空1.简述数据清洗阶段平滑噪声数据常见的三种方法？[collapse status="false" title="答案"]分箱：通过考察数据周围的值，采用近邻来光滑有序数据的值。回归：查找拟合合两个属性的“最佳”线,使得其中一个属性可以用于预测出另一个属性。聚类：将离散点组成簇和群。[/collapse]2.什么是数据变换？[collapse status="false" title="答案"]数据变换是将数据转化成适合挖掘的形式。[/collapse]3.简述什么是最佳拟合线。[collapse status="false" title="答案"]最佳拟合线指的是在散点图上绘制的一条直线，使得在这条直线上尽可能多的通过数据点，使大部分数据落在这条线上或离这条线很近。[/collapse]4.试述购物篮分析法有几种及它们所应用的场所。[collapse status="false" title="答案"]购物篮分析法有2种分类。第一类是美式购物篮分析法 ，适用于卖场面积大 、商品种类多 、商品陈列区域距离相差大 的卖场，类似于沃尔玛；第二类是日式购物篮分析法 ，适用于营业面积小 ，商品种类少 、商品陈列区域距离相差小 的卖场，类似于便利店。[/collapse]5.请简述什么是大数据傲慢。[collapse status="false" title="答案"]大数据傲慢指以为利用大数据分析就可以完全忽略和取代传统数据的收集分析方法。[/collapse]6.简述基于内容的推荐算法思路和基于人口统计学的推荐算法思路。[collapse status="false" title="答案"]基于内容推荐：根据物品的内容来分类，类似的物品间进行推荐。基于人口统计：给用户来进行分类，根据用户的喜好推荐给相似的用户。[/collapse]7.简述决策树建立的步骤。[collapse status="false" title="答案"]决策树建立的步骤特征选择：构建根节点，使所有的训练数据放在根节点，选择最优的特征，分割子集，使得各个子集在当前的条件下有一个好的分类。决策树的生成：子集能够基本正确分类则可以构建叶节点，并把这些子集分到所对应的叶节点去，子集如果不能正确分类则选择最优的特征继续进行分割，直到所有的训练子集被基本正确分类。决策树的修剪[/collapse]8.简述什么是数据可视化。[collapse status="false" title="答案"]数据可视化是指利用计算机图形学等技术，将数据通过图形化的方式展示出来，直观的表达数据中蕴含的信息，规律和逻辑，便于用户进行观察和理解。[/collapse]9.可视化的目的是什么？[collapse status="false" title="答案"]挖掘数据有用信息分析数据形成规律预测数据未来走势[/collapse]10.可视化的一般过程，包括哪些步骤。[collapse status="false" title="答案"]（1）过滤：是选择原始数据集的一部分可视化（2）映射：是指将抽象的数据转化为可视化表示的过程（3）渲染：是指通过图形渲染库和显示卡的帮助，把经过映射的数据，以二维或者三维图形的形式绘制出来。（4）交互：是指计算机对用户的某种特定动作，作出反应。[/collapse]11.简述可视化的原则[collapse status="false" title="答案"]1.可视化的首要原则是准确和清洗2.可视化的结果要阐述事物的相关关系和变化趋势3.使用用户熟悉的事物进行数据比较4.构造实物场景，生动的展示数据[/collapse]主观题1.计算准确率与召回率计算信息检索系统评价指标，一个是准确率，一个是召回率如下图的检索结果，请计算此系统的准确率和召回率。 实际上相关的文档实际上不相关的文档检索系统返回的、判断为相关的文档153检索系统不返回的、判断为不相关的文档2510[collapse status="false" title="【算法分析】"]没什么好分析的看图上公式：[/collapse][collapse status="false" title="【参考程序】"]准确率 = $\frac{15+10}{15+3+25+10}\quad$ = $\frac{25}{53}\quad$召回率 = $\frac{15}{15+25}\quad$ = $\frac{3}{8}\quad$[/collapse]2.计算K-means[scode type="blue"]1.假设采用K-means聚类算法将下表的用户分成两类，请描述K-means聚类算法过程，距离函数采用余弦相似度。[/scode]用户CDE12342153354143325412[collapse status="false" title="【算法分析】"]先定义总共有多少个类/簇（cluster）将每个簇心（cluster centers）随机定在一个点上将每个数据点关联到最近簇中心所属的簇上对于每一个簇找到其所有关联点的中心点（取每一个点坐标的平均值）将上述点变为新的簇心不停重复，直到每个簇所拥有的点不变余弦相似度计算公式：$$ similarity=cos(\varphi)=\frac{A·B}{|A|·|B|}=\frac{\sum_{i=1}^nA_i×B_i}{\sqrt{\sum_{i=1}^nB_{i}^2}×\sqrt{\sum_{i=1}^nA_{i}^2}} $$[scode type="share"]余弦值越大越越相似。[/scode][/collapse][collapse status="false" title="【参考程序】"]答：因为我们要将用户分为两类，所以先任意选取两类，分别为用户2和用户3作为簇1和簇2两类的簇。 各个用户的摸： |A[1]| = sqrt(2^2+3^2+4^2) = 5.385 |A[2]| = sqrt(1^2+5^2+3^2) = 5.916 |A[3]| = sqrt(5^2+4^2+1^2) = 6.480 |A[4]| = sqrt(3^2+3^2+2^2) = 4.690 |A[5]| = sqrt(4^2+1^2+2^2) = 4.852 计算每个点到两个簇的距离: 到簇1的距离： Dis_1[1] = (1x2+3x5+4x3)/(A[1]*A[2]) = 29/(5.385*5.916) = 0.910 Dis_1[2] = 1 Dis_1[3] = (1x5+5x4+3x1)/(A[3]*A[2]) = 28/(6.48*5.916) = 0.730 Dis_1[4] = (1x3+5x3+3x2)/(A[4]*A[2]) = 24/(4.69*5.916) = 0.817 Dis_1[5] = (1x4+1x5+2x3)/(A[5]*A[2]) = 15/(4.852*5.916) = 0.522 到簇2的距离： Dis_2[1] = (5x2+4x3+1x4)/(A[1]*A[3]) = 26/(5.385*6.480) = 0.753 Dis_2[2] = (5x1+4x5+1x3)/(A[2]*A[3]) = 28/(5.916*6.480) = 0.730 Dis_2[3] = 1 Dis_2[4] = (5x3+4x3+1x2)/(A[4]*A[3]) = 29/(4.690*6.480) = 0.921 Dis_2[5] = (5x4+4x1+1x2)/(A[5]*A[3]) = 26/(4.852*6.480) = 0.826 根据第一次分类： 得到 簇1 有 1，2 簇2 有 3，4，5 对簇1，簇2取平均值再分类得到一样的分类类别（猜的，再写就没时间了，不可能得到不一样的类别），故停止计算。 综上所述： 使用余弦相似度分为的两类分别为 1，2，4 和 3，5； [/collapse][scode type="blue"]2.以下是男性或女性的身高与脚码的统计表。将用K-means聚类算法将它们分成两个性别的集合，中心点初定为第1、第5条数据，采用欧式距离作为距离度量。[/scode]用户升高鞋码性别A17942男B17843男C16536女D17742男E16035女[collapse status="false" title="【算法分析】"]步骤一样的直接看公式：欧式距离公式：$d=\sqrt{\sum_{j=1}^n(x_j-y_j)^2}\quad$$$ 比如说A(a_1,b_1,c_1),B(a_2,b_2,c_2): $$$$ d=\sqrt{(a_1-a_2)^2+(b_1-b_2)^2+(c_1-c_2)^2}\quad $$[/collapse][collapse status="false" title="【参考程序】"]答：由题意中心点初定为第1、第5条数据，采用欧式距离作为距离度量 所以第一个类的坐标为(179,42),第二个类的距离为(160,35)。 各个数据到第1个类的距离： dis1[1] = 0 dis1[2] = sqrt[(179-178)^2 + (42-43)^] = sqrt(1+1) = 1.414 dis1[3] = sqrt[(179-165)^2 + (42-36)^2] = sqrt(14^2+6^2) = 15.231 dis1[4] = sqrt[(179-177)^2 + (42-42)^2] = sqrt(2^2) = 2 dis1[5] = sqrt[(179-160)^2 + (42-35)^2] = sqrt(19^2 + 7^2) = 20.248 各个点到第2个类的距离： dis2[1] = sqrt[(179-160)^2 + (42-35)^2] = sqrt(19^2 + 7^2) = 20.248 dis2[2] = sqrt[(178-160)^2 + (43-35)^2] = sqrt(18^2+8^2) = 19.697 dis2[3] = sqrt[(165 - 160)^2 + (36 - 35)^2] = sqrt(5^2 + 1^2) = 5.099 dis2[4] = sqrt[(177-160)^2 + (42-35)^2] = sqrt(17^2+7^2) = 18.384 dis2[5] = 0 所以 属于类1的用户为A、B、D 属于类2的用户为C、E 取用户的平均值，再次划分类得到的两种类与此结果一样，故停止计算。 综上所述： 根据要求将他们划分为A、B、D、和C、E两个类别。[/collapse]3.朴素贝叶斯(NaiveBayes)算法比如，现在有如下的文档集，前4个文档是训练集，最后1个文档需要确定其类别。文档分为.两类，分别是日本(Japan)和中国(Chinese)。[album type="photos"][/album][collapse status="false" title="【算法分析】"]贝叶斯定理公式$P(H|X)=\frac{P(X|H)P(H)}{P(X)}$特点：需要大量的关于不同事件间概率知识，使用需要很大的计算成本朴素贝叶斯分类法假设：每一个属性都是互相独立的 attributes are conditionally independent公式：$P(X|C_i)=\prod^{n}_{k=1} P(x_k|Ci)$[/collapse]4.购物篮记录1、若某购物篮记录为：消费者1：啤酒、蛋糕、薯条、阿司匹林消费者2：尿布、婴儿乳液、葡萄汁、婴儿食品、牛奶消费者3：雪碧、薯条、牛奶消费者4：啤酒、牛奶、冰激凌、薯条消费者5：雪碧、咖啡、牛奶、面包、啤酒消费者6：啤酒、薯条请计算：1) S (啤酒→薯条)2) S (牛奶→雪碧)3) C (啤酒→薯条)4) L (啤酒→薯条)[collapse status="false" title="【算法分析】"]废话少说，上公式[scode type="blue"]1.支持度[/scode]支持度$S(A→B)$指的是[font color="#A52A2A"]A与B同时出现的概率[/font]计算公式：$S(A→B)=\frac{N(A\&B)}{N}\quad$[scode type="blue"]2.置信度[/scode]置信度$C(A→B)$指的是[font color="#A52A2A"]A出现的情况下B同时出现的概率[/font]计算公式：$C(A→B)=\frac{N(A\&B)}{N(A)}\quad$[scode type="blue"]3.提高度[/scode]提高度$L(A→B)$指的是[font color="#A52A2A"]A出现的情况对于B出现的影响度[/font]计算公式：$L(A→B)=\frac{C(A→B)}{S(B)}\quad$[/collapse][collapse status="false" title="【参考程序】"]答：根据购物篮记录 (1) S(啤酒->薯条) = 3/6 = 1/2 (2) S(牛奶->雪碧) = 2/6 = 1/3 (3) C(啤酒→薯条) = 3/4 (4) 因为S(薯条) = 4/6 = 2/3 所以L(啤酒->薯条) = C(啤酒->薯条)/S(牛奶) = (3/4)/(2/3) = 9/8[/collapse]5.线性回归（最小二乘法）广告投入和汽车销售量的历史数据如下，假设有一周广告数量为6，预测的汽车销售量是多少？（采用最小二乘法的解法）TV：xCars：yxy114324218117327[collapse status="false" title="【算法分析】"]带入最小二乘法方程即可：$$ y=kx+b $$$$ k=\frac{\sum_{i=1}^{n}(x_i-\overline{\text{x}} )(y_i-\overline{\text{y}} )}{\sum_{i=1}^{n}(x_i-\overline{\text{x}} )^2}\quad $$$$ b=\overline{\text{y}}-b_1\overline{\text{x}} $$[/collapse][collapse status="false" title="【参考程序】"]答：由题意，假设广告量为自变量x，销售量为应变量y。 所以可设线性回归方程 y = kx+b 其中k为斜率，b为截距。 根据记录表的数据可知： 平均广告量x` = (1 + 3 + 2 + 1 + 3)/5 = 2 平均销售量y` = (14 + 24 + 18 + 17 + 27)/5 = 20 所以 k = [(1-2)*(14-20)+(3-2)*(24-20)+(2-2)*(18-20)+(1-2)*(17-20)+(3-2)*(27-20)]/[(1-2)^2+(3-2)^2+(2-2)^2+(1-2)^2+(3-2)^2] = (-1*(-6)+1*4+(-1)*（-3）+1*7)/(1+1+1+1) = 20/4 = 5 由 b = y` - kx` = 20 - 2*5 = 10 得到回归方程为 y = 5x +10 所以当广告量为 6 时 5*6 + 10 = 40[/collapse]6.KNN算法假设下表是判断糖尿病的训练集，请用K近邻(KNN)算法来预测第7个用户是否患病，若k=3，分别采用欧式距离、余弦相似度为距离度量，请写出预测结果。编号ABClass(类别1为患病)153022613471438057516160734?[collapse status="false" title="【算法分析】"]首先给到需要使用到的公式：欧式距离公式：$d=\sqrt{\sum_{j=1}^n(x_j-y_j)^2}\quad$$$ 比如说A(a_1,b_1,c_1),B(a_2,b_2,c_2): $$$$ d=\sqrt{(a_1-a_2)^2+(b_1-b_2)^2+(c_1-c_2)^2}\quad $$曼哈顿距离公式：$d=\sum_{j=1}^n|x_j-y_j|$$$ 比如说A(a_1,b_1,c_1),B(a_2,b_2,c_2): $$$$ d=|a_1-a_2|+|b_1-b_2|+|c_1-c_2| $$余弦相似度计算公式：$$ similarity=cos(\varphi)=\frac{A·B}{|A|·|B|}=\frac{\sum_{i=1}^nA_i×B_i}{\sqrt{\sum_{i=1}^nB_{i}^2}×\sqrt{\sum_{i=1}^nA_{i}^2}} $$[scode type="share"]余弦值越大越越相似。[/scode]KNN计算步骤：计算所有数据与预测数据的距离按照距离从近到远进行排序选取k组(一般题目会给出k值)中类别较多的一组将需要预测的一组归类为广告选取的类别[/collapse][collapse status="false" title="【参考程序】"]答：由题意 （1）采用欧氏距离： 使用欧氏距离各个用户与用户7的距离为： dis[1] = sqrt[(5-3)^2 + (3-4)^2] = sqrt(5) dis[2] = sqrt[(2-3)^2 + (6-4)^2] = sqrt(5) dis[3] = sqrt[(4-3)^2 + (7-4)^2] = sqrt(10) dis[4] = sqrt[(3-3)^2 + (8-4)^2] = sqrt(16) dis[5] = sqrt[(7-3)^2 + (5-4)^2] = sqrt(17) dis[6] = sqrt[(1-3)^2 + (6-4)^2] = sqrt(8) 因为k = 3，距离用户7最近的3位用户分别是1、2、6 其中属于Class = 0 的用户有：1、6 属于Class = 1的用户有：2 用户7的邻居属于Class为0居多，故可认为7的Class值为0， 即用户7不患病。 （2）采用余弦相似度 各个用户的模为： A[1] = sqrt(5^2 + 3^2) = sqrt(34) A[2] = sqrt(2^2 + 6^2) = sqrt(40) A[3] = sqrt(4^2 + 7^2) = sqrt(65) A[4] = sqrt(3^2 + 8^2) = sqrt(90) A[5] = sqrt(7^2 + 5^2) = sqrt(74) A[6] = sqrt(1^2 + 6^2) = sqrt(37) A[7] = sqrt(3^2 + 4^2) = sqrt(25) 使用余弦相似度计算各个用户与用户7的距离 c[1] = (5*3+3*4)/(A[1]*A[7]) = 0.926 c[2] = (2*3+6*4)/(A[2]*A[7]) = 0.948 c[3] = (4*3+7*4)/(A[3]*A[7]) = 0.992 c[4] = (3*3+8*4)/(A[4]*A[7]) = 0.864 c[5] = (7*3+5*4)/(A[5]*A[7]) = 0.953 c[6] = (1*3+6*4)/(A[6]*A[7]) = 0.887 因为k = 3,距离用户7最近的3位用户分别是3、5、2 其中邻居属于 Class 0的用户不存在，这三个用户均属于Class 1，故根据余弦相似度， 可判断用户7属于Class 1。[/collapse]
[scode type="green"]选择题看历次课前测试[/scode]常见的有监督学习算法支持向量机（Support Vector Machines线性回归（linear regression）逻辑回归（logistic regression）朴素贝叶斯（naive Bayes）线性判别分析（linear discriminant analysis）决策树（decision trees）K-近邻（k-nearest neighbor algorithm）Multilayer perceptron[scode type="blue"]K-means算法为无监督学习算法[/scode]经典案例分类[collapse status="false" title="关联分析"]购物篮分析法亚马逊的个性化推荐潘多拉音乐组计划塔吉特的大数据营销[/collapse][collapse status="false" title="趋势预测"]谷歌流感趋势奥斯卡预测Farecast案例详析Decide案例详析[/collapse][collapse status="false" title="决策支持"]美国总统大选《纸牌屋》[/collapse]填空题1.数据科学是一门通过 填空 1 来获取 填空 2 的科学。[collapse status="false" title="答案"]正确答案：填空 1：系统性研究填空 2：与数据相关的知识体系[/collapse]2.可视化领域包括三个主要分支，分别是 填空 1 、 填空 2 以及 填空 3等。[collapse status="false" title="答案"]正确答案：填空 1：科学可视化填空 2：信息可视化填空 3：可视分析[/collapse]3.大数据能被用于打击罪犯的特征有真实性、填空 1、填空 2 。[collapse status="false" title="答案"]正确答案：填空 1：多样性填空 2：速度PS：大数据的4V特征：体量多样性真实性（价值性）速度[/collapse]4.谷歌流感监测是大数据在 填空 1 方面的应用。[collapse status="false" title="答案"]正确答案：填空 1：趋势预测PS：大数据的应用预测推荐商业情报分析科学研究[/collapse]5.有训练样本，有标注的机器学习称为 填空 1 学习，而有训练样本无标注的机器学习称为 填空 2 学习。[collapse status="false" title="答案"]正确答案：填空 1：有监督填空 2：无监督[/collapse]6.列举两个基于python的中文处理工具包 填空 1 、 填空 2。[collapse status="false" title="答案"]正确答案：填空 1：jieba填空 2：thulacPS：jieba【推荐】thulac（清华大学） ：处理utf-8编码SnowNLP：处理unicode编码，使用时需要decode/unicode，包括情感分析部分的分词处理pynlpirCoreNLPpyNLP（哈工大)NLPIP：可处理少数民族语言的分词包[/collapse][scode type="yellow"]以上是去年测试题[/scode][scode type="blue"]以下是历次课前测试填空题[/scode]7.python中注释语句符号为 填空 1[collapse status="false" title="答案"]正确答案：填空 1：#[/collapse]8.python中 填空 1 数据结构能容纳不同类型的数据。[collapse status="false" title="答案"]正确答案：填空 1：list[/collapse]9.python中else与if连写为 填空 1[collapse status="false" title="答案"]正确答案：填空 1：elif[/collapse]10.填空 1库是面向Python的机器学习软件包，它可以支持主流的有监督机器学习方法和无监督机器学习方法。[collapse status="false" title="答案"]正确答案：填空 1：scikit-learn[/collapse]11.Anaconda中安装第三方库所用的命令可以在库名前加 填空 1 。[collapse status="false" title="答案"]正确答案：填空 1：pip install[/collapse]12.填空 1 是 Python 语言的一个扩展程序库，支持大量的维度数组与矩阵运算，此外也针对数组运算提供大量的数学函数库。[collapse status="false" title="答案"]正确答案：填空 1：Numpy[/collapse]13.在python中想使用numpy库时，可用 填空 1 命令装载它。[collapse status="false" title="答案"]正确答案：填空 1：import numpy[/collapse]14.有监督学习算法与无监督学习算法的不同是，必须对训练的样本给出 填空 1。[collapse status="false" title="答案"]正确答案：填空 1：标签[/collapse]15.机器学习框架中，首先采集、预处理数据，再针对训练集进行 填空 1 的设计，确定其参数，再用它对测试集进行预测。[collapse status="false" title="答案"]正确答案：填空 1：模型[/collapse]16.填空 1和 填空 2 是目前常见的大数据处理平台。[collapse status="false" title="答案"]正确答案：填空 1：Hadoop填空 2：Spark[/collapse]17.python中 填空 1 形式用来表示下一条语句是在上一条语句的结构里。[collapse status="false" title="答案"]正确答案：填空 1：缩进[/collapse]18.购物篮分析法约分为两类 填空 1 和 填空 2 购物篮分析法，两者之所以不同思路的根本原因是因为 填空 3 差别很大。[collapse status="false" title="答案"]正确答案：填空 1：美式填空 2：日式填空 3：营业面积[/collapse]19.采用Apriori算法进行相关性分析时，需要进行两个步骤 填空 1 和 填空 2[collapse status="false" title="答案"]正确答案：填空 1：寻找频繁集填空 2：挖掘关联规则[/collapse]20.可视化的目的，是把 填空1 ，首要的原则是 填空 2 和 填空 3[collapse status="false" title="答案"]正确答案：填空 1：把复杂数据有效地展示出来填空 2：准确填空 3：清晰[/collapse]21.目前基于视频的车流量检测主要有 填空 1 和 填空 2 两种方法。[collapse status="false" title="答案"]正确答案：填空 1：设置虚拟线圈填空 2：车辆目标跟踪[/collapse]22.交通流预测分为 填空 1 交通流预测和 填空 2 交通流预测。[collapse status="false" title="答案"]正确答案：填空 1：短时填空 2：中长时[/collapse]23.有监督学习是指对 填空 1 的数据进行建模，无监督学习是对 填空 2 的数据进行建模。[collapse status="false" title="答案"]正确答案：填空 1：已标注填空 2：无标注[/collapse]24.信息系统的评价有两个指标： 填空 1 、 填空 2[collapse status="false" title="答案"]正确答案：填空 1：准确率填空 2：召回率[/collapse]25.文本检索中，向量空间模型在求两个代表文本信息的向量的距离时，采用的策略是求两向量的 填空 1[collapse status="false" title="答案"]正确答案：填空 1：夹角余弦值[/collapse]26.文本分析前要做预处理，需对文档里的文本做 填空 1 分割、 填空 2 切分。[collapse status="false" title="答案"]正确答案：填空 1：句子填空 2：词[/collapse]27.文本数据也可可视化，常见的方法为 填空 1[collapse status="false" title="答案"]正确答案：填空 1：词云[/collapse]28.把文档的内容简要概括，称为文档 填空 1[collapse status="false" title="答案"]正确答案：填空 1：摘要[/collapse]29.字符串可以用 填空 1 或者 填空 2 括起来。[collapse status="false" title="答案"]填空 1：单引号填空 2：双引号[/collapse]简答题1.请简述什么是大数据傲慢：[collapse status="false" title="答案"]以为利用大数据，就能完全忽略和取代传统数据收集方法。[/collapse]2.趋势预测与关联分析的不同之处在于？[collapse status="false" title="答案"]前者着重数据之间的相关关系建模，后者着重挖掘数据之间相关关系的存在[/collapse]3.简述基于内容的推荐算法思路：[collapse status="false" title="答案"]根据物品的内容来分类，类似的物品间进行推荐[/collapse]4.简述数据清洗阶段平滑噪声数据常见的三种方法?[collapse status="false" title="答案"]分箱回归聚类[/collapse]5.试述购物篮分析法有几种分类及所它们所应用的场所。[collapse status="false" title="答案"]购物篮分析法有2种分类。第一类是美式购物篮分析法，适用于卖场面积大、商品种类多、商品陈列区域距离相差大的卖场，类似于沃尔玛；第二类是日式购物篮分析法，适用于营业面积小，商品种类少、商品陈列区域距离相差小的卖场，类似于便利店。[/collapse]6.简述什么是最佳拟合线。[collapse status="false" title="答案"]最佳拟合线指在散点图上绘制一条直线，使得这条直线尽可能通过数据点。[/collapse]7.趋势预测的原理是？[collapse status="false" title="答案"]收集与要预测的变量可能相关的数据，建立预测模型[/collapse]8.简述基于人口统计学的推荐算法[collapse status="false" title="答案"]给用户来进行分类，根据用户的喜好推荐给相似的用户。[/collapse]9.简述Apriori算法中的频繁集与关联规则[collapse status="false" title="答案"]频繁集：是指经常在一起购买的物品集合。关联规则：是频繁集中物品之间的影响规则。[/collapse]10.简述决策树方法[collapse status="false" title="答案"]决策树方法是人们把决策问题的自然状态或条件出现的概率、行动方案、益损值、预测结果等，用一个树状图表示出来，并利用该图反映出人们思考、预测、决策的全过程。[/collapse]11.决策树有那些步骤？[collapse status="false" title="答案"]特征选择决策树的生成决策树的修剪[/collapse]12.简述数据可视化[collapse status="false" title="答案"]数据可视化是指利用计算机图形学等技术，将数据通过图形化的方式展示出来，直观地表达数据中蕴含的信息、规律和逻辑，便于用户进行观察和理解。[/collapse]13.简述大数据平台一般处理流程[collapse status="false" title="答案"]数据采集数据存储数据处理数据展现[/collapse]14.简述传统商业数据[collapse status="false" title="答案"]传统商业数据指来自于各类企业ERP系统、各种POS终端及网上支付系统等业务系统的数据，包括审计和日志等自动生成的信息。[/collapse]15.简述互联网数据[collapse status="false" title="答案"]互联网数据是指网络空间交互过程中产生的大量数据[/collapse]16.为什么要进行数据预处理？[collapse status="false" title="答案"]由于庞大的数据库和繁多的异构数据源，当今现实世界的数据库极易受噪声、默认值和不一致数据的侵扰，低质量的数据将导致低质量的挖掘结果，故需要进行数据预处理。[/collapse]17.简述大数据预处理的方法[collapse status="false" title="答案"]数据清洗数据集成数据变换数据归约[/collapse]18.简述数据清洗目的[collapse status="false" title="答案"]数据清洗目的在于纠正存在的错误，并提供数据一致性。 [/collapse]19.数据规范化有那些算法[collapse status="false" title="答案"]归一化标准化中心化[/collapse]20.大数据存储面临那些挑战[collapse status="false" title="答案"]容量问题延迟问题安全问题成本问题数据的积累灵活性应用感知[/collapse]主观题1.计算准确率与召回率计算信息检索系统评价指标，一个是准确率，一个是召回率如下图的检索结果，请计算此系统的准确率和召回率。 实际上相关的文档实际上不相关的文档检索系统返回的、判断为相关的文档153检索系统不返回的、判断为不相关的文档63[collapse status="false" title="【算法分析】"]没什么好分析的看图上公式：[/collapse][collapse status="false" title="【参考程序】"]准确率 = $\frac{15+3}{15+3+6+3}\quad$ = $\frac{2}{3}\quad$召回率 = $\frac{15}{15+6}\quad$ = $\frac{5}{7}\quad$[/collapse]2.简单线性回归这是一家4S店投放的广告和销售量的记录表，假设投放的广告量为15，用简单线性回归模型预测销售是多少?广告量销售量16721310518925[collapse status="false" title="【算法分析】"]带入简单线性回归方程即可：$$ y=kx+b $$$$ k=\frac{\sum_{i=1}^{n}(x_i-\overline{\text{x}} )(y_i-\overline{\text{y}} )}{\sum_{i=1}^{n}(x_i-\overline{\text{x}} )^2}\quad $$$$ b=\overline{\text{y}}-b_1\overline{\text{x}} $$[/collapse][collapse status="false" title="【参考程序】"]答：由题意，假设广告量为自变量x，销售量为应变量y。 所以可设线性回归方程 y = kx+b 其中k为斜率，b为截距。 根据记录表的数据可知： 平均广告量x` = (1 + 7 + 3 + 5 + 9)/5 = 5 平均销售量y` = (6 + 21 + 10 + 18 + 25)/5 = 16 所以 k = [(1-5)*(6-16)+(7-5)*(21-16)+(3-5)*(10-16)+(5-5)*(18-16)+(9-5)*(25-16)]/[(1-5)^2+(7-5)^2+(3-5)^2+(5-5)^2+(9-5)^2] = (-4*(-10)+2*5+(-2)*(-6)+4*9)/(16+4+4+16) = 98/40 = 2.45 由 b = y` - kx` = 16 - 2.45*5 = 3.75 得到回归方程为 y = 2.45x + 3.75 所以当广告量为 15 时 2.45*15 + 3.75 = 40.5[/collapse]3.K近邻(KNN)算法假设下表是判断糖尿病的训练集，请用K近邻(KNN)算法来预测第8个用户是否患病，若k=5, 采用欧式距离为距离度量,请写出预测结果。编号kuclass1230244136214141537065217640838?[collapse status="false" title="【算法分析】"]首先给到需要使用到的公式：欧式距离公式：$d=\sqrt{\sum_{j=1}^n(x_j-y_j)^2}\quad$$$ 比如说A(a_1,b_1,c_1),B(a_2,b_2,c_2): $$$$ d=\sqrt{(a_1-a_2)^2+(b_1-b_2)^2+(c_1-c_2)^2}\quad $$曼哈顿距离公式：$d=\sum_{j=1}^n|x_j-y_j|$$$ 比如说A(a_1,b_1,c_1),B(a_2,b_2,c_2): $$$$ d=|a_1-a_2|+|b_1-b_2|+|c_1-c_2| $$KNN计算步骤：计算所有数据与预测数据的距离按照距离从近到远进行排序选取k组(一般题目会给出k值)中类别较多的一组将需要预测的一组归类为广告选取的类别[/collapse][collapse status="false" title="【参考程序】"]答：由题意，k=5，使用欧氏距离。 各个编号与第8个用户计算得到的距离为： dis[1] = sqrt((2-3)^2+(3-8)^2) = sqrt(26) dis[2] = sqrt((4-3)^2+(4-8)^2) = sqrt(17) dis[3] = sqrt((6-3)^2+(2-8)^2) = sqrt(45) dis[4] = sqrt((1-3)^2+(4-8)^2) = sqrt(18) dis[5] = sqrt((3-3)^2+(7-8)^2) = sqrt(1) dis[6] = sqrt((5-3)^2+(2-8)^2) = sqrt(40) dis[7] = sqrt((6-3)^2+(4-8)^2) = sqrt(25) 注：其中sqrt为根号 由k=5，选取5个与第8个用户最近的邻居。 选取结果为：dis[5]、dis[2]、dis[4]、dis[7]、dis[1] 其中 class 为 0 的令居有dis[5]、dis[7]、dis[1] 一共3个。 class 为 1 的令居有dis[2]、dis[2] 一共2个。 综上所述：第8个用户class 为 0，即第8个用户不患病。[/collapse]4.计算支持度、置信度、提高度有购物数据集如下，请计算支持度S(面包- -> 牛奶)，及置信度C(面包一-> 牛奶)，提高度L(面包一-> 牛奶)。购物记录商品1啤酒、面包、薯条、阿司匹林2尿布、面包、葡萄酒、米糊、牛奶3雪碧、薯条、牛奶4啤酒、牛奶、冰淇淋、薯条5雪碧、咖啡、牛奶、面包、啤酒6啤酒、薯条[collapse status="false" title="【算法分析】"]废话少说，上公式[scode type="blue"]1.支持度[/scode]支持度$S(A→B)$指的是[font color="#A52A2A"]A与B同时出现的概率[/font]计算公式：$S(A→B)=\frac{N(A\&B)}{N}\quad$[scode type="blue"]2.置信度[/scode]置信度$C(A→B)$指的是[font color="#A52A2A"]A出现的情况下B同时出现的概率[/font]计算公式：$C(A→B)=\frac{N(A\&B)}{N(A)}\quad$[scode type="blue"]3.提高度[/scode]提高度$L(A→B)$指的是[font color="#A52A2A"]A出现的情况对于B出现的影响度[/font]计算公式：$L(A→B)=\frac{C(A→B)}{S(B)}\quad$[/collapse][collapse status="false" title="【参考程序】"]答：根据购物数据集 S(面包->牛奶) = N(面包&牛奶)/N = 2/6 = 1/3 C(面包->牛奶) = N(面包&牛奶)/N(面包) = 2/3 S(牛奶) = 4/6 = 2/3 L(面包->牛奶) = C(面包->牛奶) /S(牛奶)=(2/3)/(2/3)=1[/collapse]5.K-means聚类算法假设采用K-means聚类算法将下表的用户分成两类，请描述K-means聚类算法步骤，距离函数自由选定。用户ABC1112224134674313512166327554[collapse status="false" title="【算法分析】"]下面视频教程： [/collapse][collapse status="false" title="【参考程序】"]答：根据表中数据，我选择曼哈顿距离公式。 将这7个数据中，3、4设置为类心1、2。 根据曼哈顿距离公式其余各点到两个类心的距离 (1)到类心3的距离： G1[1] = |1-4| + |1-6| + |2-7| = 13 G1[2] = |2-4| + |4-6| + |1-7| = 10 G1[3] = |4-4| + |6-6| + |7-7| = 0 G1[4] = |3-4| + |1-6| + |3-7| = 10 G1[5] = |1-4| + |2-6| + |1-7| = 13 G1[6] = |6-4| + |3-6| + |2-7| = 10 G1[7] = |5-4| + |5-6| + |4-7| = 5 (2)到类心4的距离： G2[1] = |1-3| + |1-1| + |2-3| = 3 G2[2] = |2-3| + |4-1| + |1-3| = 6 G2[3] = |4-3| + |6-1| + |7-3| = 10 G2[4] = |3-3| + |1-1| + |3-3| = 0 G2[5] = |1-3| + |2-1| + |1-3| = 5 G2[6] = |6-3| + |3-1| + |2-3| = 6 G2[7] = |5-3| + |5-1| + |4-3| = 7 根据每个点距离最近的类 类1：3、7 类2：1、2、4、5、6 根据两个类所有的点，可得两类的平均坐标 A(4.5, 5.5, 5.5) B(2.6, 2.2, 1.8) 即获得新的两类坐标。 再计算各个点到两类的距离 (1)到类A的距离 dis_A[1] = |1-4.5| + |1-5.5| + |2-5.5| = 11.5 dis_A[2] = |2-4.5| + |4-5.5| + |1-5.5| = 8.5 dis_A[3] = |4-4.5| + |6-5.5| + |7-5.5| = 2.5 dis_A[4] = |3-4.5| + |6-5.5| + |7-5.5| = 3.5 dis_A[5] = |1-4.5| + |2-5.5| + |1-5.5| = 11.5 dis_A[6] = |6-4.5| + |3-5.5| + |2-5.5| = 8.5 dis_A[7] = |5-4.5| + |5-5.5| + |4-5.5| = 2.5 (2)到类B的距离 dis_B[1] = |1-2.6| + |1-2.2| + |2-1.8| = 3 dis_B[2] = |2-2.6| + |4-2.2| + |1-1.8| = 3.2 dis_B[3] = |4-2.6| + |6-2.2| + |7-1.8| = 11.8 dis_B[4] = |3-2.6| + |1-2.2| + |3-1.8| = 3.8 dis_B[5] = |1-2.6| + |2-2.2| + |1-1.8| = 3.6 dis_B[6] = |6-2.6| + |3-2.2| + |2-1.8| = 4.4 dis_B[7] = |5-2.6| + |5-2.2| + |4-1.8| = 8.4 根据每个点距离最近的类 类1：3、7 类2：1、2、4、5、6 由于关联点没有变化，所以停止计算。 所以按照题目要求，用户分为了 第一类：3、7 第二类：1、2、4、5、6[/collapse]
[scode type="blue"]简介[/scode]Python之所以如此受欢迎的一个原因就在于它能够应用于数据分析和挖掘方面的工作。不仅是在工业化运用还是在科学研究中，Python提供了非常方便和高性能的应用接口，是人们只需要关注数据本身，而不需要花太多的精力在方法上。线性回归 模型是最常见的统计模型，它反映了系统整体的运动规律。从数学的角度讲，就是根据系统的总体静态观测值，通过算法去除随机性的噪点，发现系统整体运动规律的过程。最简单的线性回归是基于最小二乘法进行拟合的，同时根据自变量的个数，分为一元线性回归分析 和多元线性回归分析 。[scode type="blue"]一元线性回归分析[/scode]一元线性回归方程如下：y=a*x+b其中a为权重或者斜率，b为截距，我们的目标是研究x和y之间的关系。假设有如下数据集：xy-3.51-4.18-4.31-2.39-2.68-6.33-3.4-4.22-4.12-3.21-2.81-5.62-3.5-4.46我们的目标就是拟合一条线性方程，在这里首先导入需要的库：import pandas as pd import matplotlib.pyplot as plt from sklearn import linear_model使用sklearn库中的 linear_model 能够快速搭建训练模型。具体代码如下：x = [-3.51, -4.31, -2.68, -3.4, -4.12, -2.81, -3.5] y = [-4.18, -2.39, -6.33, -4.22, -3.21, -5.62, -4.46] data = pd.DataFrame({'x': x, 'y': y}) x = data'x' y = data['y'] # 构建模型 reg = linear_model.LinearRegression() # 训练模型 reg.fit(x, y) # 评估模型 print(reg.coef_) # 斜率 print(reg.intercept_) # 截距 print(reg.score(x, y)) # R2值 # 预测并可视化 plt.scatter(x, y) plt.plot(x, reg.predict(x), color='red') plt.show()在这里输入数据处理稍微复杂，主要是为了构建一个DataFrame型的数据，这样的做法主要是考虑到大多数时候我们都是从文件中读取内容，因而使用pandas读取构建data数据。主要经历以下步骤：接下来调用 LinearRegression() 方法构建线性回归模型；训练模型只需要使用 fit()函数就能轻松实现；然后分析模型的参数和$R^2$ 值；最终我们将拟合的效果可视化。输出的结果如下：[-2.17951421] -11.91965440487348 0.9715399906543265它的斜率为-2.17，截距为-11.92，$R^2$ 值为0.97。表明x与y之间具有强相关性，并且是负相关的关系。可视化的图片如下：[scode type="blue"]多元线性回归分析[/scode]与一元线性回归不同，多元线性回归会出现多个自变量。它的形式如下：y=a*x1+b*x2+c其中a和b为权重，c为截距。同样，我们考察以下数据集：x1x2y-3.51-3.45.23-4.31-3.934.25-2.68-2.986.75-3.4-3.295.81-4.12-3.884.7-2.81-2.866.78-3.5-3.586.03通过Seaborn实现Seaborn提供了非常方便的可视化接口，能够快速实现线性回归拟合。代码实现如下：import pandas as pd import matplotlib.pyplot as plt import seaborn as sns x1 = [-3.51, -4.31, -2.68, -3.4, -4.12, -2.81, -3.5] x2 = [-3.4, -3.93, -2.98, -3.29, -3.88, -2.86, -3.58] y = [5.23, 4.25, 6.75, 5.81, 4.7, 6.78, 6.03] data = pd.DataFrame({'x1': x1, 'x2': x2, 'y': y}) sns.pairplot(data, x_vars=['x1', 'x2'], y_vars='y', kind='reg', size=5) plt.show()pairplot() 函数可以直接将DataFrame类型的数据可视化，通过 kind 参数选择 reg 方法，最终得到如下图：图中表明（x1，y）和（x2，y）分别具有线性关系，图中带状阴影表示数据的密度，数据越多，该处的阴影越狭窄。通过sklearn实现同样使用 LinearRegression 方法训练数据。代码如下：import pandas as pd from sklearn import linear_model x1 = [-3.51, -4.31, -2.68, -3.4, -4.12, -2.81, -3.5] x2 = [-3.4, -3.93, -2.98, -3.29, -3.88, -2.86, -3.58] y = [5.23, 4.25, 6.75, 5.81, 4.7, 6.78, 6.03] data = pd.DataFrame({'x1': x1, 'x2': x2, 'y': y}) x = data'x1', 'x2' y = data['y'] # 构建模型 reg = linear_model.LinearRegression() # 训练模型 reg.fit(x, y) # 评估模型 print(reg.coef_) print(reg.intercept_) print(reg.score(x, y))输入结果如下：[ 2.24640635 -1.03298326] 9.928015273935468 0.948262589588942y与x1之间斜率为2.25，y与x2之间斜率为-1.03，而我们的模型拟合的$R^2$ 值为0.95，有很强的相关性。[scode type="blue"]总结[/scode]本文主要介绍了以最小二乘法拟合的线性回归方法，sklearn提供了非常方便的模型供我们使用。需要注意的是，sklearn要求x是一个特征矩阵，y是一个NumPy向量。因此，在pandas中x可以是pandas的DataFrame，y可以是pandas的Series。[scode type="share"]文章地址：Python数据挖掘——线性回归 - FINTHON[/scode]
【Python】pandas DataFrame 数据转化为 列表 list的方法
我们可以先将我们的数据转化为np.array格式，然后再转化为list格式即可。 代码示例为： import pandas as pd import numpy as np from pandas import DataFrame # data_file 数据文件路径 data_file = '/Users/qiguan/Downloads/data.xlsx' # 读取文件数据 data = pd.read_excel(data_file, index_col=None) # 首先将pandas读取的数据转化为array data_array = np.array(data) # 然后转化为list形式 data_list =data_array.tolist()
数据准备import numpy as np from sklearn import linear_model import matplotlib.pyplot as plt # 数据准备 x = np.array([1,3,2,1,3]) y = np.array([14,24,18,17,27]) regr = linear_model.LinearRegression() # 模型训练 regr.fit(x.reshape(-1,1),y)数据处理# 得到直线的斜率、截距、公式 y = a*x + b a,b = regr.coef_,regr.intercept_ print('a=',a,'b=',b) # 对回归模型打分 print('score=',regr.score(x.reshape(-1,1),y)) # 可视化模型 # 1.真实的点 plt.scatter(x,y,color='blue') # 2.拟合的直线 plt.plot(x,regr.predict(x.reshape(-1,1)),color='red',linewidth=4) plt.show() # 对数据进行预测 c = np.array([6]) print('y_pre=',regr.predict(c.reshape(-1,1)))多元线性回归from sklearn import datasets # 从scikit-learn导入数据集 load_data = datasets.load_boston() # 从数据集库加载波士顿数集 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split #导入数据 data_x = load_data.data data_y = load_data.target x_train,x_verify,y_train,y_verify = train_test_split(data_x,data_y,train_size=0.8,test_size=0.2)# 建立线性回归模型及训练 lm = linear_model.LinearRegression() lm.fit(x_train,y_train) # 得到直线的斜率、截距、公式 y=a*x+b a,b = lm.coef_,lm.intercept_ print('a=',a,'\nb=',b) # 对回归模型进行检查，给实际观测点和回归方程的拟合程度打分 print('train_score=',lm.score(x_train,y_train)) # 对新输一局进行预测 predictions = lm.predict(x_verify) print('test_score=',lm.score(x_verify,y_verify))全连接神经网络回归from sklearn.neural_network import MLPRegressor from sklearn.preprocessing import StandardScaler from sklearn import datasets #从scikit-learn导入数据集 load_data = datasets.load_boston() # 从数据集库加载波士顿数据集 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split #导入数据 data_x = load_data.data data_y = load_data.target scaler = StandardScaler() # 标准化转换 scaler.fit(data_x) # 训练标准化对象 data_x = scaler.transform(data_x) # 转换数据集 x_train,x_verify,y_train,y_verify=train_test_split(data_x,data_y,train_size=0.8,test_size=0.2) # 神经网络回归 clf = MLPRegressor(solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(5,2),random_state=1) clf.fit(x_train,y_train) # 查看训练模型得分 print('train_score=',clf.score(x_train,y_train)) # 模型预测 pred = clf.predict(x_verify) # 查看预测得分 print('test_score=',clf.score(x_verify,y_verify))# 查看网络结构 index=0 for w in clf.coefs_: index += 1 print('第{}层网络层：'.format(index)) print('权重矩阵大小：',w.shape) print('系数矩阵：',w)
上课笔记导入数据from sklearn import svm import numpy as np import sklearn # 取数据集 from sklearn.datasets import load_iris # 读入数据文件 load_data = load_iris() # 导入数据和标签 data_X = load_data.data data_X = data_X[:100,:2] # 为了后面的可视化，简化特征 data_Y = load_data.target data_Y = data_Y[:100] print(data_Y)划分样本数据和标签，抽取训练集# 划分样本数据和标签 和 抽取训练集和测试集 train_data,test_data,train_label,test_label=sklearn.model_selection.train_test_split(data_X,data_Y,random_state=1,train_size=0.6,test_size=0.4) print(train_data.shape) print(test_data.shape)定义svm并训练# 定义svm并训练 classifier=svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovr') classifier.fit(train_data,train_label.ravel()) # 识别率 print('训练集：',classifier.score(train_data,train_label)) print('测试集：',classifier.score(test_data,test_label))绘制图形#绘制图形 # 确定坐标轴范围 import matplotlib import matplotlib.pyplot as plt x1_min, x1_max = data_X[:, 0].min(), data_X[:, 0].max() # 第0维特征的范围 x2_min, x2_max = data_X[:, 1].min(), data_X[:, 1].max() # 第1维特征的范围 x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j] # 生成网络采样点 grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点 # 指定默认字体 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 设置颜色 cm_light = matplotlib.colors.ListedColormap(['#A0FFA0', '#FFA0A0']) cm_dark = matplotlib.colors.ListedColormap(['g', 'r']) grid_hat = classifier.predict(grid_test) # 预测分类值 grid_hat = grid_hat.reshape(x1.shape) # 使之与输入的形状相同 plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light) # 预测值的显示 plt.scatter(data_X[:, 0], data_X[:, 1], c=data_Y, s=30, cmap=cm_dark) # 原样本 plt.scatter(test_data[:, 0], test_data[:, 1], c=test_label, s=30, edgecolors='k', zorder=2,cmap=cm_dark) # 圈中测试集样本点 plt.xlabel('花萼长度', fontsize=13) plt.ylabel('花萼宽度', fontsize=13) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title('鸢尾花SVM二特征分类') plt.show() print('ok')