windows anaconda 移动位置 (windows10 从C盘移动到D盘)

windows anaconda 移动位置 (windows10 从C盘移动到D盘),再具体一些笔者的情况是:anaconda在window10的环境下,从C盘迁移到D盘,基本的操作跟大家搜索其它教程都差不多,而且笔者也是参考了其它很多的教程。只是,笔者有一些地方与其它教程有出入。特此记录

Anaconda的环境安装虚拟环境的创建,在本站以前的文章中有具体的说明,此处不再复述。

迁移

直接在C盘找到anaconda的安装目录,将整个文件剪切到D盘。如笔者直接把 anaconda3这个文件夹放在了D盘的根路径下,这样的路径就是 D:\anaconda3,笔者的整个文件夹总的容量已经达到40多G了….

后续问题

不修改环境变量

有很多博文到了这一步是让读者去修改环境变量,但是笔者并没有修改环境变量,因为在环境变量里压根就没有anaconda的任何信息

修改environments.txt

environments.txt 一般是存放虚拟环境路径的文件,它一般在C:\Users\usrname\.conda的路径下,笔者把它们都修改成了anaconda3移动到D盘后的位置。修改后如下

D:\anaconda3
D:\anaconda3\envs\python3.6
D:\anaconda3\envs\python3.5
...
D:\anaconda3\envs\spider
D:\anaconda3\envs\gpt2

修改电脑开始菜单快捷方式

电脑开始菜单的快捷方式在我们移动完anaconda3文件夹之后就已经完全失效,不能再打开了,点击的时候可能会出现如下的一些错误

  • 快捷方式已经失效是否删除
  • This application failed to start because no Qt platform plugin: 这是运行Anaconda Navigator报错
  • conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 这是运行Anaconda PowerShell Prompt报错。

以上三个问题是迁移后的主要问题,其它很多的附带问题都可以通过解决这几个问题来得到附带处理掉。而快捷方式失效是首要需要解决的问题

让快捷方式可以生效的解决方案,笔者参考了《windows下将Anaconda从C盘迁移至D盘(其他盘)》博文的内容,主要借鉴的是就是在新的anaconda目录下执行以下命令,来使得快捷方式能找到新的目录位置,操作如下:

  1. 进入D:\ananconda3。在此路径下打开cmd dos命令窗口–如果渎职无法在cmd命令窗口进入到D盘可以参考《win10如何做到在指定目录下打开cmd命令窗口》对cmd窗口权限进行修改。
  2. cmd命令窗口确定进入到D:\anaconda3路径后,输入以下命令,因为此时我们的环境已经混乱了,所以直接就用anaconda路径里存的python可执行脚本来执行命令
    python.exe .\Lib\_nsis.py mkmenus
    命令执行之后,快捷方式就可以点击了,且不再提示快捷方式失效的。此时开始报错…..

Anaconda Navigator 运行报错的处理方案笔者主要是参考了《运行Anaconda Navigator报错:This application failed to start because no Qt platform plugin》,其主要的处理思路就是:

把Anaconda路径下的 platforms 拷贝出来
.\Anaconda3\pkgs\qt-**\Library\plugins目录下的platforms文件夹复制黏贴到Anaconda的根路径下,例如笔者并没有完全按照参考把qt-5,9,7**的platforms拷贝出来,而是拷贝了最新的qt-5.12.9**里的,如何判断最新可以从时间上看,但是时间如果有些迷惑你的话就直接把qt后边数字大的platforms拷贝到anaconda根路径下,如笔者的拷贝完就是 D:\anaconda3\platforms

Anaconda Navigator 运行报错处理方案

到了这一步,电脑开始菜单里的 Anaconda Navigator快捷键就应该可以用了。

接下来是 电脑开始菜单 Anaconda PowerShell Prompt 快捷方式的处理,现在点击它应该还在报错。但是我们不要去点击,直接在快捷图标上 右键 –>(更多) –> 打开文件夹位置,一般会在类似路径下C:\Users\username\…\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit),看到如下文件;直接在文件上 右键–> 属性

anaconda开始菜单快捷方式文件

直接在文件 Anaconda Powershell Prompt文件上 右键–> 属性,弹出如下图,我们直接将快捷方式 -目标 的值拷贝出来, 就会看到这个目标要执行的命令, 而命令中涉及到的路径还是anaconda在C盘时的路径 ,我们要把它们修改成现在的anaconda路径地址。

Anaconda Powershell Prompt 属性
# 属性目标值修改前
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\Users\...\AppData\Local\Continuum\anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\Users\...\AppData\Local\Continuum\anaconda3' "

# 属性目标值修改后
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'D:\anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'D:\anaconda3' "

我们从上边修改的命令中可以看到一个叫做conda-hook.ps1的文件,这个文件的内容也是需要改的,不然依旧会报错。修改的内容依旧是路径,读者去自己的anaconda文件夹对应的目录下,找到这个文件打开它编辑就可以看到了,所有的路径都改。

至此,整个anaconda迁移工作就算是完成了,当然如果读者在别的IDE中有引用anaconda环境的话需要去对应的IDE做调整即可。笔者建议读者修改完后,把Anaconda Navigator打开,每个虚拟环境都点一点,让它自己刷新更新一下。

Jaccard similarity coefficient 杰卡德相似系数 基础闲话

Jaccard similarity coefficient(杰卡德相似系数)是一种计算相似度的基础算法 。Jaccard距离常用来处理仅包含非对称的二元(0-1)属性的对象. 计算的数据是二进制集合,集合中的元素只有0和1两个值,1表示元素存在,0是不存在该元素。因此,该算法适合一些特征相对稀疏的情况来使用,有限个的特征二进制集合作为输入得到不同事物(如文本相似、数据聚类等)。

基础概念

集合

若存在集合A = {1,2,3} ;B = {2, 3, 4};

并集: AB = {1, 2, 3, 4}

交集:AB = {2, 3}

集合基数

  • 集合论中刻画任意集合大小的一个概念, 数学概念中一般用card表示
  • 表示集合的元素个数, 如a =[1,3,4], card(a) = 3,即基数是3

二进制集合

  • 元素只有0和1两种,分别表示此位置的元素存在与不存在
  • 如果元素是0,则基数计算是不做统计。如card([1,0,0,1]) = 2

杰卡德距离

向量A:(0,0,1,1,1,0,1)

向量B:(1,0,1,0,1,0,0)

A∩B = 2 -- 对应位置都为1
A∪B = 5 -- 1 至少出现一次的位置
Jaccard distance

python实现

a = list('0011101')
b = list('1010100')
c = [1 if (i1 == i2 and i1=='1') else 0 for (i1, i2) in zip(a, b,)]
d = [1 if (i1 == '1' or i2=='1') else 0 for (i1, i2) in zip(a, b,)]

print(c, d)
jc = len([i for i in c if i==1]) / len([i for i in d if i ==1])
js = 1 - jc
print(js)

输出结果为: (c, d) = [0, 0, 1, 0, 1, 0, 0] [1, 0, 1, 1, 1, 0, 1]
js = 0.6

spark dataframe select 源码 对源码的小小窥探

spark dataframe 和 dataset 都是spark的数据集合抽象,而dataframe和dataset的关系可以用一行代码来说明,dataframe就是dataset泛化成Row的一种特例。当然本篇的重点不是为了讨论这两个数据集,而是通过对dataframe的select方法源码阅读来给读者提供一个队源码轻读的思路。

DataFrame = Dataset[Row]

dataframe的 select是一个Transformation,这个也不是我们的讨论重点,加上这句话纯粹为本站内部引流

spark dataframe select is a transformation

源码的版本gradle dependencies

dependencies {
    compile 'org.scala-lang:scala-library:2.11.8'
    compileOnly 'org.apache.spark:spark-core_2.11:2.3.0'
    compileOnly 'org.apache.spark:spark-sql_2.11:2.3.0'
    compileOnly 'org.apache.spark:spark-mllib_2.11:2.3.0'
    compileOnly 'org.apache.spark:spark-streaming_2.11:2.3.0'
}

源码内容

  /**
   * Selects a set of column based expressions.
   * {{{
   *   ds.select($"colA", $"colB" + 1)
   * }}}
   *
   * @group untypedrel
   * @since 2.0.0
   */
  @scala.annotation.varargs
  def select(cols: Column*): DataFrame = withPlan {
    Project(cols.map(_.named), planWithBarrier)
  }

  /**
   * Selects a set of columns. This is a variant of `select` that can only select
   * existing columns using column names (i.e. cannot construct expressions).
   *
   * {{{
   *   // The following two are equivalent:
   *   ds.select("colA", "colB")
   *   ds.select($"colA", $"colB")
   * }}}
   *
   * @group untypedrel
   * @since 2.0.0
   */
  @scala.annotation.varargs
  def select(col: String, cols: String*): DataFrame = select((col +: cols).map(Column(_)) : _*)

  /**
   * :: Experimental ::
   * Returns a new Dataset by computing the given [[Column]] expression for each element.
   *
   * {{{
   *   val ds = Seq(1, 2, 3).toDS()
   *   val newDS = ds.select(expr("value + 1").as[Int])
   * }}}
   *
   * @group typedrel
   * @since 1.6.0
   */
  @Experimental
  @InterfaceStability.Evolving
  def select[U1](c1: TypedColumn[T, U1]): Dataset[U1] = {
    implicit val encoder = c1.encoder
    val project = Project(c1.withInputType(exprEnc, planWithBarrier.output).named :: Nil,
      planWithBarrier)

    if (encoder.flat) {
      new Dataset[U1](sparkSession, project, encoder)
    } else {
      // Flattens inner fields of U1
      new Dataset[Tuple1[U1]](sparkSession, project, ExpressionEncoder.tuple(encoder)).map(_._1)
    }
  }

scala.annotation.varargs

@scala.annotation.varargs — Var-Args函数(方法)意味着采用可变数量的参数。

Var-Args Functions(Methods) means taking Variable Number of Arguments. As a Java Developer, We have already tasted usage of Var-Args methods in Java-based Applications.

Scala also follows similar kind of syntax to define Var-Args parameter. But it uses * to define Var-Args parameter.–>Scala还遵循类似的语法来定义Var-Args参数。 但是它使用*定义Var-Args参数。

scala 可变参数

annotation 注解

advanced usages: 高级用法; experimental :实验性
  1. 这个包的作用在包的注释中已经做了最好的说明,标记一些api是实验性 或者 声明一些高级用法.
  2. 它主要利用java.lang.annotation来声明了一些自身的注解类或者接口
  3. public class InterfaceStability, 其中有三个接口分别是:
    (a). public @interface Stable {}; //Stable APIs
    (b). public @interface Evolving {}; //APIs that are meant to evolve towards becoming stable APIs, but are not stable APIs yet
    (c). public @interface Unstable {}; // Unstable APIs, with no guarantee on stability.

强弱类型

@group untypedrel 弱类型转换 | @group typedrel 强类型转换

在Saprk的结构化API中,可以分成两类,“无类型(untyped)”的DataFrame API和“类型化(typed)”的Dataset API.
确切的说Dataframe并不是”无类型”的, 它们有类型,只是类型检查没有那么严格,只检查这些类型是否在 运行时(run-time) 与schema中指定的类型对齐。
Dataset在 编译时(compile-time) 就会检查类型是否符合规范。
Dataset API仅适用于 基于JVM的语言(Scala和Java)。我们可以使用Scala 中的case class或Java bean来进行类型指定。

简单来说,如果转换是弱类型的,它将返回一个Dataframe(确切的说弱类型转换的返回类型还有 Column, RelationalGroupedDataset, DataFrameNaFunctions 和 DataFrameStatFunctions 等),而强类型转换返回的是一个Dataset。

星号的作用

select(cols: Column*) 参数带星号,在调用方式可以采用 冒号下划线星的方式把列表整个传入到方法中,如

select(cols_list.head, cols_list.tail:_*)

泛型类

[U1] : 泛型类, 是scala 语法的 泛化, 类似于java 的尖括号 <>;而UML建模语言中,是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

TypedColumn

TypedColumn  是spark.sql.Column 的 伴生类。TypedColumn is a Column for the types of the input and the output. 也就是我们需要去spark.sql.Column中去看 TypedColumn  的具体实现,而我们在这个方法中就可以看到withInputType是它的内部方法。而它具体做了什么?有什么功能不在此处详细细述。