k-means聚类并用t-sne方法降维可视化

k-means聚类并用t-sne方法降维可视化,记录其中一些要点,主要是代码方面
将数据用pandas的dataframe处理

  1. 数据归一化处理``
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)
  1. 计算样本属性的相关矩阵并用热力图显示
#相关矩阵热力图显示
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()

  1. 马氏距离量度的计算
    马氏距离不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰
#计算数据集中两向量间的马氏距离
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
  1. 欧式距离计算
#计算两个向量之间的欧式距离
def distance(vec1,vec2) :
    return np.sqrt(sum(np.power(vec1-vec2,2)))
  1. numpy中nonzero函数的妙用
#按照标签和索引提取出某一类的数据
            cluster=data[np.nonzero(labelsArr==k)[0]]

Numpy.nonzero()返回的是数组中非零元素的位置。如果是二维数组就是描述非零元素在几行几列,三维数组则是描述非零元素在第几组中的第几行第几列。

  1. numpy中mean函数的用法
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 矩阵

  1. 对dataframe数据重设索引
#将原始数据中的索引设置成聚类得到的数据类别
data = pd.DataFrame(data,index=labels)

注意这里index为一个列表,如index=[1,2,3,4,5]

  1. 调用sklearn中的tsne流形学习方法进行降维
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)
  1. 最后画散点图
#根据类别分割数据后,画图
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')

最终效果如图
在这里插入图片描述

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值