白马金羁侠少年骏是什么动物

【白马金羁侠少年】 - 吴江诗词网
——白马金羁侠少年
白马金羁侠少年平仄:
平 仄 平 平 平 仄 平
白马金羁侠少年拼音
bái mǎ&nbspjīn jī&nbspxiá&nbspshào nián&nbsp
白马金羁侠少年释义
【白马】白色的马。《左传·定公十年》:“公子地有白马四。公嬖向魋。魋欲之。”三国魏曹植《白马篇》:“白马饰金羈,连翩西北驰。”明高濂《玉簪记·闹会》:“分经来白马,洗鉢起黄龙。”方然《白色花·报信者》:“我底白马哟!大风来了,别让细砂与你长长的鬃毛蒙住你底眼睛。”2.古代用白马为盟誓或祭祀的牺牲。《史记·吕太后本纪》:“高帝刑白马盟曰:‘非刘氏而王,天下共击之!’”汉赵晔《吴越春秋·越王无余外传》:“禹乃东巡,登衡岳,血白马以祭。”南朝梁刘勰《文心雕龙·祝盟》:“騂毛白马,珠盘玉敦,陈辞乎方明之下,祝告於神明者也【金羁】亦作“金覊”。1.金饰的马络头。三国魏曹植《白马篇》:“白马饰金羈,连翩西北驰。”五代牛峤《柳枝》词:“金羈白马临风望,认得羊家静婉腰。”明何景明《七述》:“控以宝铰,缠以金覊。”2.借指马。唐李白《秋日鲁郡尧祠宴别》诗:“鲁酒白玉壶,送行驻金羈。”宋梅尧臣《次韵王景彝正月十六夜省宿过景灵街》:“自跃金覊来宿省,从他锦帐欲夸人。”清魏允枚《苏幙遮·同香岩晓发平原》词:“缓控金羈,满路霜华滑。”【侠】《唐韻》《正韻》胡頰切,音協。任俠。相與信爲任,同是非曰俠。《前漢·季布傳》任俠有名。《師古曰》俠之言挾,以權力俠輔人也。又姓。韓相俠累。又與挾通。《前漢·叔孫通傳》殿下郞中俠陛。《揚子·法言》滕懽樊酈曰俠介。與挾同。又《集韻》古洽切。與夾通。傍也,也。《公羊傳·哀四年註》滕薛俠轂。又《儀禮·士喪禮》婦人俠牀東西。《周禮·冬官考工記註》今時鐘乳俠鼓與舞。與夾同。 俗作俠,非。zdic.net漢典【少年】不几年。《后汉书·西南夷传·滇》:“初到郡,米斛万钱,渐以仁恩,少年间,米至数十云。”李贤注:“少年,未多年也。”1.古称青年男子。与老年相对。《韩非子·内储说上》:“郑少年相率为盗,处於雚泽。”三国魏曹植《送应氏》诗之一:“不见旧耆老,但覩新少年。”唐高适《邯郸少年行》:“且与少年饮美酒,往来射猎西山头。”《二刻拍案惊奇》卷十七:“两人都是出羣才学,英鋭少年。”2.今称介于童年与青年之间的年纪以及这样年纪的人。谢觉哉《观花小记》:“重庆市团委……赠送我们以少年工厂制的模型和青年作家的木刻等。”《<艾青诗
从军行其他诗句:
白马金羁侠少年相关问答:
有关白马的诗句,有出处
从军行 朝代:隋代 作者:卢思道 原文: 朔方烽火照甘泉,长安飞将出祁连。 犀渠玉剑良家子,白马金羁侠少年。 平明偃月屯右地,薄暮鱼丽逐左贤。 谷中石虎经衔箭,山上金人曾祭天。 天涯一去无穷已,蓟门迢递三千里。 朝见马岭黄沙合,夕望龙城...
溪流 森林 白马的诗词
从军行 朝代:隋代 作者:卢思道 原文: 朔方烽火照甘泉,长安飞将出祁连。 犀渠玉剑良家子,白马金羁侠少年。 平明偃月屯右地,薄暮鱼丽逐左贤。 谷中石虎经衔箭,山上金人曾祭天。 天涯一去无穷已,蓟门迢递三千里。 朝见马岭黄沙合,夕望龙城...
从军行的作者是谁?
犀渠玉剑艮家子,白马金羁侠少年。平明偃月屯右地,薄暮鱼丽逐左贤。谷中石虎经衔箭,山上金人曾祭天。天涯一去无穷已,蓟门迢递三千里。朝见马岭黄沙合,夕望...
可能你会感兴趣:
苏ICP备号-1 校址:吴江区松陵镇垂虹路172号 邮编:215200 学校联系电话:1
Copyright ©
All Rights Reserved.
友情链接:&&多核编程与并行计算(14)
OpenMP是目前被广泛接受的,用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案。它提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。本文是OpenMP使用的一个初步介绍,期望能引领读者进入并发编程的世界。
下面这个两篇文章介绍了OpenMP环境配置方法的详细步骤,对此不甚了解的朋友可以先参阅它们以做为必要之准备:
欢迎关注白马负金羁的博客 ,为保证公式、图表得以正确显示,强烈建议你从该地址上查看原版博文。本博客主要关注方向包括:数字图像处理、算法设计与分析、数据结构、机器学习、数据挖掘、统计分析方法、自然语言处理。
本文中的示例程序主要围绕一个简单的“利用积分法求π”的问题展开。首先,我们给出一个串行执行的版本,通过下面这个示例代码,读者可以大致了解我们这个求圆周率程序的执行过程。因为是串行程序所以我们并不需要用到OpenMP中的任何函数,但是为了和后面的代码相统一,我们这里还是使用了OpenMP中的一个计时函数omp_get_wtime(),该函数返回一个double型的值,计时单位是秒。
#include "stdio.h"
#include "omp.h"
static long num_steps = ;
int main()
double x, pi, sum = 0.0;
step = 1.0/(double)num_
double start = omp_get_wtime();
for(i=0; i&num_ i++){
x = (i+0.5)*
sum = sum + 4.0/(1.0+x*x);
pi = step *
double end = omp_get_wtime();
printf("pi = %f, time = %f s\n", pi, end-start);
执行上述代码所得之结果如下:
pi = 3.141593, time = 0.307644 s
下面我们来写第一个基于OpenMP的并行程序。其实OpenMP并发编程的本质就是自动生成若干个线程,以期充分利用现代多核处理器的并行计算能力。现在很多编程语言(例如Java)中也提供有多线程编程的接口或者函数,但是开发人员必须显式地控制这些并发的线程。而OpenMP则相当于提供了一套自动的管理方案,大大简化了开发的难度。
函数omp_set_num_threads()用来指定你准备创建的线程数;
函数omp_get_thread_num()用来获取已经创建的线程编号;
最后把你准备并发实现的部分放进#pragma omp parallel{}标记的大括号内即可。
下面给出示例代码:
#include "stdio.h"
#include "omp.h"
#define NUM_THREADS 4
static long num_steps = ;
int main()
double x, pi, sum[NUM_THREADS];
step = 1.0/(double)num_
omp_set_num_threads(NUM_THREADS);
double start = omp_get_wtime();
#pragma omp parallel
int i, id,
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if(id == 0) nthreads =
for(i=id, sum[id]=0.0; i&num_ i=i+nthrds){
x = (i+0.5)*
sum[id] += 4.0/(1.0+x*x);
for (i = 0, pi=0.0; i & i++)
pi += step * sum[i];
double end = omp_get_wtime();
printf("pi = %f, number of threads = %d, time = %f s\n", pi, NUM_THREADS, end-start);
然后我们使用不同的线程数1~4来观测程序的输出如下:
pi = 3.141593, number of threads = 1, time = 0.444881 s
pi = 3.141593, number of threads = 2, time = 0.551260 s
pi = 3.141593, number of threads = 3, time = 0.564319 s
pi = 3.141593, number of threads = 4, time = 0.477291 s
这个结果值得我们讨论的地方有:1)首先当线程数是1的时候,我们的并发程序就会退化成一个串行程序,但是由于我们增加了很多分发和收集的工作(有时我们说这是communication成本),所以它会比我们的串行程序其实更加耗时;2)提高线程的数量,似乎也没有提高程序执行的速度。这是由于出现了“false sharing”现象,即如果独立的数据元素碰巧位于相同的cache line上,那么每次update都会导致cache lines与线程之间“slosh back and forth”(来来回回)。也就是说在串行时的内存访问次数因为比并行时访问的次数少,所以反而串行的程序执行得更快。
为了解决上述这个问题,我们就指定一下cache line的大小,这样单独一个线程每次访问内存时,会一次性带走它所能带走的最大数据量,而且我们还会通过调整代码使得这些数据都会被访问它的线程所使用。从而减少因为“slosh back and forth”而浪费的时间。来看下面这段示例代码:
#include "stdio.h"
#include "omp.h"
#define NUM_THREADS 4
#define PAD 8
static long num_steps = ;
int main()
double x, pi, sum[NUM_THREADS][PAD];
step = 1.0/(double)num_
omp_set_num_threads(NUM_THREADS);
double start = omp_get_wtime();
#pragma omp parallel
int i, id,
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if(id == 0) nthreads =
for(i=id, sum[id][0]=0.0; i&num_ i=i+nthrds){
x = (i+0.5)*
sum[id][0] += 4.0/(1.0+x*x);
for (i = 0, pi=0.0; i & i++)
pi += step * sum[i][0];
double end = omp_get_wtime();
printf("pi = %f, number of threads = %d, time = %f s\n", pi, NUM_THREADS, end-start);
同样我们使用不同的线程数1~4来观测程序的输出如下:
pi = 3.141593, number of threads = 1, time = 0.446988 s
pi = 3.141593, number of threads = 2, time = 0.231959 s
pi = 3.141593, number of threads = 3, time = 0.224227 s
pi = 3.141593, number of threads = 4, time = 0.211466 s
显然这一次我们的程序就执行得快了很多!但是要知道我们所使用的机器的cache line的大小到底是多少,这显然有点为难开发人员了,我们能不能有一种更加优雅的方式来做上面那些事情呢?OpenMP确实也为我们提供了支持。
下面代码演示了OpenMP中提供的一种叫做 Mutual Exclusion的同步模式,在代码中由#pragma omp critical来指示:
#include "stdio.h"
#include "omp.h"
#define NUM_THREADS 2
static long num_steps = ;
int main()
double pi = 0.0;
step = 1.0/(double)num_
omp_set_num_threads(NUM_THREADS);
double start = omp_get_wtime();
#pragma omp parallel
int i, id,
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if(id == 0) nthreads =
for(i=id, sum=0.0; i&num_ i=i+nthreads){
x = (i+0.5)*
sum += 4.0/(1.0+x*x);
#pragma omp critical
pi += step *
double end = omp_get_wtime();
printf("pi = %f, number of threads = %d, time = %f s\n", pi, NUM_THREADS, end-start);
同样我们使用不同的线程数1~4来观测程序的输出如下:
pi = 3.141593, number of threads = 1, time = 0.367218 s
pi = 3.141593, number of threads = 2, time = 0.184200 s
pi = 3.141593, number of threads = 3, time = 0.183366 s
pi = 3.141593, number of threads = 4, time = 0.178658 s
恰当地运用OpenMP提供的各种同步模式(例如Atomic, Barrier, Critical等)能够对程序执行效率的提升起到相当大的帮助。OpenMP中还有很多话题值得探讨,有兴趣的读者可以参阅相关资料以了解更多。
等等,这样我就算OpenMP入门了吗?如果你翻看其他OpenMP的资料,下面我要介绍的这部分内容才往往是其他资料的开篇内容!这些方法和技巧会让你顿时感觉OpenMP真的很容易上手。那前面的内容到底算什么?按照Tim Mattson的话来说,前面这些其实是帮助你更好更深刻的理解OpenMP!
并行计算中最值得我们优化的地方就是循环。计算机最擅长做的事情就是重复大量地简单计算,而这个“重复”计算就是通过循环来实现的。如果循环里面的内容不存在相互依赖关系,也就是循环体中语句之间的顺序是可以任意调整的,那么你可以采用下面这种语法来让OpenMP协助进行循环的并行优化:
#pragma omp parallel
#pragma omp for
for(i = 0; i & N; i++){
特别地,如果#pragma omp parallel{}的大括号中唯一的内容就是一个for循环,那么上面的代码还可以采用下面这种简单的写法,它们的作用是完全等价的:
#pragma omp parallel for
for(i = 0; i & N; i++){
但是如果循环体中的内容之间有一定的依赖关系,我们该怎么做呢?举个例子:
int i, j, A[MAX];
for (i = 0; i & MAX; i++){
A[i]=big(j);
这个代码中,循环体里的两条语句之间就具有一定的依赖性,每次big(j)操作都依赖于本轮循环最新得到之j值,如果你贸然使用并行方法,那么整个循环中的顺序将被彻底打乱,那程序最终所得之结果就难以保证了!
一个解决方案就是改写代码消除依赖性,例如:
int i, A[MAX];
#pragma omp parallel for
for (i = 0; i & MAX; i++){
int j = 5 + 2*(i+1);
A[i]=big(j);
上述代码的思路就是每轮循环都重新创建一个变量j,这个j的值由当前的i直接算得,那么下面的big(j)就只能依赖于本轮的变量。因为没有全局变量,只有局部变量,如果j还没被创建,那么big(j)也不会执行,这就是与之前程序最大不同的地方。
另外一个比较特殊,但也更为常见的情况是类似下面这种的:
double ave = 0.0, A[MAX];
for(i=0;i&MAX;i++){
ave+=A[i];
ave = ave/MAX;
注意累加操作必须依赖于之前(也就是上一轮循环)所得之ave才能算得本轮之ave。这种“累加”操作非常常见,但由于存在依赖关系,我们之前的做法并不能奏效。类似的还有“累乘”等等。OpenMP把这类情况统称为Reduction,并提供了很好的支持。
reduction(op:list)
A local copy of each list variables is made and initialized depending on the “op”。例如如果是累加那么op就被初始为0,如果是累乘op就被初始为1。
Then updates occur on the local copy. Local copies are reduced into a single value and combined with the original global value.
下面这个例子演示了Reduction的使用
double ave = 0.0, A[MAX];
#pragma omp parallel for reduction (+:ave)
for(i = 0; i & MAX; i++){
ave += A[i];
ave = ave/MAX;
最后我们改写本文最初给出的那个串行程序,只作简单改动:
#include "stdio.h"
#include "omp.h"
static long num_steps = ;
int main()
double pi, sum = 0.0;
step = 1.0/(double)num_
double start = omp_get_wtime();
#pragma omp parallel
#pragma omp for reduction(+:sum)
for(i=0; i&num_ i++){
x = (i+0.5)*
sum = sum + 4.0/(1.0+x*x);
pi = step *
double end = omp_get_wtime();
printf("pi = %f, time = %f s\n", pi, end-start);
请读者自行编译并执行上述程序,正常情况下,这个程序应该会比使用critical的程序略慢一些,但速度提升仍然非常显效。到此为止,你已经算是基本掌握了OpenMP并行编程的一些方法和思路了,对于有深入学习需求的朋友,可以参阅一下文献【1】中后半程(14~27)视频课程的学习。本文中的程序主要来自(1~13)视频教学片中的示例。
[1] Tim Mattson,Introduction to OpenMP,Intel公司视频课程()
左飞,代码揭秘——从C/C++的角度探秘计算机系统,电子工业出版社
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1642813次
积分:21879
积分:21879
排名:第300名
原创:303篇
转载:10篇
评论:3785条
1. 在博客文章下留言,博客私信一律不回。
2. 发邮件至,将#换成@。
3. 算法与数据结构QQ群:,仅限算法之美读者交流之用。
文章:12篇
阅读:33304
文章:36篇
阅读:294390
:隐匿在数据结构背后的原理(C++版)
读者请加算法学习群()一一出自诗人的《》
白马金羁辽海东,罗帷绣被卧春风。 落月低轩窥烛尽,飞花入户笑床空。
All Rights Reserved4353人阅读
数据挖掘与机器学习(42)
大数据时代,数据犹如一座巨大的金矿,等待我们去发掘。而机器学习和数据挖掘的相关技术,无疑就是你挖矿探宝的必备利器!工欲善其事,必先利其器。很多初涉该领域的人,最先困惑的一个问题就是,我该选择哪种“工具”来进行数据挖掘和机器学习。我这里的工具主要指的是“语言、系统和平台”。尽管之于机器学习而言,语言和平台从来都不算是核心问题,但是选择一个你所熟悉的语言和环境确实可以令你事半功倍。现在你的选择可谓相当广泛,例如Matlab、R和Weka都可以用来进行数据挖掘和机器学习方面的实践。其中,Matlab是众所周知的商业软件,而R和Weka都是免费软件。R是应用于统计和数据分析的首屈一指的计算机语言和平台,如果你是拥有数学或统计学相关专业背景的人,那么使用R来进行数据挖掘就是一个相当不错的选择。我前面有很多介绍利用R语言进行数据挖掘的文章可供参考:Weka的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),是一款免费的,非商业化的,基于Java环境下开源的机器学习(machine learning)以及数据挖掘(data mining)软件。2005年8月,在第11届ACM SIGKDD国际会议上,怀卡托大学的Weka小组荣获了数据挖掘和知识探索领域的最高服务奖,Weka系统得到了广泛的认可,被誉为数据挖掘和机器学习 历史上的里程碑,是现今最完备的数据挖掘工具之一。如果你是一个忠实的Java拥护者,那么使用Weka来进行数据挖掘就非常明智。如果你对R和Weka(或Java)都不是很熟悉,那么我今天将向你推荐和介绍另外一个进行机器学习和数据挖掘的利器——Python。Python是当前非常流行的计算机编程语言,相对C、C++来说,Python的门槛极低,可以很轻松的上手和掌握。More importantly,Python用于为数众多,而且相当完善的软件包、工具箱来实现功能上的扩展。这一点与R语言来说非常相似(R的扩展包也可以多到超乎你的想象)。在Python中进行机器学习所需要的软件包主要是Scikit-Learn。Scikit-Learn的官方网站是,在上面可以找到相关的Scikit-Learn的资源,模块下载,文档,例程等等。Scikit-learn的基本功能主要被分为六个部分,分类,回归,聚类,数据降维,模型选择,数据预处理。作为一个范例,我们今天将演示在Python (版本是3.5.1)中基于Scikit-Learn所提供的函数来实现Logistic Regression。从名字来看,Logistic 回归 应该属于一种回归方法(事实上,它也确实可以被用来进行回归分析),但实际中,它更多的是被用来作为一种“分类器”(Classifier)。而且,机器学习中,分类技术相比于回归技术而言也确实是一个更大阵营。在Scikit-Learn的资源中,已经提供有一个利用Logistic Regression进行数据分类的示例,链接如下:http://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html但这个程序更多内容的是在演示利用matplotlib进行画图,这个可能并不是我今天想谈的内容。在下面这个示例中,我们会更多的使用仅属于Scikit-Learn中的函数来完成任务。下面这个例子中的数据源于1936年统计学领域的一代宗师费希尔发表的一篇重要论文。彼时他收集了三种鸢尾花(分别标记为setosa、versicolor和virginica)的花萼和花瓣数据。包括花萼的长度和宽度,以及花瓣的长度和宽度。我们将根据这四个特征(中的两个)来建立Logistic Regression模型从而实现对三种鸢尾花的分类判别任务。首先我们引入一些必要的头文件,然后读入数据(注意我们仅仅使用前两个特征)import numpy as npy
from sklearn import linear_model, datasets
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.metrics import accuracy_score, classification_report
iris = datasets.load_iris()
X = iris.data[:, :2]
# we only take the first two features.
Y = iris.target作为演示,我们来提取其中的前5行数据(包括特征和标签),输出如下。前面我们提到数据中共包含三种鸢尾花(分别标记为setosa、versicolor和virginica),所以这里的标签 使用的是0,1和2三个数字来分别表示对应的鸢尾花品种,显然前面5行都属于标签为0的鸢尾花。而且一共有150个样本数据。&&& for n in range(5):
print(X[n], Y[5])
&&& len(X)
现在我们利用train_test_split函数来对原始数据集进行分类采样,取其中20%作为测试数据集,取其中80%作为训练数据集。X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)然后,我们便可以利用LogisticRegression函数来训练一个分类器logreg = linear_model.LogisticRegression(C=1e5, , solver='lbfgs', multi_class='multinomial')
logreg.fit(X_train, y_train)
请留意Scikit-Learn文档中,对于参数solver和multi_class的说明。其中solver的可选值有4个:‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’。For small datasets, ‘liblinear’ is a good choice, whereas ‘sag’ isfaster for large ones.For multiclass problems, only ‘newton-cg’ and ‘lbfgs’ handle ‘sag’ and ‘liblinear’ are limited toone-versus-rest schemes.参数multi_class的可选值有2个:‘ovr’, ‘multinomial’。多分类问题既可以使用‘ovr’,也可以使用 ‘multinomial’。但是如果你的选项是 ‘ovr’,那么相当于对每个标签都执行一个二分类处理。Else the loss minimised is the multinomial loss fit acrossthe entire probability distribution. 选项 ‘multinomial’ 则仅适用于将参数solver置为‘lbfgs’时的情况。然后再利用已经得到的分类器来对测试数据集进行预测prediction = logreg.predict(X_test)
print(&accuracy score: &)
print(accuracy_score(y_test, prediction))
print(classification_report(y_test, prediction))预测结果如下,可见总体准确率都在90%以上,分类器执行的还是相当不错的!accuracy score:
avg / total
30In detail, 我们还可以利用predict_proba()函数和predict()函数来逐条检视一下Logistic Regression的分类判别结果,请看下面的示例代码:logreg_proba = logreg.predict_proba(X_test)
logreg_pred = logreg.predict(X_test)
for index in range (5):
print(logreg_proba[index])
print(&Predict label:&, logreg_pred[index])
print(&Correct label:&, y_test[index])
我们仅仅输出了前五个测试用例的分类结果,可见这五个样本的预测结果中前四个都是正确的。[
Predict label: 1
Correct label: 1
Predict label: 0
Correct label: 0
Predict label: 2
Correct label: 2
Predict label: 1
Correct label: 1
Predict label: 2
Correct label: 1当然,Logistic Regression的原理网上已有太多资料进行解释,因此本文的重点显然并不在于此。但是如果你对该算法的原理比较熟悉,自己实现其中的某些函数也是完全可以的。下面的代码就演示了笔者自行实现的predict_proba()函数和predict()函数,如果你对此感兴趣也不妨试试看。class MyLogisticRegression:
def __init__(self, weights, constants, labels):
self.weights = weights
self.constants = constants
self.labels = labels
def predict_proba(self,X):
proba_list = []
len_label = len(self.labels)
for n in X: #.toarray():
for i in range(len_label):
value = npy.exp(npy.dot(n, self.weights[i]) + self.constants[i])
count = count + value
pb.append(value)
proba_list.append([x/count for x in pb])
return npy.asarray(proba_list)
def predict(self,X):
proba_list = self.predict_proba(X)
predicts = []
for n in proba_list.tolist():
i = n.index(max(n))
predicts.append(self.labels[i])
return npy.asarray(predicts)与之前的执行类似,但是这次换成我们自己编写的函数# Print the result based on my functions
print('\n')
my_logreg = MyLogisticRegression(logreg.coef_, logreg.intercept_, logreg.classes_)
my_logreg_proba = my_logreg.predict_proba(X_test)
my_logreg_pred = my_logreg.predict(X_test)
for index in range (5):
print(my_logreg_proba[index])
print(&Predict label:&,logreg_pred[index])
print(&Correct label:&, y_test[index])最后让我们来对比一下执行结果,可见我们自己实现的函数与直接调用Scikit-Learn中函数所得之结果是完全相同的。[
Predict label: 1
Correct label: 1
Predict label: 0
Correct label: 0
Predict label: 2
Correct label: 2
Predict label: 1
Correct label: 1
Predict label: 2
Correct label: 1最后需要补充说明的内容是,在我们自己编写的函数中存在这一句for n in X: #.toarray():请注意我们注释掉的内容,在本篇文章中,我们所使用的数据集属于是标准数据集,并不需要我们做Feature extraction。但是在另外一些时候,例如进行自然语言处理时,我们往往要将特征字典转换成一个大的稀疏矩阵,这时我们再编写上面的函数时就要使用下面这句来将稀疏矩阵逐行还原for n in X.toarray():我们将在后面的文章中讨论Feature extraction和稀疏矩阵在机器学习(特别是NLP)中的一些具体应用。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1642815次
积分:21879
积分:21879
排名:第300名
原创:303篇
转载:10篇
评论:3785条
1. 在博客文章下留言,博客私信一律不回。
2. 发邮件至,将#换成@。
3. 算法与数据结构QQ群:,仅限算法之美读者交流之用。
文章:12篇
阅读:33304
文章:36篇
阅读:294390
:隐匿在数据结构背后的原理(C++版)
读者请加算法学习群()}

我要回帖

更多关于 白马金羁侠少年 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信