- 主成分分析
- PCA降维
Notes:
-
KNN(K-NearstNeighor)有监督算法(近邻个数);
-
KMeans无监督算法(最终聚类的个数/分成K类)
-
datasets:
- 数据集载入 :load_digits()
- .data / .target / .target_names
- .images:张数1792 X 每张尺寸(8X8)
- 数据集载入 :load_digits()
-
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.正交成分:算法结果总是正交主成分,成分之间存在正交关系?
总结:
- 主成分分析本质:一种降维方式(以少表多,少即主成分)
- 每个主成分:原始变量(某种)加权组合
转载:https://blog.csdn.net/Romaga/article/details/104718747
查看评论