第七章 Pandas与scikit-learn实现数据的分析
本章将带你进入数据分析的奇妙世界 🌍!我们将学习如何使用 Python 中两个超级强大的工具:Pandas 和 scikit-learn,来实现各种数据分析任务。
注记
内容概要:
我们将深入探讨这些技术背后的奥秘,并通过有趣的案例来演示它们的神奇应用!
在开始我们的探险之前,让我们先来认识一些重要的伙伴:
Pandas: Python 数据分析的瑞士军刀🇨🇭!它提供了 DataFrame 数据结构,让我们可以像操作 Excel 表格一样轻松处理数据。
scikit-learn: 机器学习的百宝箱🧰!它提供了各种分类、回归、聚类算法,以及模型评估、选择等工具。
分类 (Classification): 将数据划分到不同的类别中。
回归 (Regression): 预测一个连续值。
聚类 (Clustering): 将相似的数据点分组到一起。
分类方法就像一个智能分类器,能够将不同类型的数据区分开来。让我们来看看有哪些神奇的分类器吧!
sklearn.linear_model.LogisticRegression
Sigmoid 函数,也称为逻辑函数,是一个 S 形曲线,其数学表达式为:
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]
其中:
Sigmoid函数的图像如下:
Logistic回归solver选择
Case | Solver |
---|---|
L1 正则 | “liblinear”, “saga” |
多项式损失 (multinomial loss) | “lbfgs”, “sag”, “saga”, “newton-cg” |
大数据集 (n_samples) | “sag”, “saga” |
liblinear
:
liblinear
是一个不错的选择。lbfgs
, sag
和 newton-cg
:
lbfgs
是一种拟牛顿法(Quasi-Newton method),适用于中小型数据集。newton-cg
是一种牛顿法(Newton’s method),需要计算海森矩阵(Hessian matrix),适用于特征维度较少的数据集。sag
(Stochastic Average Gradient) 是一种随机平均梯度下降算法,适用于大型数据集。multi_class
设为 “multinomial” 即为真正的分类,其预测比 liblinear 更为准确。sag
:
saga
:
sag
的变体,它支持非平滑的 L1 正则选项 penalty="l1"
。saga
也适用于大型数据集。import numpy as np
from sklearn import linear_model, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 LogisticRegression 对象,并设置 solver 为 'liblinear'
log_reg = linear_model.LogisticRegression(solver='liblinear')
# 使用 fit 方法训练模型
log_reg.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(log_reg.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
# 预测概率
print(log_reg.predict_proba([[5.1, 3.5, 1.4, 0.2]])) # 第一个类别的概率最高
[0]
[[8.78030305e-01 1.21958900e-01 1.07949250e-05]]
numpy
用于数值计算。sklearn
中的 linear_model
用于逻辑回归。datasets
用于加载示例数据集。iris
数据集:这是一个常用的数据集,包含了三种不同类型的鸢尾花(Setosa, Versicolour, Virginica)的萼片和花瓣的长度和宽度。sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | species | |
---|---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0.0 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0.0 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0.0 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0.0 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0.0 | setosa |
X
(萼片和花瓣的长度和宽度) 和目标 Y
(鸢尾花的种类)。LogisticRegression
对象,并设置 solver
参数为 'liblinear'
。fit
方法训练模型。predict
方法对新的数据点 [5.1, 3.5, 1.4, 0.2]
进行预测。predict_proba
方法返回的是一个数组,数组中的每一个数字分别代表属于每一个类别的概率。sklearn.svm.SVC()
:C-支持向量分类。sklearn.svm.NuSVC()
:Nu-支持向量分类。sklearn.svm.LinearSVC()
:线性支持向量分类。SVC
与 NuSVC
比较接近,两者参数略有不同。SVC
使用参数 C
来控制正则化强度,而 NuSVC
使用参数 nu
来控制支持向量的数量。LinearSVC
仅支持线性核函数的分类,速度更快,适用于大规模数据集。import numpy as np
from sklearn import svm, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 SVC 对象,并设置 kernel 为 'rbf' (径向基核函数)
clf1 = svm.SVC(kernel='rbf')
# 创建 NuSVC 对象
clf2 = svm.NuSVC()
# 创建 LinearSVC 对象
clf3 = svm.LinearSVC(max_iter=10000)
# 使用 fit 方法训练模型
clf1.fit(X, Y)
clf2.fit(X, Y)
clf3.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(clf1.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
print(clf2.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
print(clf3.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
[0]
[0]
[0]
support_vectors_
: 全部支持向量support_
: 支持向量在原始数据集中的索引n_support
: 各类别的支持向量的数量 (LinearSVC 不支持)sklearn.neighbors.KNeighborsClassifier()
:K-近邻分类器。sklearn.neighbors.RadiusNeighborsClassifier()
:半径近邻分类器。KNeighborsClassifier
: 基于每个查询点的 k 个最近邻实现。对于一个新的数据点,找到离它最近的 k 个训练数据点,然后根据这 k 个点的类别进行投票,票数最多的类别就是新数据点的预测类别。
RadiusNeighborsClassifier
: 基于每个查询点的固定半径 r 内的邻居数量实现。对于一个新的数据点,找到所有离它距离小于等于 r 的训练数据点,然后根据这些点的类别进行投票,票数最多的类别就是新数据点的预测类别。
n_neighbors
与 radius
参数:设置 k、r 值weights
参数:对近邻进行加权。不同的权重策略会影响预测结果。
uniform
: 各个“邻居”权重相等。每个邻居对预测结果的贡献相同。distance
: 按照距离给各个“邻居”权重,较近点产生的影响更大。距离越近的邻居对预测结果的贡献越大。algorithm
参数:指定查找最近邻算法。不同的算法适用于不同的数据规模和维度。
ball_tree
: 使用球树 (Ball Tree) 数据结构,适用于高维数据。kd_tree
: 使用 KD 树 (K-D Tree) 数据结构,适用于低维数据。brute
: 使用暴力搜索 (Brute-Force Search),对每个查询点都计算与所有训练数据点的距离,适用于小规模数据集。auto
: 自动选择最合适的算法。import numpy as np
from sklearn import neighbors, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 KNeighborsClassifier 对象,并设置 n_neighbors 为 5
kclf = neighbors.KNeighborsClassifier(n_neighbors=5)
# 创建 RadiusNeighborsClassifier 对象,并设置 radius 为 1.0
rclf = neighbors.RadiusNeighborsClassifier(radius=1.0)
# 使用 fit 方法训练模型
kclf.fit(X, Y)
rclf.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(kclf.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
print(rclf.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
[0]
[0]
实现:
sklearn.tree.DecisionTreeClassifier()
概念解释:
import numpy as np
from sklearn import tree, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 DecisionTreeClassifier 对象
clf = tree.DecisionTreeClassifier()
# 使用 fit 方法训练模型
clf.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(clf.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
[0]
实现:
sklearn.linear_model.SGDClassifier()
支持:
概念解释:
loss
参数:设置损失函数
hinge
(默认):soft-margin SVM,适用于线性 SVM 分类器。modified_huber
:平滑的 hinge 损失,对噪声更鲁棒。log
:logistic 回归,适用于概率分类。hinge
、modified_huber
是惰性的,能够提高训练效率class_weight
参数:设置分类权重,用于处理类别不平衡问题。
import numpy as np
from sklearn import linear_model, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 SGDClassifier 对象,并设置 loss 为 'log_loss' (logistic 回归)
clf = linear_model.SGDClassifier(loss='log_loss', max_iter=1000, tol=1e-3)
# 使用 fit 方法训练模型
clf.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(clf.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
[0]
提示
使用时,需要预先打乱训练数据或在声明时将 “shuffle” 参数设置为 “True” (默认即为 “True”) 以在每次迭代后打乱数据
sklearn.gaussian_process.GaussianProcessClassifier()
ovr
(默认): 每个类都训练一个二元高斯过程分类器,将该类与其余类分开ovo
: 每两个类训练一个二元高斯过程分类器,将两个类分开import numpy as np
from sklearn import gaussian_process, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 GaussianProcessClassifier 对象
clf = gaussian_process.GaussianProcessClassifier()
# 使用 fit 方法训练模型
clf.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(clf.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
[0]
sklearn.neural_network.MLPClassifier()
MLPClassifier
只支持交叉熵损失函数,通过运行 predict_proba
方法进行概率估计hidden_layer_sizes
参数声明中间层的单元数
hidden_layer_sizes=(100,)
表示只有一个隐藏层且这个隐藏层有100个神经元。hidden_layer_sizes=(50, 50)
表示有两个隐藏层,每个隐藏层有50个神经元。import numpy as np
from sklearn import neural_network, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 MLPClassifier 对象,并设置隐藏层为 (100,),即一个包含 100 个神经元的隐藏层
clf = neural_network.MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000)
# 使用 fit 方法训练模型
clf.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(clf.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
# 使用 predict_proba 方法进行概率估计
print(clf.predict_proba([[5.1, 3.5, 1.4, 0.2]]))
[0]
[[9.98921958e-01 1.07804203e-03 6.25487715e-14]]
sklearn.naive_bayes.GaussianNB()
:高斯朴素贝叶斯,假设特征服从高斯分布。sklearn.naive_bayes.MultinomialNB()
:多项式朴素贝叶斯,适用于多项式分布的数据,如文本数据 (单词计数)。sklearn.naive_bayes.BernoulliNB()
:伯努利朴素贝叶斯,适用于二元分布的数据 (特征是二值的)。partial_fit
方法用于动态的加载数据以解决大数据量的问题partial_fit
方法需要传递一个所有期望的类标签的列表import numpy as np
from sklearn import naive_bayes, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 创建 GaussianNB 对象
gnb = naive_bayes.GaussianNB()
# 创建 MultinomialNB 对象
mnb = naive_bayes.MultinomialNB()
# 创建 BernoulliNB 对象
bnb = naive_bayes.BernoulliNB()
# 使用 fit 方法训练模型
gnb.fit(X, Y)
mnb.fit(X, Y)
bnb.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(gnb.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
print(mnb.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
print(bnb.predict([[5.1, 3.5, 1.4, 0.2]])) # 预测结果为类别 0 (Setosa)
[0]
[0]
[0]
回归方法用于预测连续值,就像一个水晶球🔮,可以帮助我们预测未来!
实现:
sklearn.linear_model.LinearRegression()
概念解释:
import numpy as np
from sklearn import linear_model, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 LinearRegression 对象
reg = linear_model.LinearRegression()
# 使用 fit 方法训练模型
reg.fit(X, Y)
# 查看模型系数 (coef_) 和截距 (intercept_)
print(reg.coef_)
print(reg.intercept_)
[ -10.0098663 -239.81564367 519.84592005 324.3846455 -792.17563855
476.73902101 101.04326794 177.06323767 751.27369956 67.62669218]
152.13348416289597
实现:
sklearn.linear_model.Ridge()
优化方案: solver
参数指定
auto
、svd
、cholesky
、lsqr
、sparse_cg
、sag
或 saga
,默认为 auto
概念解释:
import numpy as np
from sklearn import linear_model, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 Ridge 对象,并设置 alpha 参数 (正则化强度)
rid = linear_model.Ridge(alpha=1.0)
# 使用 fit 方法训练模型
rid.fit(X, Y)
# 查看模型系数
print(rid.coef_)
[ 29.46611189 -83.15427636 306.35268015 201.62773437 5.90961437
-29.51549508 -152.04028006 117.3117316 262.94429001 111.87895644]
实现:
sklearn.linear_model.Lasso()
概念解释:
import numpy as np
from sklearn import linear_model, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 Lasso 对象,并设置 alpha 参数 (正则化强度)
las = linear_model.Lasso(alpha=1.0)
# 使用 fit 方法训练模型
las.fit(X, Y)
# 查看模型系数
print(las.coef_)
[ 0. -0. 367.70385976 6.29885756 0.
0. -0. 0. 307.6054181 0. ]
实现:
sklearn.linear_model.LassoLars()
概念解释:
import numpy as np
from sklearn import linear_model, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 LassoLars 对象,并设置 alpha 参数 (正则化强度)
larlas = linear_model.LassoLars(alpha=1.0)
# 使用 fit 方法训练模型
larlas.fit(X, Y)
# 查看模型系数
print(larlas.coef_)
[ 0. 0. 367.70162582 6.30970264 0.
0. 0. 0. 307.60214746 0. ]
实现:
sklearn.linear_model.BayesianRidge()
概念解释:
import numpy as np
from sklearn import linear_model, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 BayesianRidge 对象
byr = linear_model.BayesianRidge()
# 使用 fit 方法训练模型
byr.fit(X, Y)
# 查看模型系数
print(byr.coef_)
[ -4.23356256 -226.32799122 513.47304015 314.90385885 -182.28434068
-4.36854822 -159.20103916 114.63541259 506.82345986 76.25617559]
sklearn.tree.DecisionTreeRegressor()
import numpy as np
from sklearn import tree, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 DecisionTreeRegressor 对象
reg = tree.DecisionTreeRegressor()
# 使用 fit 方法训练模型
reg.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(reg.predict([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]))
[306.]
实现:
sklearn.gaussian_process.GaussianProcessRegressor()
概念解释:
import numpy as np
from sklearn import gaussian_process, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 GaussianProcessRegressor 对象
gpr = gaussian_process.GaussianProcessRegressor()
# 使用 fit 方法训练模型
gpr.fit(X, Y)
# 使用 predict 方法对新的数据点进行预测
print(gpr.predict([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]))
[-6.55954358e-53]
sklearn.neighbors.KNeighborsRegressor()
:K-近邻回归器。sklearn.neighbors.RadiusNeighborsRegressor()
:半径近邻回归器。n_neighbors
: 设置 k 值 (KNeighborsRegressor)。radius
: 设置 r 值 (RadiusNeighborsRegressor)。weights
: 对近邻进行加权,
uniform
:所有邻居权重相同。distance
:权重与距离成反比。KNeighborsRegressor
:使用 k 个最近邻的目标变量值的平均值 (或加权平均值) 作为预测值。RadiusNeighborsRegressor
:使用半径 r 内所有邻居的目标变量值的平均值 (或加权平均值) 作为预测值。import numpy as np
from sklearn import neighbors, datasets
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
Y = diabetes.target
# 创建 KNeighborsRegressor 对象,并设置 n_neighbors 为 5
kreg = neighbors.KNeighborsRegressor(n_neighbors=5)
# 创建 RadiusNeighborsRegressor 对象,并设置 radius 为 50.0
rreg = neighbors.RadiusNeighborsRegressor(radius=50.0)
# 使用 fit 方法训练模型
kreg.fit(X, Y)
rreg.fit(X, Y)
# 预测
print(kreg.predict([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]))
print(rreg.predict([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]))
# 可以查看邻居关系图
# print(kreg.kneighbors_graph(X).toarray())
# print(rreg.radius_neighbors_graph(X).toarray())
[209.4]
[152.13348416]
聚类方法用于将相似的数据点分组到一起,就像一个聪明的组织者🧑🤝🧑,把相似的东西聚集起来!
实现:
sklearn.cluster.KMeans()
:K-means 聚类。sklearn.cluster.MiniBatchKMeans()
:Mini-Batch K-means 聚类,适用于大规模数据集。参数
init
: 指定聚类质心的初始化方法
k-means++
(默认): 使用一种比较智能的方法初始化,各个初始化质心彼此相距较远,能加快收敛速度。这是最常用的初始化方法。random
: 随机选择数据点作为初始质心。n_init
参数: 算法将初始化 “n_init” 次,并选择结果最好的一次作为最终结果 (默认为 10 次)。多次初始化可以避免陷入局部最优解。概念解释:
n_clusters
指定聚类的个数,如不指定则默认为 8n_jobs
指定使用的处理器个数import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 KMeans 对象,并设置 n_clusters 为 3 (因为鸢尾花数据集有 3 个类别)
kms = cluster.KMeans(n_clusters=3, n_init = 'auto')
# 创建 MiniBatchKMeans 对象
mbk = cluster.MiniBatchKMeans(n_clusters=3, n_init = 'auto')
# 使用 fit 方法训练模型
kms.fit(X)
mbk.fit(X)
# 查看聚类中心 (cluster_centers_) 和每个数据点所属的簇 (labels_)
print(kms.cluster_centers_)
print(kms.labels_)
# print(mbk.cluster_centers_)
# print(mbk.labels_)
[[6.85384615 3.07692308 5.71538462 2.05384615]
[5.006 3.428 1.462 0.246 ]
[5.88360656 2.74098361 4.38852459 1.43442623]]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 0 0 0 0 2 0 0 0 0
0 0 2 2 0 0 0 0 2 0 2 0 2 0 0 2 2 0 0 0 0 0 2 0 0 0 0 2 0 0 0 2 0 0 0 2 0
0 2]
实现:
sklearn.cluster.AffinityPropagation()
概念解释:
affinity
: 相似度度量方式
precomputed
:使用预先计算好的相似度矩阵。euclidean
(默认):使用欧几里得距离。damping
: 阻尼因子,
preference
: 偏好,值越高的点越可能被选为样本
vector
import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 AffinityPropagation 对象
ap = cluster.AffinityPropagation()
# 使用 fit 方法训练模型
ap.fit(X)
# 查看聚类中心 (cluster_centers_) 和每个数据点所属的簇 (labels_)
print(ap.cluster_centers_)
print(ap.labels_)
[[4.7 3.2 1.3 0.2]
[5.3 3.7 1.5 0.2]
[6.5 2.8 4.6 1.5]
[5.6 2.5 3.9 1.1]
[6. 2.7 5.1 1.6]
[7.6 3. 6.6 2.1]
[6.8 3. 5.5 2.1]]
[1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1
1 0 1 1 0 0 1 1 0 1 0 1 0 2 2 2 3 2 3 2 3 2 3 3 2 3 2 3 2 4 3 2 3 4 3 4 2
2 2 2 2 2 3 3 3 3 4 3 2 2 2 3 3 3 2 3 3 3 3 3 2 3 3 6 4 6 6 6 5 3 5 6 5 6
4 6 4 4 6 6 5 5 4 6 4 5 4 6 6 4 4 6 6 5 5 6 4 4 5 6 6 4 6 6 6 4 6 6 6 4 6
6 4]
sklearn.cluster.MeanShift()
bandwidth
:
sklearn.cluster.estimate_bandwidth
函数import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 MeanShift 对象
ms = cluster.MeanShift()
# 使用 fit 方法训练模型
ms.fit(X)
# 查看聚类中心 (cluster_centers_) 和每个数据点所属的簇 (labels_)
print(ms.cluster_centers_)
print(ms.labels_)
[[6.21142857 2.89285714 4.85285714 1.67285714]
[5.01632653 3.45102041 1.46530612 0.24489796]]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0]
sklearn.cluster.SpectralClustering()
import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 SpectralClustering 对象
sc = cluster.SpectralClustering(n_clusters=3) # 移除 n_init 参数
# 使用 fit 方法训练模型
sc.fit(X)
# 查看每个数据点所属的簇 (labels_)
print(sc.labels_)
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2
2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 0 2 2 2 0 2 2 2 0 2 2 2 0 2
2 0]
sklearn.cluster.AgglomerativeClustering()
import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 AgglomerativeClustering 对象,并设置 n_clusters 为 3
ag = cluster.AgglomerativeClustering(n_clusters=3)
# 使用 fit 方法训练模型
ag.fit(X)
# 查看每个数据点所属的簇 (labels_)
print(ag.labels_)
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2
2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 0 2 2 2 0 2 2 2 0 2 2 2 0 2
2 0]
sklearn.cluster.DBSCAN()
import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 DBSCAN 对象,并设置 eps (邻域半径) 和 min_samples (最小邻居数)
db = cluster.DBSCAN(eps=0.5, min_samples=5)
# 使用 fit 方法训练模型
db.fit(X)
# 查看每个数据点所属的簇 (labels_),-1 表示噪声点
print(db.labels_)
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 -1 1 1 -1 1 1 1 1 1 1 1 -1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1
1 1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1 1 -1 -1 1
1 1 -1 1 1 1 1 1 1 1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1 1
1 1 1 1 1 1]
实现:
sklearn.cluster.Birch()
概念解释:
import numpy as np
from sklearn import cluster, datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
# 创建 Birch 对象,并设置 n_clusters 为 3
bir = cluster.Birch(n_clusters=3)
# 使用 fit 方法训练模型
bir.fit(X)
# 查看每个数据点所属的簇 (labels_)
print(bir.labels_)
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0
0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0]
邱飞 💌 [email protected]