前一章节中介绍的线性回归是一种监督学习算法,我们使用数据与输出值(标签)来建立模型拟合它们。但是我们并不总是有已经打标签的数据,却仍然想去分析它们。这种情况下,我们可以使用无监督的算法如聚类。因为聚类算法是一种很好的方法来对数据进行初步分析,所以它被广泛使用。
本章中,会讲解K-means聚类算法。该算法广泛用来自动将数据分类到相关子集合中,每个子集合中的元素都要比其它集合中的元素更相似。此算法中,我们没有任何目标或结果来预测评估。
本章中依然会介绍TensorFlow的使用,并介绍基础数据结构tensor的更多细节。本章开头介绍tensor的数据类型与分析可在该数据结构上执行的运算变换。接下来展示使用tensor来实现的K-means算法。
基础数据结构—tensor
TensorFlow使用基础数据结构---tensor来表示所有数据。一个tensor可以看成是一个拥用静态数据类型动态大小且多维的数组,它可以从布尔或string转换成数值类型。下表是一些主要类型及在Python中对对应的类型:
另外,每个tensor都有一个秩,也是tensor维度的数量。例如,下面的tensor的秩为2:
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
tensor可以拥有任意秩。秩为2的tensor经常被看作矩阵,秩为1的tensor会被看作vector,秩为0的被看作标量值。
TensorFlow文档中使用三种不同称谓来描述tensor的维度:Shape,Rank,Dimension。下面的表展示了它们三者之间的关系,
TensorFlow提供的一系列操作来计算这些tensor,接下来我们会讨论下表中的一些操作。
通过本章,我们会继续讨论更多的细节。在Tensorflow的官方网站上能找到更多的操作列表及每一个操作的细节。
举个例子,假如你想扩展一个2*2000(2D tensor)为立方体(3D tensor)。可以使用tf.expand_dims函数,它可以向tensor中插入一个维度。
tf.expand_dims会向tensor中插入一个维度,插入位置就是参数代表的位置(维度从0开始)。
以可视化来展示的话,上面的转换过程如下图所示:
正如你所看到的,我们得到一个3D tensor,但根据函数参数我们无法判断新维度D0的大小。
如果调用get_shape()来获得tensor的shape,可以看到D0没有大小:
print expanded_vectors.get_shape()
显示的结果如下:
TensorShape([Dimension(1),Dimension(2000), Dimension(2)])
本章的稍后,我们可以看到,由于TensorFlow的shape传递特性,很多tensor的数学运算函数(正如第一章中提到的)可以自已发现未确定大小维度的大小,并将该值赋给它。
TensorFlow中的数据存储
Tensorflow程序中主要有三种方式来获取数据:
1.从数据文件
2.以常数与变量预加载
3.Python代码提供的数据
下面简要描述这三种方式:
1.