机器学习之降维方法总结

article/2025/9/14 4:44:17
          降维方法分为线性降维方法和非线性降维方法,看下表:

这里写图片描述
本文结构如下:

  1. 线性降维方法
  2. 主成分分析法
  3. 线性判别法
  4. 奇异值分解法
  5. 因子分析法
  6. 非线性降维方法~~流形学习简介


说到维度,其目的是用来进行特征选择和特征提取,注意特征选择和特征提取这二者的不同之处:
特征选择:选择重要特征子集,删除其余特征。
特征提取:由原始特征形成较少的新特征。
在特征提取中,我们要找到k个新的维度的集合,这些维度是原来k个维度的组合,这个方法可以是监督的,也可以是非监督的,
pca-非监督的
lda(线性判别分析)-监督的
这两个都是线性投影来进行降为的方法。
另外,因子分析,和多维标定(mds)也是非监督的线性降为方法

降维的作用:

  1. 降低时间复杂度和空间复
  2. 节省了提取不必要特征的开销
  3. 去掉数据集中夹杂的噪
  4. 较简单的模型在小数据集上有更强的鲁棒性
  5. 当数据能有较少的特征进行解释,我们可以更好 的解释数据,使得我们可以提取知识。
  6. 实现数据可视化

线性降维方法


  1. 子集选择
  2. 主成分分析(还有基于核方法的主成分分析)
  3. 因子分析
  4. 独立成分分析
  5. 线性判别分析
  6. 多维标定法(MDS)
  7. 我们还会讨论矩阵分解:比如svd

子集选择

  属性子集选择1通过删除不相关或冗余的属性(或维)减少数据量。属性子集选择的目标是找出最小属性集,使得数据类的概率分布尽可能地接近使用所有属性得到的原分布。在缩小的属性集上挖掘还有其他的优点:它减少了出现在发现模式上的属性数目,使得模式更易于理解。

“如何找出原属性的一个‘好的’子集?”对于n个属性,有2n个可能的子集。穷举搜索找出属性的最佳子集可能是不现实的,特别是当n和数据类的数目增加时。因此,对于属性子集选择,通常使用压缩搜索空间的启发式算法。通常,这些方法是典型的贪心算法,在搜索属性空间时,总是做看上去是最佳的选择。它们的策略是做局部最优选择,期望由此导致全局最优解。在实践中,这种贪心方法是有效的,并可以逼近最优解。

“最好的”(和“最差的”)属性通常使用统计显著性检验来确定。这种检验假定属性是相互独立的。也可以使用一些其他属性评估度量,如建立分类决策树使用的信息增益度量2。

属性子集选择的基本启发式方法包括以下技术,其中一些在图3.6中给出。

这里写图片描述
这里要注意的是,我们选特征要在验证集上进行,而不是训练集上进行,一般来说,更多的特征对于训练集上的准确度是有帮助的,但是在测试集上就不一定了。

下面这里所说的最好属性,是说最能降低验证集合错误率的属性。
1)逐步向前选择:该过程由空属性集作为归约集开始,确定原属性集中最好的属性,并将它添加到归约集中。在其后的每一次迭代,将剩下的原属性集中的最好的属性添加到该集合中。

2)逐步向后删除:该过程由整个属性集开始。在每一步中,删除尚在属性集中最差的属性。

3)逐步向前选择和逐步向后删除的组合:可以将逐步向前选择和逐步向后删除方法结合在一起,每一步选择一个最好的属性,并在剩余属性中删除一个最差的属性。

4)决策树归纳:决策树算法(例如,ID3、C4.5和CART)最初是用于分类的。决策树归纳构造一个类似于流程图的结构,其中每个内部(非树叶)结点表示一个属性上的测试,每个分枝对应于测试的一个结果;每个外部(树叶)结点表示一个类预测。在每个结点上,算法选择“最好”的属性,将数据划分成类。

子集选择的缺点:

把属性和属性之间看成是完全独立的,有时候,一个X1和一个x2单独是不能提供什么信息的,但是x1和x2在一起就能够提供很多的信息,
例如:在人脸识别中,单一的维度是一个像素点,是不能提供有效的信息的,但是很多像素共同作用就能提供有效的组合特征。

子集选择实现:看这篇博文:。。。。。。。。。。。。。。。。。。。

主成分分析

在把讨论主成分分析的理论之前,我们看一下pca的直观理解。

这里写图片描述
这是我们数据的原始分布,如上图。现在我们想要用一组新的坐标来表示这个数据,往下看
这里写图片描述
我们新的坐标的选择方式:找到第一个坐标,数据集在该坐标的方差最大(方差最大也就是我们在这个数据维度上能更好的区分不同类型的数据),然后找到第二个坐标,该坐标与原来的坐标正交。该过程会一一直的重复,知道新坐标的数目与原来的特征个数相同,这时候我们会发现数据打大部分方差都在前面几个坐标上表示,这些新的维度就是我们所说的主成分。
再看面例子:
这里写图片描述

图片中有三类数据,我们发现在x这个维度上就能很好的区分三个类别,所以我们用pca降为得到下面的图片,如果不降维度。我们可以用比说决策树或者svm等方法的到分类的决策面,那么分类决策面是更复杂的。上面这个例子只是二维的情况,这种提升看起来作用不大,但是当数据是更高维度的时候,pca的意义就显现出来。

在进行pca分析之前,我们先对数据进行标准化处理。这个因为每个维度数据的分布是不同的,比说一个维度是0~2000,另一个维度是0~6
第二个维度的方差更小,但是这样是显然不对的。
这里写图片描述
这样处理之后,每个维度的数据分布都服从标准正态分布,均值0方差是1。其中(xi是地i维度的数据)

这里写图片描述
这里写图片描述

通过上面的论述,我们会发现,pca是一种线性降维的方法,对原始数据进行线性变换,然后新的数据其实原始数据的线性组合。而线性变换的方式是无穷多的,通过对线性变换进行一些限制。就产生了pca方法。
接下来讨论这些限制如何实现。

这里先解释一下投影的概念:
这里写图片描述

这里写图片描述

现在我们知道了,样本协方差矩阵对应的特征值就等于新样本数据在对应特征向量下的方差。
而我们的k值,也就是主成分的个数怎么选取呢?根据如下图:
这里写图片描述
我们最后想保留多少信息将决定我们最终选择几个k值。

pca的不足之处:
(1)这里写图片描述
这里写图片描述
(2)pca是线性降维方法,有时候数据之间的非线性关系是很重要的,这时候我们用pca会得到很差的结果。所有接下来我们引入核方法的pca。
(3)主成分分析法只在样本点服从高斯分布的时候比较有效。
(4)特征根的大小决定了我们感兴趣信息的多少。即小特征根往往代表了噪声,但实际上,向小一点的特征根方向投影也有可能包括我们感兴趣的数据;
(5)特征向量的方向是互相正交(orthogonal)的,这种正交性使得PCA容易受到Outlier的影响,例如在文献[1]中提到的例子;
(6)难于解释结果。例如在建立线性回归模型(Linear Regression Model)分析因变量(response)和第一个主成份的关系时,我们得到的回归系数(Coefficiency)不是某一个自变量(covariate)的贡献,而是对所有自变量的某个线性组合(Linear Combination)的贡献。
(7)原始的pca算法会把所有的数据一次性的放入内存中,这在大数据集的情况下有可能会遇到问题,所以有人提出了增量式的pca,这在sklearn中是有实现的。

核方法的主成分分析
在讨论核方法的主成分分析之前,先要知道核方法,或者说核技巧(kernel trick)
是干什么的。关于这一点在李航的《统计学习方法》中讲的比较清楚。
这里写图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AjW6Jevs-1635756880514)(https://img-blog.csdn.net/20161123101406538)]

我们看到通过对原来的样本点进行非线性的映射可以使的原来非线性可分的问题,在新的空间中线性可分。
上面的问题只是一个简化的例子,在实际的问题中我们的样本要复杂的多,我的样本维度要高的多了,我们对样本无法有像上面例子这样那么直观的认识,那么我们的的非线性映射[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXXMoV7Y-1635756880515)(https://zhihu.com/equation?tex=%5Cphi%28x_i%29)]  这个东西怎么确定呢?是随便确定一个它,然后对样本进行使用,然后在应用到我们实际的模型之上吗?可以想像这个过程是很难进行的。
然而通过核函数,或者说kenel trick,我们将大大的简化这个问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VGzfaPN-1635756880517)(https://img-blog.csdn.net/20161123102511244)]
这里写图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gB7bVX90-1635756880519)(https://img-blog.csdn.net/20161123102637605)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9Te0hTJ-1635756880523)(https://img-blog.csdn.net/20161123120553461)]

核技巧不仅仅能用用在支持向量机,只要原始的机器学习算法中有两个向量的内积,就可以尝试应用核技巧。

关于核的选择我们我们更多的时候是通过实验(在验证集上实验)来得到的。
下面总结一下常用核。看下面这个链接
http://scikit-learn.org/stable/modules/metrics.html#metrics

接下来看一下核技巧的pca算法。看下面这个链接。

https://zhuanlan.zhihu.com/p/21583787
(其实这个链接也并没看明白,数学太烂)
先有下面一个直观的认识吧。
在Kernel PCA分析之中,我们认为原有数据有更高的维数,我们可以在更高维的空间(Hilbert Space)中做PCA分析(即在更高维空间里,把原始数据向不同的方向投影)。这样做的优点有:对于在通常线性空间难于线性分类的数据点,我们有可能再更高维度上找到合适的高维线性分类平面

pca的一个实际使用的例子


import numpy as np
import matplotlib.pyplot as pltfrom sklearn import linear_model, decomposition, datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCVlogistic = linear_model.LogisticRegression()pca = decomposition.PCA()
pipe = Pipeline(steps=[('pca', pca), ('logistic', logistic)])digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
pca.fit(X_digits)plt.figure(1, figsize=(4, 3))
plt.clf()
plt.axes([.2, .2, .7, .7])
plt.plot(pca.explained_variance_, linewidth=2)
plt.axis('tight')
plt.xlabel('n_components')
plt.ylabel('explained_variance_')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUgOa8Uv-1635756880524)(http://scikit-learn.org/stable/_images/sphx_glr_plot_digits_pipe_001.png)]

n_components = [20, 40, 64]
Cs = np.logspace(-4, 4, 3)#Parameters of pipelines can be set using ‘__’ separated parameter names:estimator = GridSearchCV(pipe,dict(pca__n_components=n_components,logistic__C=Cs))
estimator.fit(X_digits, y_digits)plt.axvline(estimator.best_estimator_.named_steps['pca'].n_components,linestyle=':', label='n_components chosen')
plt.legend(prop=dict(size=12))
plt.show()

最后我们得到结,在20,40,64。三个主成分的数量选择中,通过与逻辑回归的交叉选择,我们最后认为40个主要成分在后面的逻辑回归上有更好的选择。在这个例子上说明,虽然pca是一种无监督的降维方法,我们在最后选择合适的维度的时候,还是要通过在训练集上的验证得到。所以我们主成成分的个数n可以看成是一个超参数。。。

线性判别分析(LDA)

我们会先叙述LDA的原理,然后看一个LDA的例子,然后在同一个例子上面我们讨论LDA和PCA降维方法的异同点。

http://www.cnblogs.com/jerrylead/archive/2011/04/21/2024389.html
LDA算法的原理就看一下这位大神的分析把。
http://bluewhale.cc/2016-04-10/linear-discriminant-analysis.html
这里讲述了线性判别算法的具体计算过程。

自我感觉,线性判别方法和逻辑回归,svm一样都是在找一个好的分类的超平面,而LDA是一种直接的方法,通过样本的原始分布计算出来,而逻辑回归,svm,感知机等寻找超平面。都是一种迭代的方法,通过随机梯度下降来渐进的拟合出能够分类数据的超平面。

http://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html#sklearn.discriminant_analysis.LinearDiscriminantAnalysis
这个链接里面简述了LDA在sklearn中的实现。注意LDA应用权重缩减之后的效果会得到显著的提升,这也从侧面应证了lda和lR等算法的一致性。

在iris数据集上实验LDA算法和LR算法,看看两个算法的效果差异。



奇异值分解(svd)

参考的链接如下:

http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
机器学习实战

关于特征值分解的理论看上面这个链接都可以了。

特征值分解用于推荐系统的两个例子。

(1)直接使用svd方法来进行推荐

这个方法只用到了svd算法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9lhQkKR-1635756880526)(https://img-blog.csdn.net/20161129144932280)]
把上表当作一个矩阵,
然后进行,非负矩阵分解,或者svd分解,
利用分解后的矩阵重构出一个新的矩阵
这时新重构的矩阵在原来没有评分的矩阵已经有了评分
然后在新的矩阵中将用户打过分的物品过滤掉
最后为用户推荐得分最高的物品。
具体参考这篇论文。
(2)svd算法和协同过滤的组合算法
在机器学习实战中有实现。

这个代码先实现了一个基于物品相似度的推荐
一个用户,我们想预测他没有评分的物品,一种最简单的方法是,把它对物品所有的评分算一个平均数。
基于物品相似度的改进:
在计算平均值时,我们认为和待评分物品相似的物品应有越大的权值,
所以我们计算待评分物品和该用户评估分物品的相似度
然后进行加权平均。

而这里svd的应用就是通过

U, Sigma, VT = la.svd(dataMat)Sig4 = mat(eye(4) * Sigma[:4])  # arrange Sig4 into a diagonal matrixxformedItems = dataMat.T * U[:, :4] * Sig4.I

这一段代码,将矩阵按照的行进行降维,
将代表物品的向量从n(n个用户)的空间降到k个
(k个主题)中去,然后在新的特征空间进行相似度的计算。

'''
Created on Mar 8, 2011@author: Peter
'''
from numpy import *
from numpy import linalg as ladef loadExData():return [[0, 0, 0, 2, 2],[0, 0, 0, 3, 3],[0, 0, 0, 1, 1],[1, 1, 1, 0, 0],[2, 2, 2, 0, 0],[5, 5, 5, 0, 0],[1, 1, 1, 0, 0]]def loadExData2():return [[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]def ecludSim(inA, inB):return 1.0 / (1.0 + la.norm(inA - inB))def pearsSim(inA, inB):if len(inA) < 3: return 1.0return 0.5 + 0.5 * corrcoef(inA, inB, rowvar=0)[0][1]def cosSim(inA, inB):num = float(inA.T * inB)denom = la.norm(inA) * la.norm(inB)return 0.5 + 0.5 * (num / denom)def standEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0;ratSimTotal = 0.0for j in range(n):userRating = dataMat[user, j]if userRating == 0: continueoverLap = nonzero(logical_and(dataMat[:, item].A > 0, \dataMat[:, j].A > 0))[0]if len(overLap) == 0:similarity = 0else:similarity = simMeas(dataMat[overLap, item], \dataMat[overLap, j])print 'the %d and %d similarity is: %f' % (item, j, similarity)simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0:return 0else:return ratSimTotal / simTotaldef svdEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0;ratSimTotal = 0.0U, Sigma, VT = la.svd(dataMat)Sig4 = mat(eye(4) * Sigma[:4])  # arrange Sig4 into a diagonal matrixxformedItems = dataMat.T * U[:, :4] * Sig4.I  # create transformed itemsfor j in range(n):userRating = dataMat[user, j]if userRating == 0 or j == item: continuesimilarity = simMeas(xformedItems[item, :].T, \xformedItems[j, :].T)print 'the %d and %d similarity is: %f' % (item, j, similarity)simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0:return 0else:return ratSimTotal / simTotaldef recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):unratedItems = nonzero(dataMat[user, :].A == 0)[1]  # find unrated itemsif len(unratedItems) == 0: return 'you rated everything'itemScores = []for item in unratedItems:estimatedScore = estMethod(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]

因子分析

1)因子分析原理
2)因子分析和主成分分析的比较
3)因子分析的sklean实现
4)因子分析和主成分分析的实验对比
这里写图片描述

因子分析的基本思想
根据相关性的大小把原始变量分组,使得同组内的变量相关性高,不同组的变量相关性低。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKJ2q6t2-1635756880534)(https://img-blog.csdn.net/20161129162708684)]
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
因子分析的求解过程


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UfQZ1lk-1635756880540)(https://img-blog.csdn.net/20161129172140463)]

http://shenhaolaoshi.blog.sohu.com/144248157.html

关于因子分析的流程可以参考一下这个链接。
这里写图片描述

流形学习简介


http://chatgpt.dhexx.cn/article/5dlFXtwI.shtml

相关文章

常见的降维方法(PCA,SVD)

1、PCA降维&#xff08;主成分分析&#xff09; PCA降维就是去除线性相关&#xff0c;使得最后剩余的属性维度全都线性无关。 其实&#xff1a;PCA降维不仅是去除先线性无关&#xff0c;还可以过滤掉小特征值对应的特征向量。因为特征值变化小&#xff0c;对应的特征向量变化…

看!数据分析领域中最为人称道的七种降维方法

http://dataunion.org/20803.html 感谢王穆荣的投稿&#xff0c;转载请注明出处&#xff1a;数盟社区 近来由于数据记录和属性规模的急剧增长&#xff0c;大数据处理平台和并行数据分析算法也随之出现。于此同时&#xff0c;这也推动了数据降维处理的应用。实际上&#xff0…

数据降维的几种常见方法(PCA;FA;LDA;ICA等)

文章目录 数据降维方式简述PCA与ICA、FA、LDA的区别与联系1.PCA与ICA的联系与区别2.PCA与LDA的联系与区别3.PCA与FA的联系与区别 总结 数据降维方式简述 在学习ICA算法的过程中&#xff0c;了解到常常需要对数据进行降维&#xff0c;如PCA&#xff0c;FA等&#xff0c;以达到数…

大整数的乘法

大整数的乘法 &#xff08;这里主要讨论的是两个较大的数相乘的效率问题&#xff0c;实际上并不是真正意义上的大数相乘。在java中有个BigInteger类已经可以储存大数&#xff0c;并提供了大数相乘的方法了。&#xff09; 【分析】 首先&#xff0c;当两个整数X、Y&#xff0…

实验一:大整数乘法

1.实验目的 掌握分治算法的基本思想、技巧和效率分析方法。熟练掌握用递归设计分治算法的基本步骤。学会利用分治算法解决实际问题。 2.实验内容 大整数乘法 采用分治算法实现两个n位二进制&#xff08;或者十进制&#xff09;大整数的乘法。 3.实验要求 根据实验内容构思…

分治法的经典问题——大整数相乘

分治法的原理 讨论问题时&#xff0c;先来了解一下什么是分治法。 分治法的意思就是&#xff0c;分而治之&#xff0c;也就是把一个问题&#xff0c;拆分成几个小问题&#xff0c;最后再汇总解决的方法 通过大整数相乘问题来了解分治法 假如现在我们要求两个大整数相乘的乘积…

大整数乘法(分治法)

大整数乘法&#xff08;分治法&#xff09; 题目描述&#xff1a;设X和Y都是n位的十进制整数&#xff0c;计算它们的乘积X*Y。 如果按照我们日常的计算方法&#xff0c;应该就是将两个数逐位相乘&#xff0c;最后加起来得到最终的结果&#xff0c;时间复杂度为O&#xff08;n2&…

大整数相乘算法

一 转换为二进制求&#xff0c;推导出的公式适合十进制计算 设X和Y都是n位的二进制整数&#xff0c;现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法&#xff0c;但是这样做计算步骤太多&#xff0c;显得效率较低。如果将每2个1位数的乘法或加法看…

【大整数乘法】

问题 2.伪代码 理想情况下&#xff0c;XY位数相同 Mul(long long x,long long y,int num){Fh<--(x*y>0)?1:-1;x<--|x|; y<--|y|;if(num 0)then return 0;else if(num1) then return fh*x*y;else{x_high<--x/10^(num/2);x_low<--x mod 10^(num/2);y_high…

大整数乘法(大整数乘int型)

算法思想&#xff1a; 1.将大整数倒序储存到数组中&#xff08;方便进位&#xff09; 2.对同位相乘后的数取模10&#xff0c;推入结果数组中 3.对同位相乘后的数除以10&#xff0c;作为进位 5.去除可能出现的前导零 4.完成乘法后倒序输出 补充知识&#xff1a; 1、vector相关用…

C语言实现大整数乘法

转载自&#xff1a;点击打开链接 乘法规律&#xff0c;一个数的第i位和另一个数的第j位相乘&#xff0c;一定会累加到结果的第ij位&#xff0c;结果的数组一个数组元素存2位数&#xff0c;最后对结果处理进位&#xff0c;最后打印出来 方法一见上面链接https://www.cnblogs.c…

大整数乘法(简单模拟乘法过程)

一、分析 整数的数值超过计算机硬件所能表示的最大值时&#xff0c;那么我们只能借助软件的方法来实现大整数的乘法了。 我们可以使用字符串来模拟大整数的乘法&#xff0c;算法的思想就是使用我们在小学时学过的乘法&#xff0c;一位位相乘&#xff0c;最后计算出结果。如下&…

算法总结——大整数乘法

问题描述 求两个不超过200位的非负整数的积。 输入数据 有两行&#xff0c;每行是一个不超过200位的非负整数&#xff0c;没有多余的前导0。 输出要求 一行&#xff0c;即相乘后的结果。结果里不能有多余的前导0&#xff0c;即如果结果是342&#xff0c;那么就不能输出为0342。…

大整数的乘法(分治法)

通常执行一次加法或乘法运算所需的计算时间看作一个仅取决于计算机硬件处理速度的常数。这个仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。若要精确地表示大整数并在计算结果中要求精确得到所有位数上的数字&#xff0c;就必须用软件的方法来实现大…

分治法-大整数乘法

问题分析&#xff1a; 在计算机上处理一些大数据相乘时&#xff0c;由于计算机硬件的限制&#xff0c;不能直接进行相乘得到想要的结果。可以将一个大的整数乘法分而治之&#xff0c;将大问题变成小问题&#xff0c;变成简单的小数乘法再进行合并&#xff0c;从而解决上述问题…

大整数乘法

设计一个有效的算法&#xff0c;可以计算两个n位大整数的乘法运算。 如果按照我们日常的计算方法&#xff0c;应该就是将两个数逐位相乘&#xff0c;最后加起来得到最终的结果。由于是大整数乘法&#xff0c;那么我们用string来存储这两个数&#xff0c;因为是要做乘法&#x…

大整数乘法算法

一 转换为二进制求&#xff0c;推导出的公式适合十进制计算 设X和Y都是n位的二进制整数&#xff0c;现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法&#xff0c;但是这样做计算步骤太多&#xff0c;显得效率较低。如果将每2个1位数的乘法或加法看…

大整数乘法的详解

一.问题 由于编程语言提供的基本数值数据类型表示的数值范围有限&#xff0c;不能满足较大规模的高精度数值计算&#xff0c;因此需要利用其他方法实现高精度数值的计算&#xff0c;于是产生了大数运算。尤其是乘法运算&#xff0c;下面就是大整数的乘法的过程&#xff08;加 …

Ubuntu server树莓派版本默认用户名密码及密码修改

树莓派安装的Ubuntu server镜像&#xff0c; 默认的初始用户及密码&#xff1a; ubuntu # user ubuntu # passwd默认信息查看 在烧入镜像的内存卡中&#xff0c; 可以查看到默认的用户信息 默认密码修改 在登录界面 输入初始化的用户名和密码后&#xff0c; 会提示是第一…

2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码

树莓派最新的arm64位系统&#xff0c;更新时间是2022年4月4日&#xff0c;这个版本的树莓派取消了默认的账户密码&#xff0c;也就是原来一直使用的pi和对应的默认密码raspberry被取消了&#xff0c;现在如果想要使用的话必须自己设置&#xff0c;下面有两种方法可以设置自己的…