Kmeans聚类与主成分分析

  • 主成分分析
  • PCA降维

Notes:

  • KNN(K-NearstNeighor)有监督算法(近邻个数);

  • KMeans无监督算法(最终聚类的个数/分成K类)

  • datasets:

    • 数据集载入 :load_digits()
      • .data / .target / .target_names
      • .images:张数1792 X 每张尺寸(8X8)
  • PCA降维:

    • fit_transform()返回降维后的数据
    • fit()仅 返回模型参数
  • 可视化:

    • 灰度图:plt.imshow(image,cmap=plt.cm.gray_r)

    手写数字识别聚类:

     #手写数字数据集 1797张 8X8
     from sklearn import decomposition
     from sklearn.cluster import KMeans
     digits_data = datasets.load_digits()		#载入数据集
     X = digits_data.data 		#X.shape=>(1797,64)
     y = digits_data.target
     #降维
     estimator = decomposition.PCA(n_components=2)
     reduce_data = estimator.fit_transform(X)
     #训练
     model = KMeans(n_clusters=10).fit(reduce_data)
     #坐标网格矩阵
     x_min,x_max  = reduce_data[:,0].min() -1,reduce_data[:,0].max() +1
     y_min,y_max = reduce_data[:,1].min() -1,reduce_data[:,1].max() +1 
     xx,yy = np.meshgrid(np.arange(x_min,x_max,.05),np.arange(y_min,y_max,.05))
     #预测,结果可视
     result = model.predict(np.c_[xx.ravel(),yy.ravel()])
     result = result.reshape(xx.shape)
     plt.figure(figsize=(10,5))
     plt.contourf(xx,yy,result,cmap=plt.cm.Greys)
     plt.scatter(reduce_data[:,0],reduce_data[:,1],c=y,s=15)
     center = model.cluster_centers_
     plt.scatter(center[:,0],center[:,1],marker='p',lw=2,color='b',edgecolors='w',zorder=20)
     plt.xlim(x_min,x_max),plt.ylim(y_min,y_max)
    

在这里插入图片描述
评估:

  • 随机森林分类
  • 交叉验证(cv = 5)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
estimator = decomposition.PCA(n_components=5) # 从 10 个特征缩减为 5 个特征
X_pca = estimator.fit_transform(X)
model = RandomForestClassifier()
cross_val_score(model,X,y,cv=5).mean()

主成分分析Principal Components Analysis
在这里插入图片描述

  • 主成分:数据集中区分个数据点的特性 or 特征
  • 与数据点什么关系? 数据点会沿着主成分的维度最大限度分散开
  • 如何表示?一个/多个变量(需要考虑不同特征统计时的标准化问题)
  • 怎么分析? /怎么区分?/怎么做?||分多少?
    • 找(最能区分数据点的)变量
    • 数据散度百分比/轮廓系数的折线图的拐点处
index = []  # 横坐标数组				曲线在主成分3处拐弯,表示最佳主成分数量:3
inertia = []  # 纵坐标数组

# K 从 1~ 10 聚类
for i in range(9):
    model = k_means(df, n_clusters=i + 1)
    index.append(i + 1)
    inertia.append(model[2])

# 绘制折线图
plt.plot(index, inertia, "-o")

在这里插入图片描述

from sklearn.metrics import silhouette_score  # 导入轮廓系数计算模块

index2 = []  # 横坐标
silhouette = []  # 轮廓系数列表

# K 从 2 ~ 10 聚类
for i in range(8):
    model = k_means(df, n_clusters=i + 2)
    index2.append(i + 2)
    silhouette.append(silhouette_score(df, model[1]))

print(silhouette)  # 输出不同聚类下的轮廓系数

# 绘制折线图
plt.plot(index2, silhouette, "-o")

轮廓系数

  • 轮廓系数越接近于 1,代表聚类的效果越好。我们可以很清楚的看出,K=3 对应的轮廓系数数组最大,也更接近于 1

  • 主成分分析局限性:

    • 1.散度最大化:因为我们在主成分分析时有个默认的假设:数据点最分散的维度是最有用的。
    • 2.解释成份:主成分分析对象,需要相关领域知识
    • 3.正交成分:算法结果总是正交主成分,成分之间存在正交关系?

总结:

  • 主成分分析本质:一种降维方式(以少表多,少即主成分)
  • 每个主成分:原始变量(某种)加权组合
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值