mnist数据集 聚类
数据挖掘的课程作业,需要做一个聚类,狮虎说,做一个图片的聚类吧,就用mnist数据集。所以今天来试试。
看到了一篇帖子,写的挺好哒,那就把原文链接先放在这里:https://blog.csdn.net/u012162613/article/details/47811235
聚类是一种典型的无监督学习算法。
主要的聚类算法有以下几类:
本文主要用Kmeans,属于上述划分方法Kmeans算法的主要步骤如下:
若n是样本数,m是特征维数,k是簇数,t是迭代次数,则Kmeans算法的时间复杂度为O(tknm),与样本数量线性相关,所以在处理大数据集合时比较高效,伸缩性好。空间复杂度为O((n+k)*m)。❤一般而言,k值的选取不会太大。(但是对于mnist特殊的数据集,我们已知分类数,那么直接选择k值等于10就好了吧。)
❤初始质心的选取
Kmeans算法对初始质心的选取比较敏感,选取不同的质心,往往会得到不同的结果。初始质心的选取方法,常用以下两种的简单方法:一种是随机选取,一种是用户指定。
需要注意的是,无论是随机选取还是用户指定,质心都尽量不要超过原始数据的边界,即质心每一维度上的值要落在原始数据集每一维度的最小与最大值之间。
❤Kmeans使用欧式距离来计算两个点的距离(或者相似度)
❤质心的计算
在Kmeans算法中,将簇中所有样本的均值作为该簇的质心。
❤算法停止条件
在两种情况下算法应该停止:一种是达到了指定的最大迭代次数,一种是算法已经收敛,即各个簇的质心不再发生变化。
❤代价函数与算法收敛
Kmeans算法的代价函数比较简单,就是每个样本点与其所属质心的距离的平方和(误差平方和,Sum of Squared Error,简称SSE):
与其他机器学习算法一样,我们要最小化这个代价函数,但这个函数没有解析解,所以只能通过迭代求解的方法来逼近最优解(这一点也和众多机器学习算法一样吧)。所以你再看看算法步骤,其实就是一个迭代过程。
这就是解析解由于代价函数(SSE)是非凸函数,所以在运用Kmeans算法时,不能保证收敛到一个全局的最优解,我们得到的一般是一个局部的最优解。
因此,为了取得比较好的效果,我们一般会多跑几次算法(用不同的初始质心),得到多个局部最优解,比较它们的SSE,选取SSE最小的那个。
不过看起来,kmeans的在mnist上使用,效果并不好啊,但是我还是决定试试。稍后再贴上代码和运行结果吧。
实际运行过程中,出现了一些问题(1)找不到kmeans:原因:在jupyter上面创建的是.ipynb文件,但是需要创建kmeans为.py文件。只需要,New->text(再将text的后缀改为.py就行了)
(2)TypeError: write() argument must be str, not bytes报错原因及Python3写入二进制文件方法:报错的语句是:
X,y=pickle.load(open('data.pkl','r'))
❤解决方法:
使用二进制写入模式(‘wb’)来开启待操作文件,而不能像原来那样,采用字符写入模式(‘w’)。
同时适配Python3和Python2的方法:
with open('python3/rndom.bin','wb') as f:
f.write(os.urandom(10))
文件读取数据的时候也有类似的问题。解决这种问题的办法也相似:用'rb'模式(二进制模式)打开文件,而不要使用'r'模式。
问题就解决了。
开始学习了