我们知道,kmeans是无监督,没有标签。所以,我们的数据如下:
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
6个数据点,每一个点是二维的。我们使用kmeas进行聚类。
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.datasets import load_breast_cancer
# 加载数据集
cancer = load_breast_cancer()
# 获取特征矩阵
X = cancer.data
# 获取标签数组
y = cancer.target
由于KMeans算法是基于距离计算的聚类算法,因此需要将特征进行归一化处理,以避免某些特征的值对聚类结果有过大的影响。
# 导包
from sklearn.preprocessing import StandardScaler
# 创建Scaler对象
scaler = StandardScaler()
# 对数据进行归一化处理
X_normalized = scaler.fit_transform(X)
# 创建KMeans对象
kmeans = KMeans(n_clusters=2, random_state=0)
# 对数据进行聚类
kmeans.fit(X_normalized)
# 获取聚类结果标签
labels = kmeans.labels_
# 导包
from sklearn.metrics import silhouette_score
# 计算轮廓系数
score = silhouette_score(X_normalized, labels)
# 打印轮廓系数
print("轮廓系数: ", score)
ARI(Adjusted Rand Index)是一种用于度量两个聚类结果之间相似度的指标,其取值范围为[-1, 1],越接近1则说明两个聚类结果越相似,越接近-1则说明两个聚类结果越不相似。
# 导包
from sklearn.metrics import adjusted_rand_score
# 计算ARI值
ari = adjusted_rand_score(y, labels)
# 打印ARI值
print("ARI值: ", ari)
由于乳腺癌数据集是一个30维的数据集,不方便直接进行可视化。因此,可以考虑使用PCA进行降维,将数据集转化为二维数据,方便进行可视化。
# 导包
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 创建PCA对象
pca = PCA(n_components=2)
# 对数据进行降维
X_pca = pca.fit_transform(X_normalized)
# 可视化聚类结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels)
plt.show()
其中,颜色不同的点表示聚类结果不同。可以看出,KMeans算法能够对乳腺癌数据集进行很好的聚类。
from sklearn.datasets import load_breast_cancer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
#对数据进行处理
data_breast=load_breast_cancer()
#提取数据的特征
X=data_breast['data']
#提取数据的标签
y=data_breast['target']
#划分数据集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#数据归一化
from sklearn.preprocessing import MinMaxScaler
mms=MinMaxScaler()
mms.fit(X_train)
X_train=mms.transform(X_train)
X_test=mms.transform(X_test)
#数据交叉验证
from sklearn.model_selection import cross_val_score as csv
from sklearn.neighbors import KNeighborsClassifier
L=[]
for i in range (1,21):
k=i
knn=KNeighborsClassifier(n_neighbors=k,weights='distance')
result=csv(knn,X_train,y_train,cv=5)
L.append((k,result.mean(),result.var()))
L
# 画图观察交叉验证得到的k
a=pd.DataFrame(L)
a.columns=['k','平均准确率','方差']
plt.figure(figsize=(8,6),dpi=100)
plt.plot(a.k,a.平均准确率)
plt.plot(a.k,a.平均准确率+2*a.方差,linestyle='--',color='r')
plt.plot(a.k,a.平均准确率-2*a.方差,linestyle='--',color='r')
plt.xticks(a.k)
plt.xlabel('k')
plt.ylabel('平均准确率')
plt.title('带距离惩罚的5折交叉验证学习曲线')