我已经下载了经典的iris.csv文件(https://gist.github.com/netj/8836201),并尝试在不使用sci套件datasets.load_iris()功能的情况下进行k近距操作。
我想用自己的CSV替换datasets.load_iris()
,以便对其进行修改并在以后与我自己的数据一起使用。
对于此代码,我得到此错误:
ValueError: n_samples=1 should be >= n_clusters=8
代码:
print(__doc__)
%matplotlib notebook
from pandas import read_csv
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from sklearn import datasets
np.random.seed(5)
iris = read_csv('iris.csv')
iris = iris.values
X = iris[:,3] # features
y = iris[:,4] # target
estimators = [('k_means_iris_8', KMeans(n_clusters=8)),
('k_means_iris_3', KMeans(n_clusters=3)),
('k_means_iris_bad_init', KMeans(n_clusters=3, n_init=1,
init='random'))]
fignum = 1
titles = ['8 clusters', '3 clusters', '3 clusters, bad initialization']
for name, est in estimators:
fig = plt.figure(fignum, figsize=(4, 3))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
est.fit(X)
labels = est.labels_
ax.scatter(X[:, 3], X[:, 0], X[:, 2],
c=labels.astype(np.float), edgecolor='k')
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
ax.set_title(titles[fignum - 1])
ax.dist = 12
fignum = fignum + 1
fig = plt.figure(fignum, figsize=(4, 3))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
for name, label in [('Setosa', 0),
('Versicolour', 1),
('Virginica', 2)]:
ax.text3D(X[y == label, 3].mean(),
X[y == label, 0].mean(),
X[y == label, 2].mean() + 2, name,
horizontalalignment='center',
bbox=dict(alpha=.2, edgecolor='w', facecolor='w'))
y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor='k')
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
ax.set_title('Ground Truth')
ax.dist = 12
fig.show(
答案 0 :(得分:1)
您还应该对标签进行编码,否则将无法正常工作。我也下载了它,仅更改以下代码即可让我完美运行。 (除了在代码末尾缺少缺少的结尾')',但我认为这是复制粘贴错误)
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
np.random.seed(5)
iris = read_csv('iris.csv')
iris = iris.values
X = iris[:,:4] # features
y = le.fit_transform(iris[:,4]) # target
答案 1 :(得分:0)
执行此操作时:
X = iris[:,3]
然后X仅是一列(第4个特征petal.width
),这就是为什么您在est.fit()
部分出现错误的原因,因为估计量认为您只有一个样本(我假设您使用的是scikit-learn的较旧版本。较新的版本会在此引发另一个更清晰的错误
将其更正为:
X = iris[:,:4]
使用所有功能。
您为什么要y = np.choose(y, [1, 2, 0]).astype(np.float)
?