网站推广优化开发建设,app定制公司哪个好用,怎么才能注册做网站,公司标志logo设计免费文章目录机械学习机械学习分类1. 监督学习2. 半监督学习3. 无监督学习4. 强化学习机械学习的项目开发步骤scikit-learn1 scikit-learn安装2 sklearn数据集1. sklearn 玩具数据集鸢尾花数据集糖尿病数据集葡萄酒数据集2. sklearn现实世界数据集20 新闻组数据集3. 数据集的划分特…
文章目录机械学习机械学习分类1. 监督学习2. 半监督学习3. 无监督学习4. 强化学习机械学习的项目开发步骤scikit-learn1 scikit-learn安装2 sklearn数据集1. sklearn 玩具数据集鸢尾花数据集糖尿病数据集葡萄酒数据集2. sklearn现实世界数据集20 新闻组数据集3. 数据集的划分特征工程1 DictVectorizer - 字典列表特征提取2 CountVectorizer - 文本特征提取英文文本提取中文文本提取3 TfidfVectorizer TF-IDF - 文本特征词的重要程度特征提取4 无量纲化-预处理1. MaxAbsScaler2. normalize归一化3. StandardScaler特征降维1 特征选择低方差过滤特征选择基于相关系数的特征选择2 主成分分析(PCA)机械学习
机器学习Machine Learning, ML是人工智能AI的核心分支之一其核心思想是让计算机通过对数据的学习自动发现规律、改进性能并用于解决预测、决策、模式识别等问题。与传统编程 “手动编写规则” 不同机器学习通过算法从数据中 “自主学习” 规律实现对未知数据的有效处理。 机器学习的本质是 “从数据中学习”
无需人类显式编写处理规则而是通过算法从大量数据中挖掘潜在模式如特征与结果的关联。随着数据量增加或训练迭代模型性能会逐渐优化“学习” 过程。
机械学习分类
根据数据是否包含 “标签”即是否有明确的输出结果机器学习可分为以下几类
1. 监督学习
特点训练数据包含 “输入特征” 和对应的 “标签输出结果”模型通过学习特征与标签的映射关系实现对新数据的预测。典型任务 分类Classification预测离散标签如 “垃圾邮件 / 正常邮件”“肿瘤良性 / 恶性”。回归Regression预测连续数值如房价、气温、股票价格。 常见算法线性回归、逻辑回归、决策树、随机森林、支持向量机SVM、神经网络等。
2. 半监督学习
特点训练数据中只有少量标签大部分为无标签数据模型结合两种数据进行学习适用于标签获取成本高的场景如医学影像标注。典型应用文本分类少量标注文本 大量未标注文本训练模型。
3. 无监督学习
特点训练数据只有 “输入特征”无标签模型需自主发现数据中的隐藏结构如聚类、分布规律。典型任务 聚类Clustering将相似数据分组如用户分群、商品分类。降维Dimensionality Reduction简化数据维度如将高维图像特征压缩为低维向量便于可视化或计算。异常检测Anomaly Detection识别与多数数据差异显著的样本如信用卡欺诈检测。 常见算法K-Means 聚类、层次聚类、主成分分析PCA、t-SNE降维可视化等。
4. 强化学习
特点模型通过与环境的 “交互” 学习智能体Agent在环境中执行动作根据动作结果获得 “奖励” 或 “惩罚”最终学习出最大化累积奖励的策略。典型任务游戏 AI如 AlphaGo 下棋、机器人控制如自动驾驶避障、资源调度等。常见算法Q-Learning、策略梯度Policy Gradient、深度强化学习如 DQN等。
机械学习的项目开发步骤
1.数据集的收集与获取
确定数据来源从数据库、API、文件或第三方获取数据。数据采集编写脚本或使用工具如 Scrapy、Pandas收集数据。数据标注如果是监督学习需标注训练数据如人工标注图像分类标签。
2.数据预处理
特征工程 特征提取从原始数据中提取有用特征如文本分词、图像特征提取。特征转换标准化 / 归一化数值特征编码分类特征。特征选择筛选对目标变量最有预测力的特征。 数据集划分将数据分为训练集、验证集和测试集
3.模型选择与训练
以模型的形式选择适当的算法和数据表示
清理后的数据分为两部分 - 训练和测试。第一部分训练数据用于开发模型。第二部分测试数据用作参考依据。
4.模型评估与优化
使用验证集评估模型性能选择合适的评估指标
scikit-learn
Scikit-learn简称 sklearn是 Python 中最流行的开源机器学习库之一提供了丰富的工具和算法用于数据预处理、模型选择、训练和评估。
Scikit-learn官网https://scikit-learn.org/stable/#
1 scikit-learn安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn 2 sklearn数据集
1. sklearn 玩具数据集
无需额外下载直接通过 sklearn 导入方便快捷。 鸢尾花数据集
样本数150 条。特征数4 个花萼长度、花萼宽度、花瓣长度、花瓣宽度。
from sklearn.datasets import load_iris
# 加载数据集
iris load_iris()
print(iris)#--字典
print(iris.data)#数据每一朵花的特征值特点数据特征数据
print(iris.feature_names)#特征名称萼片长、萼片宽、花瓣长、花瓣宽
print(iris.target)#每朵花的标签0、1、2
print(iris.target_names)#标签名称山鸢尾、变色鸢尾、维吉尼亚鸢尾
糖尿病数据集
样本数442 条。特征数10 个特征含义 年龄性别体质指数BMI平均血压S1~S6血液中 6 种血清指标 目标变量 一年后糖尿病病情进展的定量测量值数值越大表示病情越严重
from sklearn.datasets import load_diabetes
# 获取数据集
diabetes load_diabetes()
# 查看数据集
# print(diabetes)
#特征值 和 目标值
x,y load_diabetes(return_X_yTrue)
# print(x,y)
print(x.shape,y.shape)#(442, 10) (442,)
print(特征名称:, diabetes.feature_names)
#[age, sex, bmi, bp, s1, s2, s3, s4, s5, s6]葡萄酒数据集
样本数178 个特征数13 个均为连续型数值特征特征含义 酒精含量苹果酸含量灰分灰分碱度镁含量总酚含量黄酮类化合物含量非黄酮类酚含量原花青素含量颜色强度色调稀释葡萄酒的 OD280/OD315 值脯氨酸含量 目标变量 葡萄酒的三个类别class_0 有 59 个样本class_1 有 71 个样本class_2 有 48 个样本
from sklearn.datasets import load_wine
# 获取数据集
wine load_wine()
# 查看数据集
print(wine)
#特征值 和 目标值
x,y load_wine(return_X_yTrue)
# print(x,y)
print(x.shape,y.shape)#(178, 13) (178,)
print(特征名称:, wine.feature_names)
#[alcohol, malic_acid, ash, alcalinity_of_ash, magnesium, total_phenols, flavanoids, nonflavanoid_phenols, proanthocyanins, color_intensity, hue, od280/od315_of_diluted_wines, proline]
print(类别名称:, wine.target_names)
#[class_0 class_1 class_2]2. sklearn现实世界数据集
使用 fetch_* 函数下载更大的现实世界数据集这些数据需要联网获取并存储在本地。 20 新闻组数据集
任务类型文本分类20 个主题。样本数约 20,000 条新闻文章。特征数文本特征需通过 TF-IDF 等方法转换。
from sklearn.datasets import fetch_20newsgroups
from sklearn import datasets
download_file_path datasets.get_data_home()
print(datasets.get_data_home())# 获取20newsgroups数据集
news_data fetch_20newsgroups(data_home../src,subsetall)
print(news_data.data[0])3. 数据集的划分
scikit-learn 中将数据集划分为训练集Training Set和测试集Test Set
**sklearn.model_selection.train_test_split(*arrays**options)
array 这里用于接收1到多个列表、numpy数组、稀疏矩阵或padas中的DataFrame。参数 test_size 值为0.0到1.0的小数表示划分后测试集占的比例random_state 随机种子确保结果可复现。strxxxx 分层划分,填yshuffle是否在划分前打乱数据默认为 True。
最常用的方法随机将数据集划分为训练集和测试集。
from sklearn.model_selection import train_test_split
a[10,20,30,40,50,60,70,80,90,100]
a_train , a_test train_test_split(a)
# print(a_train,a_test)
#[10, 40, 70, 20, 30, 90, 50] [80, 100, 60]a[10,20,30,40,50,60,70,80,90,100]
b[1,2,3,4,5,6,7,8,9,10]
#指定训练集和测试集的比例
# a_train , a_test , b_train , b_test train_test_split(a,b,train_size5)
# 随机种子
a_train , a_test , b_train , b_test train_test_split(a,b,train_size0.8,random_state42)
print(a_train,a_test,b_train,b_test)特征工程 实例化转换器对象转换器类有很多都是Transformer的子类, 常用的子类有: DictVectorizer 字典特征提取
CountVectorizer 文本特征提取
TfidfVectorizer TF-IDF文本特征词的重要程度特征提取
MinMaxScaler 归一化
StandardScaler 标准化
VarianceThreshold 底方差过滤降维
PCA 主成分分析降维转换器对象调用fit_transform()进行转换, 其中fit用于计算数据transform进行最终转换 fit_transform()可以使用fit()和transform()代替 data_new transfer.fit_transform(data)
可写成
transfer.fit(data)
data_new transfer.transform(data)1 DictVectorizer - 字典列表特征提取
将字典格式的数据如 JSON转换为数值特征矩阵特别适合处理混合类型数值 分类的特征。
创建转换器对象: sklearn.feature_extraction.DictVectorizer(sparseTrue) 参数: sparseTrue返回类型为csr_matrix的稀疏矩阵 sparseFalse表示返回的是数组,数组可以调用.toarray()方法将稀疏矩阵转换为数组
转换器对象:
转换器对象调用**fit_transform(data)**函数参数data为一维字典数组或一维字典列表,返回转化后的矩阵或数组
转换器对象get_feature_names_out()方法获取特征名
[示例1] 提取为稀疏矩阵对应的数组
from sklearn.feature_extraction import DictVectorizerdata [{city: 北京,temperature: 100,weather: 晴,wind: 微风,humidity: 80, },{city: 上海,temperature: 80,weather: 阴,wind: 小风,humidity: 60},{city: 广州,temperature: 70,weather: 雨,wind: 强风,humidity: 40}
]
#模型研究x与y的关系前 必须保证xy中全是数字#创建转换器
#spare False 输出结果为矩阵
transfer DictVectorizer(sparse False)
data transfer.fit_transform(data)
print(data)
# 查看转换后数据的特征名称
print(transfer.get_feature_names_out())[[ 0. 1. 0. 80. 100. 1. 0. 0. 0. 0. 1.][ 1. 0. 0. 60. 80. 0. 1. 0. 1. 0. 0.][ 0. 0. 1. 40. 70. 0. 0. 1. 0. 1. 0.]]
[city上海 city北京 city广州 humidity temperature weather晴weather阴 weather雨 wind小风 wind强风 wind微风]
[示例2 ]提取为稀疏矩阵
from sklearn.feature_extraction import DictVectorizerdata [{city: 北京,temperature: 100,weather: 晴,wind: 微风,humidity: 80, },{city: 上海,temperature: 80,weather: 阴,wind: 小风,humidity: 60},{city: 广州,temperature: 70,weather: 雨,wind: 强风,humidity: 40}
]
#模型研究x与y的关系前 必须保证xy中全是数字#创建转换器
#sparse True 返回一个三元组表对象--稀松矩阵
transfer DictVectorizer(sparse True)
data transfer.fit_transform(data)
print(data)
# 查看转换后数据的特征名称
print(transfer.get_feature_names_out())
# 稀松矩阵转换为数组
print(data.toarray())则输出为
Compressed Sparse Row sparse matrix of dtype float64with 15 stored elements and shape (3, 11)Coords Values(0, 1) 1.0(0, 3) 80.0(0, 4) 100.0(0, 5) 1.0(0, 10) 1.0(1, 0) 1.0(1, 3) 60.0(1, 4) 80.0(1, 6) 1.0(1, 8) 1.0(2, 2) 1.0(2, 3) 40.0(2, 4) 70.0(2, 7) 1.0(2, 9) 1.0
[city上海 city北京 city广州 humidity temperature weather晴weather阴 weather雨 wind小风 wind强风 wind微风]
[[ 0. 1. 0. 80. 100. 1. 0. 0. 0. 0. 1.][ 1. 0. 0. 60. 80. 0. 1. 0. 1. 0. 0.][ 0. 0. 1. 40. 70. 0. 0. 1. 0. 1. 0.]]2 CountVectorizer - 文本特征提取
将文本转换为词频矩阵Bag of Words 模型统计每个词在文档中出现的次数。 sklearn.feature_extraction.text.CountVectorizer 构造函数关键字参数stop_words值为list表示词的黑名单(不提取的词)
fit_transform函数的返回值为稀疏矩阵
英文文本提取
from sklearn.feature_extraction.text import CountVectorizer
data[hello my name is naci,my age is 18,my dog name is nacy]
counter CountVectorizer()
# 文本词频转换为矩阵
data counter.fit_transform(data)
print(data.toarray())
print(counter.get_feature_names_out())[[0 0 0 1 1 1 1 0 1][1 1 0 0 1 1 0 0 0][0 0 1 0 1 1 0 1 1]]
[18 age dog hello is my naci nacy name]此矩阵应该竖着看对应所有的词语例如‘18’只在第二个文章出现所以第一列只有第二行为1以此类推
中文文本提取
from sklearn.feature_extraction.text import CountVectorizer
data[今天天气不错, 今天天气不错但有风]
counter CountVectorizer()
# 文本词频转换为矩阵
data counter.fit_transform(data)
print(data.toarray())
print(counter.get_feature_names_out())[[1 0][1 1]]
[今天天气不错 但有风]有结果可知中文没有空格来分割所以以逗号分割一句为一词
若要统计中文词组的词频则需要使用jieba分词然后通过空格连接起来再使用ContVectorizer
import jieba
from sklearn.feature_extraction.text import CountVectorizer
arr jieba.cut(今天天真好)
print(list(arr))def cut_word(words):return .join(jieba.cut(words))
data[今天天真好,我的猫很可爱]
data2 [cut_word(i) for i in data]
print(data2)count CountVectorizer()
# 文本词频转为矩阵
data2 count.fit_transform(data2)
print(data2.toarray())
[今天, 天真, 好]
[今天 天真 好, 我 的 猫 很 可爱]
[[1 0 1][0 1 0]]3 TfidfVectorizer TF-IDF - 文本特征词的重要程度特征提取
将文本转换为 TF-IDF 值矩阵评估词在文档中的重要性稀有词权重更高。
词频TF一个词在文档中出现的频率越高通常对该文档的代表性越强。逆文档频率IDF一个词在所有文档中出现的频率越高即越常见其区分度越低权重也就越低反之稀有词的权重更高。 词频Term Frequency, TF 计算公式 TF(t,d)词 t在文档 d中出现的次数文档 d中的总词数\text{TF}(t,d) \frac{\text{词 }t\text{ 在文档 }d\text{ 中出现的次数}}{\text{文档 }d\text{ 中的总词数}} TF(t,d)文档 d 中的总词数词 t 在文档 d 中出现的次数 部分实现会使用对数变换 TF(t,d)1log(词 t在文档 d中出现的次数)\text{TF}(t,d) 1 \log(\text{词 }t\text{ 在文档 }d\text{ 中出现的次数}) TF(t,d)1log(词 t 在文档 d 中出现的次数) 逆文档频率Inverse Document Frequency, IDF IDF 的计算公式是 IDF(t)log(总文档数包含词t的文档数1)IDF(t)\log(\dfrac{总文档数}{包含词t的文档数1})IDF(t)log(包含词t的文档数1总文档数) 在 TfidfVectorizer 中IDF 的默认计算公式是 IDF(t)log(总文档数1包含词t的文档数1)1IDF(t)\log(\dfrac{总文档数1}{包含词t的文档数1})1IDF(t)log(包含词t的文档数1总文档数1)1 分母中的 1 是平滑处理避免出现除以零的情况。 TF-IDF 值 计算公式 TF-IDF(t,d)TF(t,d)×IDF(t)\text{TF-IDF}(t,d) \text{TF}(t,d) \times \text{IDF}(t) TF-IDF(t,d)TF(t,d)×IDF(t) sklearn.feature_extraction.text.TfidfVectorizer() 构造函数关键字参数stop_words表示词特征黑名单
fit_transform函数的返回值为稀疏矩阵
import jieba
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizerdef cut_word(words):return .join(jieba.cut(words))data [教育学会会长期间坚定支持民办教育事业,热忱关心、扶持民办学校发展,事业做出重大贡献]
data2 [cut_word(i) for i in data]
print(data2)transfer TfidfVectorizer()
datatransfer.fit_transform(data2)
print(data.toarray())
print(transfer.get_feature_names_out())
[教育 学会 会长 期间 坚定 支持 民办教育 事业 , 热忱 关心 、 扶持 民办学校 发展, 事业 做出 重大贡献 ]
[[0.27626457 0.36325471 0. 0. 0. 0.363254710.36325471 0. 0.36325471 0.36325471 0.36325471 0.0.36325471 0. 0. ][0. 0. 0. 0.4472136 0.4472136 0.0. 0.4472136 0. 0. 0. 0.44721360. 0.4472136 0. ][0.4736296 0. 0.62276601 0. 0. 0.0. 0. 0. 0. 0. 0.0. 0. 0.62276601]]
[事业 会长 做出 关心 发展 坚定 学会 扶持 支持 教育 期间 民办学校 民办教育 热忱重大贡献]# 手动实现tfidf向量
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from sklearn.preprocessing import normalize
def myTfidfVectorizer(data):# 提取词频tansfer CountVectorizer()data tansfer.fit_transform(data)TF data.toarray()#词频矩阵IDF np.log((len(TF)1)/(1np.sum(TF!0,axis0))1)TF!0 求出布尔矩阵sum(TF!0,axis0) 求出每列非零元素个数--包含该词的文档数len(TF) 矩阵的行数--文档数tf_idf TF*IDF #TF-IDF矩阵#对 TF-IDF 矩阵进行 L2 范数归一化处理tf_idf normalize(tf_idf,norml2)return tf_idfdef cut_word(words):return .join(jieba.cut(words))data [教育学会会长期间坚定支持民办教育事业,热忱关心、扶持民办学校发展,事业做出重大贡献]
data2 [cut_word(i) for i in data]
res myTfidfVectorizer(data2)
print(res)4 无量纲化-预处理
无量纲化Normalization/Standardization 是数据预处理的关键步骤用于消除不同特征间量纲和尺度差异的影响确保模型能够公平地对待每个特征。
1. MaxAbsScaler
将特征缩放到 [-1,1] 范围适合稀疏数据
对于每个特征x: 若要缩放到其他区间可以使用公式xx*(max-min)min; sklearn.preprocessing.MinMaxScaler(feature_range) 参数:feature_range(0,1) 归一化后的值域,可以自己设定
fit_transform函数归一化的原始数据类型可以是list、DataFrame和ndarray, 不可以是稀疏矩阵
fit_transform函数的返回值为ndarray
缺点最大值和最小值容易受到异常点影响所以鲁棒性较差
from sklearn.preprocessing import MinMaxScaler
data[[1,2,3],[4,5,6],[7,8,9]]
transfer MinMaxScaler()
data_new transfer.fit_transform(data)
print(data_new)[[0. 0. 0. ][0.5 0.5 0.5][1. 1. 1. ]]若要指定范围则设定feature_range
from sklearn.preprocessing import MinMaxScaler
data[[1,2,3],[4,5,6],[7,8,9]]
transfer MinMaxScaler(feature_range(-10,10))
data_new transfer.fit_transform(data)
print(data_new)[[-10. -10. -10.][ 0. 0. 0.][ 10. 10. 10.]]2. normalize归一化
归一化通过缩放每个样本向量使其具有单位范数。
1 L1归一化
绝对值相加作为分母,特征值作为分子
公式 ∥x∥1∑i1n∣xi∣\|x\|_1 \sum_{i1}^n |x_i| ∥x∥1i1∑n∣xi∣
2 L2归一化
平方相加作为分母,特征值作为分子
公式 ∥x∥2∑i1nxi2\|x\|_2 \sqrt{\sum_{i1}^n x_i^2} ∥x∥2i1∑nxi2 3 max归一化
max作为分母,特征值作为分子 sklearn.preprocessing.normalize X输入的特征矩阵二维数组。norm范数类型可选l1、l2或max按最大值缩放。axis指定归一化的方向axis0表示按列归一化axis1默认表示按行归一化。
from sklearn.preprocessing import MinMaxScaler, normalize
from sklearn.datasets import load_iris
x,y load_iris(return_X_yTrue)
#axis1 按列进行归一化
x normalize(x,norm l2,axis1)
print(x)3. StandardScaler
其核心原理是通过减去均值并除以标准差将特征转换为均值为 0、方差为 1 的标准正态分布。这有助于消除不同特征间的量纲差异尤其适用于依赖正态分布假设或梯度优化的算法。 z是转换后的数值x是原始数据的值μ是该特征的均值σ是该特征的 标准差 sklearn.preprocessing.StandardScale from sklearn.preprocessing import StandardScaler
data[[1,2,3,5],[4,5,6,8],[7,8,9,11]]transfer StandardScaler()
data_new transfer.fit_transform(data)
print(data_new)
print(transfer.mean_)# 均值
print(transfer.var_)# 方差[[-1.22474487 -1.22474487 -1.22474487 -1.22474487][ 0. 0. 0. 0. ][ 1.22474487 1.22474487 1.22474487 1.22474487]]
[4. 5. 6. 8.]
[6. 6. 6. 6.]特征降维
特征降维是指通过减少数据集的特征数量同时保留关键信息的过程。高维数据特征过多会导致计算复杂度增加、过拟合风险提高以及所谓的 “维度灾难”。降维可以减少数据集维度同时尽可能保留数据的重要性。
降维可以
减少计算开销降低过拟合风险可视化数据降到 2D 或 3D去除噪声和冗余信息
特征降维技术主要分为两类特征选择和特征提取。
1 特征选择
特征选择是指直接从原始特征中选择有用的特征而不该特征本身
低方差过滤特征选择
如果一个特征的方差很小说明该特征的取值几乎没有变化提供的信息量有限可能对模型贡献不大可考虑删除。
方差计算公式为 Var(X)1n∑i1n(xi−xˉ)2\text{Var}(X) \frac{1}{n} \sum_{i1}^{n} (x_i - \bar{x})^2 Var(X)n1i1∑n(xi−xˉ)2 如果一个特征的方差很小说明这个特征的值在样本中几乎相同或者变化不大包含的信息很少那这个特征就可以去除 sklearn.feature_selection.VarianceThreshold(threshold2.0) 设定阈值threshold任何低于阈值的特征都将被视为低方差特征过滤移除所有低方差特征
from sklearn.feature_selection import VarianceThreshold
data [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]
# 创建方差阈值选择器
transfer VarianceThreshold(threshold0.5)
data transfer.fit_transform(data)
print(data)[[0][4][1]]【处理鸢尾花数据集】
from sklearn.datasets import load_iris
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import train_test_splitx,y load_iris(return_X_yTrue)
x_train,x_test,y_train,y_test train_test_split(x,y,test_size0.2,random_state22)
# 创建转换器
transfer VarianceThreshold(threshold0.8)
x_train transfer.fit_transform(x_train)
x_test transfer.transform(x_test)
print(x_train)[[1.6][1.5][4. ][4.4]...[4.5][5.9][6. ][1.9][5.6][6.7]]基于相关系数的特征选择
相关性指两个或多个变量之间存在的关联关系—— 当一个变量的取值发生变化时另一个变量的取值也倾向于以某种规律变化。。这种变化不一定是直接引起的可以间接或者偶然。
相关性不意味着因果关系“相关非因果”例如 “冰淇淋销量” 和 “溺水事故” 正相关但并非因果而是共同受 “气温” 影响。相关性有方向和强度 方向正相关一个变量增大另一个也增大如 “身高” 与 “体重”、负相关一个变量增大另一个减小如 “商品价格” 与 “销量”。强度从 “弱相关” 到 “强相关”可用数值量化如相关系数。
皮尔逊相关系数Pearson Correlation Coefficient
衡量线性相关性的指标取值范围为[-1, 1]
ρ 1完全正线性相关ρ -1完全负线性相关ρ 0无线性相关但可能存在非线性相关。
对于两组数据 {1,2,…,} 和 {1,2,…,}皮尔逊相关系数可以用以下公式计算
ρCos(x,y)Dx⋅DyE[(x−Ex)(y−Ey)]Dx⋅Dy∑i1n(x−x~)(y−yˉ)/(n−1)∑i1n(x−xˉ)2/(n−1)⋅∑i1n(y−yˉ)2/(n−1)\rho\frac{\operatorname{Cos}(x, y)}{\sqrt{D x} \cdot \sqrt{D y}}\frac{E[(x_-E x)(y-E y)]}{\sqrt{D x} \cdot \sqrt{D y}}\frac{\sum_{i1}^{n}(x-\tilde{x})(y-\bar{y}) /(n-1)}{\sqrt{\sum_{i1}^{n}(x-\bar{x})^{2} /(n-1)} \cdot \sqrt{\sum_{i1}^{n}(y-\bar{y})^{2} /(n-1)}}ρDx⋅DyCos(x,y)Dx⋅DyE[(x−Ex)(y−Ey)]∑i1n(x−xˉ)2/(n−1)⋅∑i1n(y−yˉ)2/(n−1)∑i1n(x−x~)(y−yˉ)/(n−1)
|ρ|0.4为低度相关; 0.4|ρ|0.7为显著相关 0.7|ρ|1为高度相关
from scipy.stats import pearsonr
r1 pearsonr(x,y)from scipy.stats import pearsonr
x[5,6,7,2,1,5,12,9,0,4]
y[2,4,5,4,5,8,9,0,1,3]
p pearsonr(x,y)
print(p)PearsonRResult(statisticnp.float64(0.3504442861308587), pvaluenp.float64(0.32081529829352373))2 主成分分析(PCA)
PCA的核心目标是从原始特征空间中找到一个新的坐标系统使得数据在新坐标轴上的投影能够最大程度地保留数据的方差同时减少数据的维度。 中心化数据每个特征减去其均值计算协方差矩阵衡量特征间的相关性特征值分解计算协方差矩阵的特征值和特征向量选择主成分根据主成分的方差等确定最终保留的主成分个数 方差大的要留下若一个特征的多个样本的值都相同则方差为0说明该特征值不能区分样本投影数据将原始数据投影到选定的特征向量上 from sklearn.decomposition import PCA PCA(n_componentsNone) 主成分分析n_components: 实参为小数时表示降维后保留百分之多少的信息实参为整数时表示减少到多少特征
from sklearn.decomposition import PCA
import numpy as np
data np.array([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
pca PCA(n_components2)
data_new pca.fit_transform(data)
print(data_new)[[-1.28620952e-15 3.82970843e00][-5.74456265e00 -1.91485422e00][ 5.74456265e00 -1.91485422e00]]from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
iris load_iris()
xiris.data
yiris.target
x_train,x_test,y_train,y_test train_test_split(x,y,test_size0.2,random_state22)
transfer PCA(n_components2)
x_train transfer.fit_transform(x_train)
#训练模型
#用模型预测
x_test transfer.transform(x_test)
print(x_test)[[-2.36170948 0.64237919][ 2.05485818 0.16275091][ 1.23887735 0.10868042]...[ 0.3864534 -0.37888638][ 1.57303541 -0.53629936][-2.73553694 -0.15148737][ 2.53493848 0.51260491][ 1.91514709 0.1205521 ][ 2.42377809 0.38254852][ 1.41198549 -0.14338675]]