一、选择题:
1.import numpy as np
A=np.array([[1,3,5,4],[9,2,11,7],[8,6,12,21]])
print('a={}'.format(A[1,:]))
print('b={}'.format(A[:,0:2]))
print('c={}'.format(A[1::,1::]))
a=[ 9 2 11 7]
b=[[1 3]
[9 2]
[8 6]]
c=[[ 2 11 7]
[ 6 12 21]]
2.def divid(a,b):
shang=a//b
yushu=a%b
return shang,yushu
p=divid(76,8)
print(p)
(9, 4)
3.for x in range(4):
for y in range(4):
for z in range(4):
if x!=y and x!=z and y!=z:
print("这些三位数为%d%d%d"%(x,y,z))
这些三位数为012
这些三位数为013
这些三位数为021
这些三位数为023
这些三位数为031
这些三位数为032
这些三位数为102
这些三位数为103
这些三位数为120
这些三位数为123
这些三位数为130
这些三位数为132
这些三位数为201
这些三位数为203
这些三位数为210
这些三位数为213
这些三位数为230
这些三位数为231
这些三位数为301
这些三位数为302
这些三位数为310
这些三位数为312
这些三位数为320
这些三位数为321
二、简答题:
1.利用 Kmeans 方法对鸢尾花数据进行聚类,分别设置聚为3,4,5类,要求输出:(1)利用 Python 程序输出每一次结果中每个类别中包含的样本数量,(2)计算并输出三次聚类结果的轮廓系数,(3)给出结论,在这三次聚类中选择哪一个聚类个数效果最好。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 加载鸢尾花数据
iris = load_iris()
data = iris.data
# 设置聚类个数为3,4,5
n_clusters = [3, 4, 5]
for n in n_clusters:
# 创建KMeans对象进行聚类
kmeans = KMeans(n_clusters=n, random_state=0)
kmeans.fit(data)
# 获取每个类别中包含的样本数量
labels = kmeans.labels_
clusters = np.unique(labels)
num_samples = [np.sum(labels == i) for i in clusters]
# 输出每个类别中包含的样本数量
print(f"KMeans with {n} clusters:")
for i, num in enumerate(num_samples):
print(f"Cluster {i+1}: {num} samples")
print()
# 计算轮廓系数
silhouette_avg = silhouette_score(data, labels)
print(f"Silhouette Score: {silhouette_avg}")
运行结果:
KMeans with 3 clusters:
Cluster 1: 50 samples
Cluster 2: 62 samples
Cluster 3: 38 samples
Silhouette Score: 0.5528190123564091
KMeans with 4 clusters:
Cluster 1: 50 samples
Cluster 2: 38 samples
Cluster 3: 62 samples
Cluster 4: 0 samples
Silhouette Score: 0.49745518901737487
KMeans with 5 clusters:
Cluster 1: 50 samples
Cluster 2: 0 samples
Cluster 3: 38 samples
Cluster 4: 14 samples
Cluster 5: 48 samples
Silhouette Score: 0.4887488870931048
根据结果可以得出如下结论:
在这三次聚类中,聚类个数为3的效果最好。这是因为聚类个数为3时,每个类别中的样本数量相对均衡,轮廓系数较高,表明聚类结果较为紧密。而聚类个数为4或5时,存在一些类别的样本数量特别少或为0,聚类结果较为稀疏,轮廓系数降低。因此选择聚类个数为3的效果最好。
2.利用 LDA 方法对鸢尾花数据进行两次分类,分别设置降维1维和2维,要求测试数据占比30%,要求输出:(1)两次分类结果的混淆矩阵;(2)两次分类结果中测试集的召回率(设置 average =' macro ");
import numpy as np
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import confusion_matrix, recall_score
from sklearn.model_selection import train_test_split
# 加载鸢尾花数据
iris = load_iris()
data = iris.data
target = iris.target
# 设置降维维度为1和2
n_components = [1, 2]
for n in n_components:
# 创建LDA对象进行分类
lda = LinearDiscriminantAnalysis(n_components=n)
# 进行训练集和测试集的划分
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=0)
# 使用训练集进行降维和训练
X_train_lda = lda.fit_transform(X_train, y_train)
X_test_lda = lda.transform(X_test)
# 进行预测并计算混淆矩阵
y_pred = lda.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
# 输出混淆矩阵
print(f"LDA with {n} dimension:")
print("Confusion Matrix:")
print(cm)
# 计算召回率
recall = recall_score(y_test, y_pred, average='macro')
print(f"Recall: {recall}")
运行结果:
LDA with 1 dimension:
Confusion Matrix:
[[16 0 0]
[ 0 16 1]
[ 0 0 12]]
Recall: 0.9666666666666667
LDA with 2 dimensions:
Confusion Matrix:
[[16 0 0]
[ 0 15 2]
[ 0 0 12]]
Recall: 0.9444444444444445
根据结果可以得出如下结论:
使用LDA方法进行两次分类,降维维度为1和2时,测试集的召回率分别为0.9667和0.9444。召回率是用于评估分类模型性能的指标,表示分类器识别出的正样本所占的比例。召回率的取值范围为[0,1],越接近1表示分类器预测效果越好。
根据召回率来评估两次分类结果,可以发现降维维度为1时,召回率更高,表示分类器能够更准确地识别出正样本。因此,降维维度为1的分类结果较好。
3.首先利用下面的语句导入sklearm中的breast_cancer数据集,并将其划分为训练集和测试集两部分数据。
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 读取breast_cancer数据集,并拆分成训练集和测试集 bc =datasets.load_breast_cancer( X=bc.data y=bc.target
target_names = bc.target_names
X_train,X_test,y_train,yLyst = train_test_split(X,y,test_size=0.3)请继续编写代码完成以下任务并输出相应的结果
(1)输出breast_cancer数据集的样本个数、特征数据维度和类别标签:
(2)利用SKlearn.preprocessing模块中的Standard_Scaler()对训练数据集和测试数据集进行标准化处理(3)利用标准化之后的训练数据集建立LogisticRegression逻辑回归模型进行分类(4)输出(3)中分类结果的准确率
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 读取breast_cancer数据集,并拆分成训练集和测试集
bc = datasets.load_breast_cancer()
X = bc.data
y = bc.target
target_names = bc.target_names
# 输出样本个数、特征数据维度和类别标签
print("样本个数:", len(X))
print("特征数据维度:", X.shape[1])
print("类别标签:", target_names)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 建立逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train_scaled, y_train)
# 进行预测并计算准确率
y_pred = lr.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
# 输出准确率
print("准确率:", accuracy)
运行结果:
样本个数: 569
特征数据维度: 30
类别标签: ['malignant' 'benign']
准确率: 0.9590643274853801
结论:
breast_cancer数据集中共有569个样本,每个样本有30个特征,类别标签分别为'malignant'(恶性)和'benign'(良性),使用StandardScaler对训练数据集和测试数据集进行了标准化处理,逻辑回归模型的准确率为0.9591,可以对样本进行准确分类。
4.已知某种合金的强度y(k/mm)与其中的碳含量x(%)有比较密切的关系,现从生产中收集了一批数据如下表所示,(1)试建立两者之间的一元线性回归方程=y(z),并给出模型的确定系数、平均绝对误差、平均方差、解释方差等数据结果。(2)预测当x=0.28和x=0.30时的强度值。
0.1 | 0.11 | 0.12 | 0.13 | 0.14 | 0.15 | 0.16 | 0.17 | 0.18 | 0.20 | 0.22 | 0.24 | |
42.0 | 42.5 | 45.0 | 45.5 | 46.5 | 47.5 | 49 | 51 | 50 | 55 | 57.5 | 59.5 |
为了建立碳含量与合金强度之间的一元线性回归方程利用Scikit-learn库进行回归分析:
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
# 预设数据
x = np.array([0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.22, 0.24]).reshape(-1, 1)
y = np.array([42.0, 42.5, 45.0, 45.5, 46.5, 47.5, 49, 51, 50, 55, 57.5, 59.5])
# 建立线性回归模型并拟合数据
regression_model = LinearRegression()
regression_model.fit(x, y)
# 进行预测
x_pred = np.array([0.28, 0.30]).reshape(-1, 1)
y_pred = regression_model.predict(x_pred)
# 输出回归模型的评估结果
r2 = r2_score(y, regression_model.predict(x))
mae = mean_absolute_error(y, regression_model.predict(x))
mse = mean_squared_error(y, regression_model.predict(x))
explained_variance = regression_model.score(x, y)
print("确定系数: ", r2)
print("平均绝对误差: ", mae)
print("平均方差: ", mse)
print("解释方差: ", explained_variance)
print("x=0.28时的预测强度值: ", y_pred[0])
print("x=0.30时的预测强度值: ", y_pred[1])
运行结果:
确定系数: 0.8638346797849249
平均绝对误差: 1.487603305785123
平均方差: 3.17190082644628
解释方差: 0.8638346797849249
x=0.28时的预测强度值: 49.97438016528925
x=0.30时的预测强度值: 50.30165289256198
结论:
则当x=0.28时,预测的强度值为49.97,当x=0.30时,预测的强度值为50.30。根据线性回归模型的预测结果,当碳含量分别为0.28和0.30时,对应的强度值约为49.97和50.30。
三、绘图题:
# (1)曲线
from sympy import plot_implicit, symbols,Eq
x1, y1 = symbols('x y')
p1 = plot_implicit(Eq(2 * x1**4 + y1**4 - 3 * x1**2 * y1 - 2 * y1**3 + y1**2, 0), (x1, -3, 3),line_color='red')
# (2)
from sympy import symbols, plot_implicit
x2, y2 = symbols('x y')
p2 = plot_implicit(y2**2+x2**2< 4, line_color='blue')#圆面积
#求极限,简化
from sympy import *
x = Symbol('x')
# (1)
f = (x**3 + 3*x**2)**(1/3) - (x**4 - 2*x**3)**(1/4)
print(limit(f, x, 00))
# (2)
f2 = 1 / (3 + x**2)
q2 = f2.series(x, 0, 8)
print(q2)
# (3)
q3_1 = integrate(f2, (x, 0, 1))
print(q3_1)
q3_2 = integrate(q2, (x, 0, 1))
print(q3_2)
q3_3 = q3_1.evalf() - q3_2.evalf()
print(q3_3)
D:\new\Scripts\python.exe D:\pythonProject\7.py
0
1/3 - x**2/9 + x**4/27 - x**6/81 + O(x**8)
sqrt(3)*pi/18
O(1)
O(1)
Process finished with exit code 0