Python scikit-learn_01 K-Means聚类及PCA/t-SNE降维

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris


iris_dataset = load_iris() #内置函数载入iris数据集
print("Keys of iris_dataset: \n{}".format(iris_dataset.keys()))#输出对象包含属性

iris_fs = iris_dataset['data']   #取出iris数据集的特征
iris_lb = iris_dataset['target'] #取出iris数据集的标签
print iris_fs.shape              #打印特征维度
print iris_lb.shape              #打印标签维度

x1 = iris_dataset.data[:, 0]  # X- Axis -sepal length
y1 = iris_dataset.data[:, 1]  # Y- Axis - sepal width
x2 = iris_dataset.data[:, 2]  # X- Axis - petal length
y2 = iris_dataset.data[:, 3]  # Y- Axis - patal width
species = iris_dataset.target  # Species 标签数据

# Scatterplot 对原始数据进行可视化,分别以花萼特征(长、宽)和花瓣特征(长、宽)进行二维绘图
plt.figure(figsize=(10,8))
plt.subplot(221)
plt.title("Iris Dataset - Classification By Sepal Sizes")
plt.scatter(x1, y1, c = species)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xticks(())
plt.yticks(()) # 根据Sepal(花萼)绘制散点图,观察原始信息
plt.subplot(222)
plt.title("Iris Dataset - Classification By Petal Sizes")
plt.scatter(x2, y2, c = species)
plt.xlabel('Petal length')
plt.ylabel('Petal width')
plt.xticks(())
plt.yticks(()) # 根据Petal(花瓣)绘制散点图,观察原始信息


# 通过k-means进行数据的聚类
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0) #关键参数n_cluster,类别中心数
y_kmeans = kmeans.fit_predict(iris_fs)
# 聚类结果用第1,2列(花萼)的特征表示
plt.subplot(223)
plt.scatter(iris_fs[y_kmeans == 0, 0], iris_fs[y_kmeans == 0, 1],  label = 'Iris-setosa')
plt.scatter(iris_fs[y_kmeans == 1, 0], iris_fs[y_kmeans == 1, 1],  label = 'Iris-versicolour')
plt.scatter(iris_fs[y_kmeans == 2, 0], iris_fs[y_kmeans == 2, 1],  label = 'Iris-virginica') # 聚类结果可视化简化coding
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], c = 'yellow', label = 'Center') # 聚类中心
plt.title("K-means clustering plot by Sepal")
plt.legend()   


# 聚类结果用第3,4列(花瓣)的特征表示
plt.subplot(224)
fs0 = iris_fs[y_kmeans == 0]
fs1 = iris_fs[y_kmeans == 1]
fs2 = iris_fs[y_kmeans == 2]
plt.scatter(fs0[:, 2], fs0[:, 3], c="red", marker='o', label='Iris-setosa')  
plt.scatter(fs1[:, 2], fs1[:, 3], c="green", marker='*', label='Iris-versicolour')  
plt.scatter(fs2[:, 2], fs2[:, 3], c="blue", marker='+', label='Iris-virginica') # 聚类结果可视化细化coding
plt.scatter(kmeans.cluster_centers_[:, 2], kmeans.cluster_centers_[:,3], c = 'yellow', label = 'Center') # 聚类中心
plt.title("K-means clustering plot by Petal")
plt.legend()
plt.show() 

结果如下图所示

# 通过PCA和t-SNE进行降维,将4个特征压缩,并可视化;

from sklearn.decomposition import PCA
from sklearn.manifold import TSNE

from mpl_toolkits.mplot3d import Axes3D

# 首先将原始的4个特征通过PCA压缩为3个特征,在3D空间进行可视化(也可以用t-SNE);

fs_pca = PCA(n_components = 3).fit_transform(iris_fs) # 降到3维
fig = plt.figure()
ax = Axes3D(fig)
ax.set_title('Iris Dataset by PCA_3D', size = 14)
ax.scatter(fs_pca[:,0],fs_pca[:,1],fs_pca[:,2],c = species)
ax.set_xlabel('pca_com1')
ax.set_ylabel('pca_com2')
ax.set_zlabel('pca_com3')

# 通过 PCA/t-SNE将原始4维特征降到2维,并在平面上进行可视化;

from sklearn.preprocessing import scale

fs = scale(iris_fs) # 原始数据标准化/归一化

class chj_data(object): # 定义一个结构体,用于feed数据,也可以不用定义直接用;
    def __init__(self,data,target):
        self.data=data
        self.target=target
lb = species.reshape(-1,1)
obj = chj_data(fs,lb)

# fs_pca2 = PCA(n_components = 2).fit_transform(obj.data) # 降到2维
fs_tsne = TSNE(n_components=2,learning_rate=100).fit_transform(obj.data) # 用t-SNE降到两维
#pos = pd.DataFrame(fs_pca2, columns=['X','Y'])
pos = pd.DataFrame(fs_tsne, columns=['X','Y'])
pos['lb'] = lb # 规范化结果矢量
ax1 = pos[pos['lb']==0].plot(kind='scatter', x='X', y='Y', color='coral',
         marker='D',alpha=0.6,label='Iris-setosa')
pos[pos['lb']==1].plot(kind='scatter', x='X', y='Y', color='green',
      marker='D',alpha=0.6,label='Iris-versicolour', ax=ax1)
pos[pos['lb']==2].plot(kind='scatter', x='X', y='Y', color='purple',
      marker='D',alpha=0.6,label='Iris-virginica', ax=ax1)
plt.ylabel('t-SNE2')
plt.xlabel('t-SNE1')

# 结果如下:

# 可以看出,就2维压缩后的聚类结果而言,t-SNE相较于PCA有着更好的类内距离。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值