kmeans算法实现手写体数据集
时间: 2023-11-04 20:03:05 浏览: 81
K-means算法是一种常用的聚类算法,可以用于实现手写体数据集的聚类。手写体数据集包含了许多手写数字的图像,我们的目标是将这些图像分成不同的数字类别。
首先,我们需要将每张手写数字图像转换为特征向量。常用的方法是将图像转换为灰度图,然后将每个像素点的灰度值作为特征值,这样每张图像就可以表示成一个特征向量。
接下来,我们需要初始化K个聚类中心。可以随机选择K个图像作为初始聚类中心,或者使用其他方法进行初始化。
然后,我们进入K-means的迭代过程。对于每个图像,我们计算其与每个聚类中心之间的距离,并将其分配到距离最近的聚类中心所在的簇中。然后,根据新的簇分配情况,重新计算每个簇的聚类中心。
重复以上步骤,直到簇分配不再改变或达到预定的迭代次数。
最后,我们可以将聚类结果可视化,将每个簇中的图像显示出来。
K-means算法实现手写体数据集可以帮助我们对手写数字进行分类,可以用于识别手写数字,或者帮助我们理解手写数字数据集的特征。当然,K-means算法也可以应用于其他类型的数据集的聚类分析。
相关问题
kmeans算法实现心脏病数据集python
首先需要导入必要的库,例如pandas、numpy、sklearn等。然后读取数据集,并进行相关的预处理,例如去除无用的列、处理缺失值、进行归一化等操作。接下来就可以使用sklearn库中的KMeans算法进行聚类分析了。
具体实现代码如下:
```python
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
# 读取数据集
data = pd.read_csv('heart.csv')
# 去除无用的列
data.drop(['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal'], axis=1, inplace=True)
# 处理缺失值
data.dropna(inplace=True)
# 归一化
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
# 聚类分析
kmeans = KMeans(n_clusters=2)
kmeans.fit(data_scaled)
# 输出聚类结果
print(kmeans.labels_)
```
其中,heart.csv是心脏病数据集,包含了多个特征,例如年龄、性别、胸痛类型等。在这里我们只选择了部分特征进行聚类分析。聚类结果会输出每个样本所属的类别标签,例如[0 0 1 0 1 ...]。其中,0和1分别表示两个聚类簇。
2.实现Kmeans算法实现手写字体识别,要求: a、根据算法流程,手动实现Kmeans算法; b、调用sklearn中聚类算法,对给定数据集进行聚类分析; c、对比上述2种Kmeans算法的聚类效果。
a、手动实现Kmeans算法
Kmeans算法的流程如下:
1. 初始化K个质心
2. 针对每个样本点,计算其与K个质心的距离,将其归为距离最近的质心所在的簇
3. 重新计算每个簇的质心
4. 重复执行2和3,直到质心不再发生变化或者达到最大迭代次数
首先我们需要将手写字体数据集转换为可进行聚类的数据格式。我们可以将每张图片转换为一维数组,每个像素点的灰度值作为数组中的一个特征。代码如下:
```python
import os
import numpy as np
from PIL import Image
def load_data(data_dir):
data = []
labels = []
for label in os.listdir(data_dir):
label_dir = os.path.join(data_dir, label)
for img_name in os.listdir(label_dir):
img_path = os.path.join(label_dir, img_name)
img = Image.open(img_path).convert('L')
img_arr = np.array(img).reshape(-1)
data.append(img_arr)
labels.append(int(label))
return np.array(data), np.array(labels)
```
接下来就可以手动实现Kmeans算法了。代码如下:
```python
class KMeans:
def __init__(self, n_clusters, max_iter=300):
self.n_clusters = n_clusters
self.max_iter = max_iter
def fit(self, X):
n_samples, n_features = X.shape
# 初始化质心
self.centroids = X[np.random.choice(n_samples, self.n_clusters, replace=False)]
for i in range(self.max_iter):
# 分配簇
clusters = [[] for _ in range(self.n_clusters)]
for j, sample in enumerate(X):
distances = np.sum((self.centroids - sample) ** 2, axis=1)
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(j)
# 更新质心
prev_centroids = self.centroids
for k in range(self.n_clusters):
cluster_samples = X[clusters[k]]
self.centroids[k] = np.mean(cluster_samples, axis=0)
if np.all(prev_centroids == self.centroids):
break
# 计算每个样本所属簇的标签
self.labels_ = np.zeros(n_samples)
for j, sample in enumerate(X):
distances = np.sum((self.centroids - sample) ** 2, axis=1)
cluster_idx = np.argmin(distances)
self.labels_[j] = cluster_idx
return self
```
b、调用sklearn中聚类算法
我们可以直接调用sklearn中的KMeans算法。代码如下:
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=10)
kmeans.fit(X)
```
c、对比上述2种Kmeans算法的聚类效果
我们可以使用NMI(Normalized Mutual Information)来评估聚类效果,NMI的值越大,表示聚类效果越好。代码如下:
```python
from sklearn.metrics import normalized_mutual_info_score
kmeans1 = KMeans(n_clusters=10)
labels1 = kmeans1.fit_predict(X)
nmi1 = normalized_mutual_info_score(y, labels1)
kmeans2 = KMeans(n_clusters=10)
labels2 = kmeans2.fit_predict(X)
nmi2 = normalized_mutual_info_score(y, labels2)
print('手动实现Kmeans算法的NMI:', nmi1)
print('sklearn中KMeans算法的NMI:', nmi2)
```
通过比较两种算法的NMI值,可以得出聚类效果的对比结果。
相关推荐
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)