降维和聚类——PCA & K-means

降维:PCA算法

PCA 算法也叫主成分分析(principal components analysis),主要是用于数据降维的。关于降维,可以这样理解,一组数据有n个feature(客户年龄,收入,每个月消费额度等等),每一个feature有一系列的观测点。而这n个feature中有一些存在线性相关,比如对于某些群体而言,收入和消费是线性相关的。此时我们进行多维度数据分析时只需要考虑其中一个参数就可以足够了,这样就能减少一个feature(维度),PCA方法就是用严谨的数据方法实现了这一过程。具体原理见下文,写十分清楚:
http://blog.codinglabs.org/articles/pca-tutorial.html

总结一下PCA的算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵 C = 1 / m ∗ X ∗ X T C=1/m*X*X^T C=1/mXXT
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6) Y = P X Y=PX Y=PX即为降维到k维后的数据

聚类:K-means

一种属于无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中的算法。
K-Means算法步骤
1)从数据中选择k个对象作为初始聚类中心;
2)计算每个聚类对象到聚类中心的距离来划分;
3)再次计算每个聚类中心
4)计算标准测度函数,直到达到最大迭代次数,则停止,否则,继续操作。
5)确定最优的聚类中心

使用注意:
K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)

调用

sklearn.cluster.KMeans这个类对于初始聚类中心的选择刚好默认选择的就是k-means ++。
参数:
**n_clusters:**整形,缺省值=8 【生成的聚类数,即产生的质心(centroids)数。】
**max_iter:**整形,缺省值=300
执行一次k-means算法所进行的最大迭代数。
**n_init:**整形,缺省值=10
用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
**init:**有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量。
此参数指定初始化方法,默认值为 ‘k-means++’。
(1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
(2)‘random’ 随机从训练数据中选取初始质心。
(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
**precompute_distances:**三个可选值,‘auto’,True 或者 False。
预计算距离,计算速度更快但占用更多内存。
(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
(2)True:总是预先计算距离。
(3)False:永远不预先计算距离。
**tol:**float形,默认值= 1e-4 与inertia结合来确定收敛条件。
**n_jobs:**整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
**random_state:**整形或 numpy.RandomState 类型,可选
用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
**copy_x:**布尔型,默认值=True
当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据
上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

属性:
**cluster_centers_:**向量,[n_clusters, n_features] (聚类中心的坐标)

Labels_: 每个点的分类
**inertia_:**float形 每个点到其簇的质心的距离之和。

方法:
fit(X[,y]):
 计算k-means聚类。
fit_predictt(X[,y]):
 计算簇质心并给每个样本预测类别。
fit_transform(X[,y]):
计算簇并 transform X to cluster-distance space。
get_params([deep]):
 取得估计器的参数。
predict(X):predict(X)
 给每个样本估计最接近的簇。
score(X[,y]):
 计算聚类误差
set_params(**params):
 为这个估计器手动设定参数。
transform(X[,y]): 将X转换为群集距离空间。
 在新空间中,每个维度都是到集群中心的距离。 请注意,即使X是稀疏的,转换返回的数组通常也是密集的。

代码

from load_and_split import Load_Dataset
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
#读取数据

X,y = Load_Dataset("./mldata/mnist-original.mat")
X, y =shuffle(X, y)
X, y = X[0:1000], y[0:1000]
#降维是针对数据集里的所有features的————也就是X,所以y到这里就没啥用了
#把28*28的特征数量降到3
pca = PCA(n_components=3)
new_data = pca.fit_transform(X)
#new_data 就是降维后的结果,到这里降维部分就结束了

# 聚类 n_clusters聚类的类个数
kmeans = KMeans(n_clusters=3,random_state=0).fit(new_data)
#查看聚类好的标签
labels = kmeans.labels_
#也可以这样
labels2 = kmeans.predict(new_data)

#可视化 降维+聚类 的效果
ax = plt.subplot(projection='3d')
ax.scatter3D(new_data[:,0], new_data[:,1], new_data[:,2], c=labels, alpha=1)

结果:
降维和聚类——PCA & K-means_第1张图片
参考:
https://blog.csdn.net/PyRookie/article/details/81915078
https://blog.csdn.net/playgoon2/article/details/77326045

https://blog.csdn.net/github_39261590/article/details/76910689

你可能感兴趣的:(python,算法,聚类,机器学习)