k-means聚类并用t-sne方法降维可视化,记录其中一些要点,主要是代码方面
将数据用pandas的dataframe处理
data_norm = (wine_data - wine_data.min()) / (wine_data.max() - wine_data.min())
也可以调用sklearn的封装的方法如
scaler = MinMaxScaler(feature_range=(0, 1))
dataset= scaler.fit_transform(voltage)
#相关矩阵热力图显示
cm = np.corrcoef(wine_data.values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10})
plt.show()
plt.figure()
#计算数据集中两向量间的马氏距离
v=np.cov(normMat,rowvar=False) #求协方差矩阵
vi=np.linalg.inv(v) #求协方差矩阵的逆
def madistance(vi,vec1,vec2):
x=vec1-vec2
d=np.dot(np.dot(x,vi),x.T)
return d
#计算两个向量之间的欧式距离
def distance(vec1,vec2) :
return np.sqrt(sum(np.power(vec1-vec2,2)))
#按照标签和索引提取出某一类的数据
cluster=data[np.nonzero(labelsArr==k)[0]]
Numpy.nonzero()返回的是数组中非零元素的位置。如果是二维数组就是描述非零元素在几行几列,三维数组则是描述非零元素在第几组中的第几行第几列。
centerMat[k,:]=np.mean(cluster,axis=0)#按列求取均值
numpy.mean(a, axis, dtype, out,keepdims )
mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
axis 不设置参数,对 m * n 个数求均值,返回一个实数
axis = 0:压缩行,对各列求均值,返回 1 * n 矩阵
axis =1 :压缩列,对各行求均值,返回 m * 1 矩阵
#将原始数据中的索引设置成聚类得到的数据类别
data = pd.DataFrame(data,index=labels)
注意这里index为一个列表,如index=[1,2,3,4,5]
tsne = TSNE()
data=tsne.fit_transform(wine_data1) #进行数据降维,并返回结果
data=pd.DataFrame(data)
#将原始数据中的索引设置成聚类得到的数据类别
data = pd.DataFrame(data,index=labels)
data_tsne = pd.DataFrame(tsne.embedding_, index =data.index)
t-SNE( TSNE )将数据点的相似性转换为概率。原始空间中的相似性表示为高斯联合概率,嵌入空间中的相似性表示为 “学生” 的 t 分布。这允许 t-SNE 对局部结构特别敏感,并倾向于提取聚类的局部样本组,就像S曲线示例中突出显示的那样。这种基于局部结构对样本进行分组的能力可能有助于在视觉上同时解开包含多个流形的数据集
再来一栗子
>>> import numpy as np
>>> from sklearn.manifold import TSNE
>>> X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
>>> X_embedded = TSNE(n_components=2).fit_transform(X)
>>> X_embedded.shape
(4, 2)
#根据类别分割数据后,画图
d = data_tsne[data_tsne.index == 0] #找出聚类类别为0的数据对应的降维结果
plt.scatter(d[0], d[1],c='lightgreen',marker='o')
d = data_tsne[data_tsne.index == 1]
plt.scatter(d[0], d[1], c='orange', marker='o')
d = data_tsne[data_tsne.index == 2]
plt.scatter(d[0], d[1], c='lightblue',marker='o')